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';


以上是Javascript字符串是不可变的,但按索引重新分配不会引发错误的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>