JavaScript:String对象(上)

64 阅读4分钟

开启掘金成长之旅!这是我参加「掘金日新计划·12月更文挑战」的第六天,点击查看活动详情

String对象

概述

String对象是JavaScript原生提供的三个包装对象之一,用来生成字符串对象。

           var s1 = 'abc';
           var s2 = new String('abc');
           
           typeof s1 //"String"
           typeof s2 //"object"
           
           s2.valueOf() //"abc"

上面代码中,变量s1是字符串,s2是对象。由于s2是字符串对象,s2.valueOf方法返回的就是他所对应的原始字符串。

字符串对象是一个类似数组的对象(很像数组,但不是数组)。

           new String('abc')
           //String{0:"a",1:"b",2:"c",length:3}
           
           (new String('abc'))[1] //"b"

上面代码中,字符串abc对应的字符串对象,有数值键(0、1、2)和length属性,所以可以像数组那样取值。

除了用作构造函数,String对象还可以当作工具方法使用,将任意类型的值转为字符串。

           String(true) //"true"
           String(5) //"5"

上面代码将布尔值true和数值5,分别转换为字符串。

静态方法

String.fromCharCode()

String对象提供的静态方法(即定义在对象本身,而不是定义在对象实例的方法),主要是String.fromCharCode()。该方法的参数是一个或多个数值,代表Unicode码点,返回值是这些码点组成的字符串。

           String.fromCharCode()//""
           String.fromCharCode(97)//"a"
           String.fromCharCode(104,101,108,108,111)//"hello"

上面代码中,String.fromCharCode()方法的参数为空,就返回空字符串;否则,返回参数对应的Unicode字符串。
注意,该方法不支持Unicode码点大于0xFFFF的字符,即传入的参数不能大于0xFFFF(即十进制的65535)。

            String.fromCharCode(0x20BB7)// "ஷ"`
            String.fromCharCode(0x20BB7)===String.fromCharCode(0x0BB7)
            //true

上面代码中,0x20BB7拆成两个字符0xD842和0xDFB7(即两个两字节字符,合成一个四字节字符),就能得到正确的结果。码点大于0xFFFF的字符的四字节表示法,由UTF-16编码方法决定。

实例属性

String.prototype.length

字符串实例的length属性返回字符串的长度。

            var str = 'abc' 
            'abc'.length //3

str(基本类型)访问属性时会发生以下过程:
1.系统会默认调用new String('abc'),生成一个字符串包装对象
2.为当前对象实例进行属性访问
3.当.xxx访问行为结束后(即当前行结束),将生成的包装实例对象删除掉

实例方法

String.prototype.charAt()

charAt方法返回指定位置的字符,参数是从0开始编号的位置。

            var s = new String('abc');
            s.charAt(1) //"b"
            s.charAt(s.length - 1) //"c"

这个方法完全可以用数组下标替代。

            'abc'.charAt(1) //"b"
            'abc'.[1] //"b"

如果参数为负数,或大于等于字符串的长度,charAt返回空字符串。

            'abc'.charAt(-1) //""
            'abc'.charAt(3)  //""

String.prototype.charCodeAt()

charCodeAt()方法返回字符串指定位置的Unicode码点(十进制表示),相当于String.fromCharCode()的逆操作。

            'abc'.charCodeAt(1) //98

上面代码中,abc的1号位置的字符是b,他的Unicode码点是98.
如果没有任何参数,charCodeAt返回首字符的Unicode码点。

            'abc'.charCodeAt() //97

如果参数为负数,或大于等于字符串的长度,charCodeAt返回NaN。

            'abc'.charCodeAt(-1) // NaN
            'abc'.charCodeAt(4) // NaN

注意,charCodeAt方法返回的 Unicode 码点不会大于65536(0xFFFF),也就是说,只返回两个字节的字符的码点。如果遇到码点大于 65536 的字符(四个字节的字符),必须连续使用两次charCodeAt,不仅读入charCodeAt(i),还要读入charCodeAt(i+1),将两个值放在一起,才能得到准确的字符。

String.prototype.concat()

concat方法用于连接两个字符串,返回一个新字符串,不改变原字符串。

            var s1 = 'abc';
            var s2 = 'def';
 
            s1.concat(s2) // "abcdef"
            s1 // "abc" 

该方法可以接受多个参数

            'a'.concat('b','c') //"abc"

如果参数不是字符串,concat方法会将其先转为字符串,然后再连接。

            var one = 1
            var two = 2
            var three = '3'
            
            ''.concat(one,two,three)//"123"
            one+two+three //"33"

上面代码中,concat方法将参数先转为字符串再连接,所以返回的是一个三个字符的字符串。作为对比,加号运算符在两个运算符都是数值时,不会转换类型,所以返回的是一个两个字符的字符串。