从研究中我了解到,在javascript中,可变对象()通过call-by-reference来处理,而不可变对象通过call-by-value调用约来处理。
假设我使用这种数据,
var Node = function(data) {
this.data = data;
this.next = null;
};
var v = new Node(0);
v
是一个可变对象还是一个不可变对象?
首先让我们了解一下new
operator在幕后创建的执行上下文中做了什么:
它会:
this
标签)__proto__
属性将引用该函数的prototype
属性所以在你的情况下:
var v = new Node(0);
v
实际上是一个Object
(通过new
创建并返回的那个),JavaScript中的对象是可变的。
Here是原始(不可变)类型: 布尔 空值 未定义 数 串 符号(ECMAScript 6中的新内容)
从这个工作示例中可以看出,它是可变的。
var Node = function(data) {
this.data = data;
this.next = null;
};
var v = new Node(0);
v.myNewAttribute = 'foobar';
var elemDiv = document.createElement('div');
elemDiv.innerHTML = JSON.stringify(v);
document.body.appendChild(elemDiv);
v
是一个可变对象。要将此对象更改为不可变对象,请使用Object.freeze()
方法。
例:
var Node = function(data) {
this.data = data;
this.next = null;
};
var v = new Node(0); // "v" object is mutable
v.data = 1; // The "data" property value will change
console.log(v);
Object.freeze(v); // "v" object is immutable
v.data = 2; // The "data" property value will NOT change
console.log(v);
Object.freeze()方法冻结了一个对象。无法再更改冻结对象;冻结对象可防止将新属性添加到其中,从而删除现有属性,防止更改现有属性的可枚举性,可配置性或可写性,并防止更改现有属性的值。此外,冻结对象还可以防止其原型被更改。 freeze()返回传入的相同对象.more