javascript字符串与数组
字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符(从0开始)。
var s = 'hello'; s[0] // "h" s[1] // "e" s[4] // "o" // 也可以直接对字符串使用方括号运算符 'hello'[1] // "e"
如果方括号中的数字超过字符串的范围,或者方括号中根本不是数字,则返回undefined。
'abc'[3] // undefined 'abc'[-1] // undefined 'abc'["x"] // undefined
但是,字符串与数组的相似性仅此而已。实际上,字符串是类似数组的对象,且无法改变字符串之中的单个字符。
var s = 'hello'; delete s[0]; s // "hello" s[1] = 'a'; s // "hello" s[5] = '!'; s // "hello"
上面代码表示,字符串内部的单个字符无法改变和增删,这些操作会默默地失败。
length属性返回字符串的长度,该属性也是无法改变的。
var s = 'hello'; s.length // 5 s.length = 3; s.length // 5 s.length = 7; s.length // 5
上面代码表示字符串的length属性无法改变,但是不会报错。
字符串也无法添加新属性。
var s = "Hello World"; s.x = 123; s.x // undefined
上面代码为字符串s添加了一个x属性,结果无效,总是返回undefined。
上面这些行为的原因是,在JavaScript内部,变量s其实指向字符串“Hello World”的地址,而“Hello World”本身是一个常量,所以无法改变它,既不能新增,也不能删除。另一方面,当一个字符串被调用属性时,它会自动转为String对象的实例(参见《标准库》一章),调用结束后,该对象自动销毁。这意味着,下一次调用字符串的属性时,实际是调用一个临时生成的新对象,而不是上一次调用时生成的那个对象,所以取不到赋值在上一个对象的属性。如果想要为字符串添加属性,只有在它的原型对象String.prototype上定义(参见《面向对象编程》一章)。