了解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(或其他),而不是值本身。