javascript类型系统——字符串String类型

前方的话

  javascript没有代表单个字符的字符型,只有字符串String类型,字符型相当于仅包含一个字符的字符串

  字符串String是javascript基本数据类型,同时javascript也扶助String对象,它是一个原始值的卷入对象。在急需时,javascript会自动在原有情势和对象格局之间转换。本文将介绍字符串String原始类型及String包装对象

 

定义

  字符串String类型是由引号括起来的一组由16位Unicode字符组成的字符连串

  字符串类型常被用于表示文本数据,此时字符串中的每个元素都被视为一个代码点。每个元素都被认为占有此行列中的一个地方,用非负数值索引这多少个地点。首字符从地点0最先,第二个字符在职务1,依次类推

  字符串的尺寸即内部元素的个数。空字符串长度为零,由此不分包其他因素

ECMAScript 1

Unicode编码

  javascript采纳UTF-16编码的Unicode字符集,javascript字符串是由一组无符号的16位值组成的行列。最常用的Unicode字符都是通过16位的内码表示,并表示字符串中的单个字符

  [注意]最常用的Unicode字符属于“基本多语种平面”(Basic Multilingual
Plane BMP),也叫做“零断面”(plan 0),
是Unicode中的一个编码区段,编码介于U+0000——U+FFFF之间

  富有字符都可以写成’\uxxxx’的款型,其中xxxx代表该字符的Unicode编码。比如,\u00A9象征版权符号

var s = '\u00A9';
s // "©"

  这个不可以代表为16位的Unicode字符(U+10000到U+10FFFF以内的字符,长度为32位(即4个字节),而且前六个字节在0xD800到0xDBFF之间,后六个字节在0xDC00到0xDFFF之间),则遵从UTF-16编码规则——用六个16位值组成的一个队列(亦称做“代理项对”)表示。这象征一个长短为2的javascript字符串(六个16位值)有可能代表一个Unicode字符

  举例来说,U+1D306对应的字符”팆”,写成UTF-16就是0xD834
0xDF06。浏览器会正确将这三个字节识别为一个字符,不过javascript内部的字符长度总是永恒为16位,会把这六个字节视为五个字符

var s = '\uD834\uDF06';
s // "𝌆"
s.length // 2

 

引号

  字符串String是由双引号(“)或单引号(‘)讲明的。而Java则是用双引号注解字符串,用单引号阐明字符。由于ECMAScript
没有字符类型,所以可采用那二种表示法中的任何一种,但反正引号必须配合

//正确
var sColor1 = "red";
var sColor2 = 'red';
//错误
var sColor1 = "red';
var sColor2 = 'red";

  由单引号定界的字符串中可以分包双引号,由双引号定界的字符串也足以涵盖单引号

'key = "value"'
"It's a long journey"

  javascript代码可能会夹杂HTML代码的字符串,HTML代码也会夹杂javascript代码。因而,最好在javascript和HTML代码中分别行使独自的引号风格

  javascript中利用单引号表示字符串,在HTML事件处理程序中采纳双引号表示字符串

<button onclick = "alert('thanks')">click me</button>

 

反斜线

  如若想在单引号定界的字符串中动用单引号,或在双引号定界的字符串中拔取双引号,则需要选择反斜线(\)

  常见意况是英文缩写和拥有格写法的撇号和单引号是同一个字符,所以这时必须使用反斜线(\)来转义撇号

'Wouldn\'t you prefer this book?'    //"Wouldn't you prefer this book?"
'Did she say \'Hello\'?'             //"Did she say 'Hello'?"
"Did she say \"Hello\"?"             //"Did she say "Hello"?"

多行字符

  字符串默认只可以写在一行内,分成多行将会报错

//报错 Uncaught SyntaxError: Invalid or unexpected token
'a
b
c';

  在ECMAScript3中,字符串必须写在一行中

  在ECMAScript5中,字符串可以拆分成数行,每行必须以反斜线(\)结束

  假设期望在字符串直接量中另起一行,可以使用转义字符\n

//"onelongline"
'one\
long\
line'

/*"two
lines"*/
'two\nlines'

转义字符 

  在javascript字符串,反斜线(\)有着不同常常的用途,反斜线符号后加一个字符,就不意味它们的字面意义,用来代表一些特殊字符,称为转义字符

\0 空字节
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\\ 斜杠
\' 单引号
\" 双引号
\xnn 以十六进制nn表示一个字符(n为0-f),如\x41表示'A'
\unnnn 以十六进制nnnn表示一个Unicode字符(n为0-f),如\u03a3表示希腊字符ε

  即便在非特殊字符前边使用反斜杠,则反斜杠会被略去

'\a' // "a"

  倘使字符串需要包含反斜杠,则反斜杠后边需要再加一个反斜杠,用来对自己转义

"Prev \\ Next" // "Prev \ Next"

 

特点

  javascript中的字符串是不可变的。一旦字符串被成立,就永远不能更改它。要改成某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个蕴含新值的字符串填充该变量

  可以通过+运算符连接其他字符串来创制一个新字符串

var lang = "java";
lang = lang + "script"; //'javascript'

  以上代码的骨子里过程是:首先创造一个可知容纳10个字符的新字符串,然后在这么些字符串中填充’java’和’script’,最终一步是绝迹原来的字符串’java’和’script’,因为这五个字符串已经没用了

  这一个历程在后台暴发,也是在少数旧版本浏览器(IE6)拼接字符串速度慢的原委,但浏览器前面版本现已解决了这一个低效能问题

 

转字符串

  把一个值转换为字符串有二种艺术,toString()和String()

  [注意]可以使用空字符串”” + 某个值,将该值转换为字符串

toString()

  第一种是拔取几乎每个值都有的toString()方法,这一个措施重回相应值的字符串表现

  [注意]undefined和null没有该措施

undefined.toString();//错误
null.toString();//错误
true.toString();//'true'
false.toString();//'false'
'abc'.toString();//'abc'
1.23.toString();//'1.23'
({}).toString();//[object Object]
[1,2,3,4].toString();//'1,2,3,4'
(new Date()).toString();//"Sun Jun 05 2016 10:04:53 GMT+0800 (中国标准时间)"
/ab/i.toString();//'/ab/i'

String()

  在不精晓要转移的值是不是undefined或null时,可以利用转型函数String()

  转型函数String()服从下列规则:

  【1】如果值是null,则赶回’null’;倘若值是undefined,则赶回’undefined’

  【2】如若值不是null或undefined,则调用toString()方法并回到原始类型值

  【3】若接纳toString()方法再次回到的是目的,则再调用valueOf()方法再次来到原始类型值,若使用valueOf()方法再次回到的是目的,会报错

// "3"
String({toString: function () {
    return 3;
  }
})

// "[object Object]"
String({valueOf: function () {
    return 2;
  }
})

// "3"
String({
  valueOf: function () {
    return 2;
  },
  toString: function () {
    return 3;
  }
})

 

参考资料

【1】 ES5/类型
https://www.w3.org/html/ig/zh/wiki/ES5/types 
【2】 阮一峰Javascript标准参照教程——基本语法之字符串
http://javascript.ruanyifeng.com 
【3】 W3School-Javascript高级教程——ECMAScript原始类型
ECMAScript,http://www.w3school.com.cn
【4】《javascript权威指南(第6版)》第3章 类型、值和变量
【5】《javascript高级程序设计(第3版)》第3章 基本概念 
【6】《javascript语言出色(修订版)》第2章 语法
【7】《javascript DOM编程艺术(第2版)》第2章 Javascript语法