JavaScript 里有两种赋值运算符:
值类型的字符串是一个大的、不确定长度的连续数据块,这导 致复制数据的开销很大,所以 JavaScript 中将字符串的赋值也变成了复制(连续数据块起 始处的)地址,即该字符串的地址引用。由此引入了三条字符串处理的限制:
- 不能直接修改字符串中的字符。
- 字符串连接运算必然导致写复制,这将产生新的字符串。
- 不能改变字符串的长短,例如修改length属性是无意义的。
赋值运算符除了等号“=”之外,还有一类“复合赋值运算符”。这类运算符由一个 一般表达式运算符与一个赋值运算符复合构成。由于字符串只支持“字符串连接(+)” 运算的缘故,除第一个“+=”能用于字符串之外,其他 的都只能用于数值类型,如果将它们使用于非数值类型,则运算中会出现隐式的类型转 换。
在 JavaScript 中,上面这行代码的确能通过语法检测,但是它会触发一个执行期错误。 在 IE 的 JScript 引擎中,错误信息是“不能给 '[number]' 赋值”;在 Firefox 的 SpiderMonkey 引擎中,错误信息则是“左侧无效赋值”。这是由于左侧的运算元是直接量, 其存储单元是不可写的,因此在表达式运算过程中,将因为赋值的效果(修改存储单元 中的值)无法完成,而导致出错。
在 JavaScript 中,赋值是一个运算,而不是一个语句。所以,在赋值表达式中,运算符左右都是运算元。当然,按照“表达式”的 概念,表达式的运算元既可以是值(也包括立即值),也可以是引用。