首先大家需要知道是,原始值(基本数据类型)string和String对象之间的关系:
String是原始值string的原始值包装类型的对象
例:
let s1 = 'some text';
let s2 = s1.substring(2);
以上例子s1是一个包含字符串的变量,它是一个原始值!第二行紧接着在s1上调用了substring()方法并把结果保存在s2中。我们要知道,原始值本身不是对象,因此逻辑上不应该有方法。而实际上这个例子又确实按预期运行了。这是因为后台做了以下操作!
1、创建一个String类型的实例;
2、调用实例上的特定方法;
3、销毁实例;
想象为后台操作:
let s1 = new String('some text');
let s2 = s1.substring(2);
s1 = null;
这种行为可以让原始值拥有对象的行为。对布尔值和数值而言,以上三步也会在后台发生,只不过使用的是Boolean和Number包装类型而已!
引用类型和原始值包装类型的主要区别在于对象的生命周期。在通过new关键字实例化引用类型后,得到的实例会在离开作用域时被销毁。而自动创建的原始值包装对象则只存在于访问它的那行代码执行期间。这意味着在运行时,不能给原始值添加属性或方法!
例:
let s1 = 'some text';
s1.age = 15;
console.log(s1.age);//undefined
这里第二行代码尝试给第一行代码添加一个属性age,可是第三行代码访问age时,它却不存在了。原因就是第二行代码在运行时会临时创建一个String对象,而当第三行代码执行时,这个对象已经被销毁了。实际上,第三行代码在这里创建了自己的对象,但这个对象没有age这个属性!
由上可见String对象的方法可以在所有字符串原始值上调用。有三个继承的方法valueOf()、toLocaleString()和toString()都返回对象的原始字符串值!
每个String对象都有一个length属性,表示字符串中字符的数量。来看看下面的例子:
let str = 'hello world';
console.log(str.length);//'11'
这个例子输出了字符串中包含的字符数量:11。
注:即使字符串中包含双字节字符(而不是单字节的ASCII字符),也仍然会按单字符来计数。
JavaScript字符
JavaScript字符串由16位码元(code unti)组成。对多数字符串来说,每16位码元对应一个字符。换句话说,字符串length属性表示字符串包含多少16位码元:
let message = 'abcde';
console.log(message.length);//5
除此之外charAt()方法返回给定索引位置的字符,由传给方法的整数参数指定。具体来说,这个方法查找索引指定位置的16位码元,并返回该码元对应的字符。
let message = 'abcde';
console.log(message.charAt(2));//c
JavaScript字符串使用了两种Unicode编码混合的策略:UCS-2和UTF-16.对于可以采用16位编码的字符(u+0000~u+FFFF),这两种编码实际上是一样的。
使用charCodeAt()方法可以查看指定码元的字符编码。这个方法返回指定索引位置的码元值,索引以整数指定。比如:
let message = 'abcde';
//unicode "Latin small letter C"的编码是U+0063
console.log(message.charCodeeAt(2));//99
//十进制99等于十六进制63
console.log(99===0x63);//true
fromCharCode()方法用于根据给定的UTF-16 码元创建字符串中的字符。这个方法可以接受任意多个数值,并返回将所有数值对应的字符拼接起来的字符串:
//unicode "Latin small letter A"的编码是U+0061
//unicode "Latin small letter B"的编码是U+0062
//unicode "Latin small letter C"的编码是U+0063
//unicode "Latin small letter D"的编码是U+0064
//unicode "Latin small letter E"的编码是U+0065
console.log(String.formCharCode(0x61,0x62,0x63,0x64,0x65);//'abcde'
//0x0061 === 97
//0x0062 === 98
//0x0063 === 99
//0x0064 === 100
//0x0065 === 101
对于U+0000-U+FFFF范围内的字符,length, charAt(). charCodeAt ()和fromCharCode()返回的结果都跟预期是一样的。 这是因为在这个范围内,每个字符都是用16位表示的。而这几个方法也都基于16位码元完成操作。只要字符编码大小与码元大小对应, 这些方法就能如期工作。
字符串操作方法:
concat(),用于将一个或多个字符串拼接成一个新字符串
例:
let str = 'hello';
let str1 = str.concat('world');
console.log(str);//'hello'
console.log(str1);//'hello world'
以上例子中,对str调用concat()方法的结果得到'hello world',但str的值保持不变。concat()方法可接受任意多个参数,因此可以一次性拼接多个字符串。
例: