js基本类型的不可变性
Willem Zhang Lv6

不可变

基本数据类型不可变指的不是存储基本数据类型的变量不能赋予其新的值。

1
'layout'[2] = 3

这个语句在非严格模式下不会报错,执行之后字符串的值还是原样,不会改变。
在js中字符串是基本数据类型。

由于js没有指针的概念,所以不能拿到基本类型的地址,于是对基本类型的复制操作只能基于值的复制,而不能基于地址的复制,也就是说不能同时有两个变量访问到同一个基本类型。所以当对基本类型进行操作时,不会导致基本类型的值发生变化。并不会有别的变量能够访问到基本类型的存储单元,从而改变基本类型的值。也就是说,值的不可变性指的是没有别的变量(因为js不存在指针)能够通过访问该值所在存储单元进而修改值的方式改变这个值。只有自己这个变量能够访问到这个值,也只有自己这个变量能够通过赋值的方式改变这个值。
权势大的由平氏变为了源氏,而平氏本身没有变成源氏。

1
let a = 2; a = 3

2变成了3,指的是变量由2变成了3,而2还是2,只是被3代替了。
但是此时,如果别的变量可以通过指针的方式改变这个值,此时这个值也可以说是不可变的(?),只不过是这个变量变了。(矛盾)

疑问:如果说基本数据类型a++是赋值,实际值是不变的。那么引用数据类型如下赋值的情况。

1
2
let a = [1]
a = [2]

这时也是对a进行赋值,此时a的地址变化了,能不能说引用类型的值是不变的呢(这里的值指的是赋值给变量的地址)

或许说引用类型是可变的指的并不是引用类型的地址是可变的,而是说引用类型的内容是可变的。

  • Post title:js基本类型的不可变性
  • Post author:Willem Zhang
  • Create time:2021-11-20 18:10:15
  • Post link:https://ataraxia.top/2021/11/20/js基本类型的不可变性/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments