为什么说js中Number是不可变量

问题描述:

为什么说js中Number是不可变量
这是《Javascript - The Definite Guide 6th》正文30页的原文.“ They can also be categorized as mutable and immutable types.A value of a mutable type can change.Objects and arrays are mutable:a JavaScript program can change the values of object properties and array elements.Numbers,booleans,null,and undefined are immutable—it doesn’t even make sense to talk about changing the value of a number,for example.”为什么说Number,boolean是不可变量?这里的可变与不可变是什么意思?
1个回答 分类:英语 2014-10-21

问题解答:

我来补答
这里的“不可变”指的是变量本身是不会发生变化的.数字、布尔值都属于“原子”数据类型.你只能改变它的值,而不能改变它本身.而对象则不同.对象是复杂的数据类型,一个对象会包含很多原子类型或者其他的对象.你可以改版对象的属性方法,但对象还是它本身.
再问: 我受到了一点启发。这里实际上说是一般意义上的量,或literal。这样可以很好释疑。改变对象数组的literal是有意义的,改变“3”这个literal是毫无意义的。可是,String又会变得很奇怪。书中解释的是String是不可变的,对String的操作只是返回一个新的String,原来的量根本没变。那么,原来的量去哪里了?被释放了吗?为什么对象、数组不用这种观点解释,也被视为不可变的?
再问: 我受到了一点启发。这里实际上说是一般意义上的量,或literal。这样可以很好释疑。改变对象数组的literal是有意义的,改变“3”这个literal是毫无意义的。可是,String又会变得很奇怪。书中解释的是String是不可变的,对String的操作只是返回一个新的String,原来的量根本没变。那么,原来的量去哪里了?被释放了吗?为什么对象、数组不用这种观点解释,也被视为不可变的?
再答: Numbers, booleans, null, and undefined are immutable这个很难理解么?是Numbers不是Number这个function或者对象,意思是所有的数字、布尔值、null,和undefined这两个值是不可变的。var a='abc';,很正常的,这里操作(读取)了一个字符串'abc',但不能'abc'='cde';,所以对字符串的操作只能是把字符串的值赋值给某个变量,而不能把某个其他值赋值给一个字符串常量。英文资料有点绕,因为这里的String指的是所有的字符串常量,而非js里面的String对象。
好吧,说个关键点吧:所有类型的值都是常量,不可变的。不用在乎类型是字符串、数值、数组、对象等等。例子就是:
var a=1,b='bb',c=false,d=[1,2,3],e={name:'wxsblog'};//没问题,常量可以读取,变量可以被赋值
var 1=2,'bb'='cc',false=true,[1,2,3]=[4,5],{name:'wxsblog'}={name:'风雪博客'}; //正如你所知道的,肯定不行。虽然很奇怪,但这就是清清楚楚地告诉你:常量只能被读取,不能用来放在(单个)等号左边重新赋值,也就是修改。
所以,现在你应该知道答案了吧:不管任何类型的数据,只要这个量是具体的某个值,也就是常量,他就是不可变的。只有变量才可变,不然为什么叫变量。如果你熟悉JS的话,应该不会问这种问题,因为你都理解了;如果你是初学的话,建议别迷信权威非要看英文资料,随便百度个JS教程,看看中文的就好了,就怕出现我刚才说的英文里比较绕的问题。
 
 
展开全文阅读
剩余:2000