此代码不适用于
var x ='hello';
x[2] ='a';
为什么它不起作用?我没有使用replace((函数
在javascript中,字符串是不可变的,不能使用索引更改字符串。诸如trim、slice之类的字符串操作方法返回新的字符串。
由于将string
值提升为具有基元string
值的String
对象包装器的遗留行为,因此它不起作用。
例如
"xyz".charAt(0)
至少在理论上被评估为
(new String("xyz")).charAt(0)
因为CCD_ 4是CCD_。
不利的一面是,升级后的String对象永远不会存储在任何地方,即使在JavaScript中进行了修改,也会立即丢弃。这就是发布的代码中发生的事情:
var x ='hello';
x[2] ='a';
被视为
new String(x)[2] = 'a'
然后丢弃String对象,顺便提一下,该对象具有名为2
、值为'a'
的属性。
对此的一般解决方案是在严格模式下运行JavaScript,这样,任何将属性分配给已升级为对象包装器的基元值的尝试都会产生错误:
"use strict"
var x ='hello';
x[2] ='a';