Javascript 不变性应该抛出错误,但它不在字符串中

Javascript 不变性应该抛出错误,但它不在字符串中,javascript,string,visual-studio-code,immutability,Javascript,String,Visual Studio Code,Immutability,我正在测试字符串的不变性,并编写了这个接受字符串的函数 由于字符串是不可变的,因此下面的str[i]不能分配给任何值 但是,当我运行这个函数时,它不会给我一个错误。为什么呢?(根据我的研究,我相信这一行(str[I]='x'应该会破坏系统/停止执行函数并抛出错误。但事实并非如此(这是在VSCode编辑器中编写的) 函数tuc(str){ 设res=[]; for(设i=0;i

我正在测试字符串的不变性,并编写了这个接受字符串的函数

由于字符串是不可变的,因此下面的str[i]不能分配给任何值

但是,当我运行这个函数时,它不会给我一个错误。为什么呢?(根据我的研究,我相信这一行(str[I]='x'应该会破坏系统/停止执行函数并抛出错误。但事实并非如此(这是在VSCode编辑器中编写的)

函数tuc(str){
设res=[];
for(设i=0;i
表达式

    str[i] = 'x';
从字符串基元隐式创建字符串实例。在该对象上设置了属性,但该对象未保存在任何位置。在字符串实例上设置属性不会影响
str
的基元字符串值

换句话说

    str[i] = 'x';
实际上与

    (new String(str))[i] = 'x';
因为该瞬态对象确实成功地从赋值中获取了一个新属性,所以没有要抛出的异常

请注意,隐式字符串实例的构造在这段特定代码中不是特例,甚至类似于

    var len = str.length;
创建一个临时字符串实例。(当然,现代JavaScript运行时通常可以认识到它实际上并不需要字符串实例,但这就是所涉及的概念。)

表达式

    str[i] = 'x';
从字符串基元隐式创建字符串实例。在该对象上设置了属性,但该对象未保存在任何位置。在字符串实例上设置属性不会影响
str
的基元字符串值

换句话说

    str[i] = 'x';
实际上与

    (new String(str))[i] = 'x';
因为该瞬态对象确实成功地从赋值中获取了一个新属性,所以没有要抛出的异常

请注意,隐式字符串实例的构造在这段特定代码中不是特例,甚至类似于

    var len = str.length;

创建一个临时字符串实例(当然,现代JavaScript运行时通常可以认识到它实际上并不需要字符串实例,但这就是所涉及的概念)

这正是语言的工作方式。嗯,但它应该在控制台/终端中抛出一个错误,因为不能在变量赋值中循环字符串。也就是说,它可以读取,可以赋值,但不能在赋值中循环:(正如您所发现的,这种情况不会发生。字符串的字符串值是不可变的。但是其他属性是不可变的!JS对象充满了步兵:(很多事情都会无声地(或非常安静地)失败)在javascript中…这正是语言的工作方式。嗯,但它应该在控制台/终端中抛出一个错误,因为不能在变量赋值中循环字符串。也就是说,它可以读取,可以赋值,但不能在赋值中循环:(正如您所发现的,这种情况不会发生。字符串的字符串值是不可变的。但是其他属性是不可变的!JS对象充满了步兵:(很多事情都会无声地(或非常安静地)失败)在javascript中…OP的附加说明:如果使用Thank,则会出现预期错误,这很有帮助。当I console.log它时,它会循环并记录x,因为它是实例值。顺便说一句,我启用了Strict模式,但没有为OP提供错误附加说明:如果使用Thank,则会出现预期错误,这很有帮助。当I console.log它时,它循环并记录x,这是有意义的,因为它是实例值。顺便说一句,我启用了严格模式,但没有提供错误