了解Javascript不可变variables

我想了解一个Javascript不可变variables是什么意思。 如果我能做到:

var x = "astring"; x = "str"; console.log(x); //logs str` , then why it is immutable? 

我能想到的唯一答案(从CI的一点点知道)是var x是一个指向一个内存块的值“astring”,并在第二个语句后指向另一个值为“str”的块。 是这样吗?

还有一个额外的问题:我被Javascript的值types弄糊涂了。 所有的variables对象都是隐藏的吗? 偶数和string?

价值是不可改变的。 variables不是; 他们持有对他们(原始)价值的参考。

string,数字和布尔值这三种基本types都有对应的types,其实例是对象: string,数字,布尔值
他们有时被称为包装types

以下值是原始的 :

  • string:“你好”
  • 数字:6,3.14(JavaScript中的所有数字都是浮点数)
  • 布尔人:是真的,假的
  • 空:通常显式分配
  • undefined:通常是默认(自动赋值)的值

所有其他值都是对象,包括基元的包装器。

所以:

  • 对象默认是可变的
  • 对象具有独特的身份,并通过引用进行比较
  • variables保存对象的引用
  • 基元是不可改变的
  • 根据价值比较原始人,他们没有个人身份

你可能会发现JavaScript Primitives的秘密生活很好的解释。

另外,在ES6中还有一个新的const关键字,它创build一个只读的命名常量,它不能通过赋值来改变值,或者在脚本运行时重新声明。

希望这可以帮助!

首先,在C中“一个string是最后一个elem ='\ 0'的字符数组”。 他们是可变的。
如果你用C来声明和初始化一个string,像这样:

 char str[] = "Foo"; 

你基本上做的是保留4个字节(可能8位字节,不要在意这可能是否会伤害你)。 str这个词是指向这个数组的第一个元素的指针。 所以,如果你这样做:

 str[0] or *(str) = 'G' 

那么它会改变该地址的值,而不是创build新的数组。 你可以通过打印str的地址来validation它。 在这两种情况下都是一样的。

现在在JavaScript的情况下string是一个原始types。 string的所有操作都是由值而不是由引用完成的。 所以,这样做会产生真实的。

 var str1 = "foo"; var str2 = "foo"; str1 === str2; => true 

string的初始化要求缓冲区适合“foo”并将名字str1绑定到它。 是什么让他们不可变的是,你不能改变这个缓冲区。 所以,你不能这样做:

 str1[0] = 'G' 

执行此命令不会在非严格模式下产生警告或错误,但不会更改str1。 你可以通过validation

 console.log(str1) => "foo" 

但是,如果你这样做:

 str1 = "goo" 

你实际上正在做的是,你要求一个新的缓冲区,以适应“咕噜”和绑定标识符str1它。 包含“foo”的旧缓冲区没有变化。

那么,“富”会发生什么?

Java脚本有一个自动垃圾收集器。 当它看到一些不再可以被任何标识符引用的内存块时…则认为该内存是免费的。

布尔值也是如此。 现在,关于包装对象! 每当你尝试像这样访问string属性:

 str1.length; 

什么JavaScript它创build一个新的对象使用String类和调用string的方法。 只要函数调用返回,对象就被销毁。 以下代码进一步解释:

 var str = "nature"; str.does = "nurtures"; //defining a new property; console.log(str.does) => undefined 

因为这个物体已经被毁坏了。 尝试这个!

 var str = new String("Nature"); str.does = "nurtures"; console.log(str) => ?? 

这个str是真的一个对象…

结论:在C中,在单个作用域中,variables名称用作指针。 所以,int,float,string都是可变的。 但是在Java脚本中,一个原始typesvariables名称作为值而不是引用

参考文献:C ++ primer plus,Java Script权威指南,C Stephen Kochan

你是对的。 string(和数字)在Java脚本(和许多其他语言)中是不可变的。 variables是对它们的引用。 当你“改变一个variables的值”时,你正在改变variables引用的string(或其他),而不是值本身。