Javascript字符串是不可变的,但按索引重新分配不会引发错误
这是代码
let name = 'John';
name[1] = 'a';
name[2] = 'n';
name[3] = 'e';
我知道 Javascript 字符串是不可变的。第 2、3 和 4 行将不起作用,如果我使用 console.log(name),输出将是“John”。但是为什么 Js 没有为第 2、3、4 行抛出错误?
回答
在草率模式下,某些类型的故障通常是无声的。在这种情况下,字符串的索引属性是不可写的:
console.log(
Object.getOwnPropertyDescriptor('foo', 1)
);
分配给不可写的属性将:
- 在草率模式下,静默失败
- 在严格模式下,抛出错误
具体来说,这个逻辑是在PutValue 中实现的。
如果成功为假且 V.[[Strict]] 为真,则抛出 TypeError 异常。
如果您想将这些类型的无声错误变成显式错误,请使用严格模式:
'use strict';
let name = 'John';
name[1] = 'a';