从研究中我了解到,在javascript中,可变对象()由按引用调用处理,而不可变对象根据按值致电调用约定处理。
假设我使用这种数据,
b''
var Node = function(data) {
this.data = data;
this.next = null;
};
var v = new Node(0);
是可变对象还是不可变对象?
答案 0 :(得分:2)
答案 1 :(得分:1)
这是可变的,如您在本示例中所见。
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);
答案 2 :(得分:1)
首先让我们了解new
operator在幕后创建的执行上下文中做什么:
它将:
this
标签上)__proto__
属性将引用该函数的prototype
属性所以在您的情况下:
var v = new Node(0);
v
实际上是一个Object
(通过new
创建和返回的那个),JavaScript中的对象是可变的。
Here是基元(不可变)类型:
布尔值
空
未定义
编号
字符串
符号(ECMAScript 6中的新功能)
答案 3 :(得分:1)
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()方法冻结对象。冻结的对象无法再更改;冻结对象可防止向其添加新属性,删除现有属性,防止更改现有属性的可枚举性,可配置性或可写性,并防止更改现有属性的值。此外,冻结对象还可以防止更改其原型。 Frozen()返回传入的对象。more