我已经使用JavaScript多年了,这个让我难过。据我所知,在定义var
时,会发生以下两种情况之一:
var
被定义为该基元的新实例,不会引用传递的表达式。var
将引用该对象,并且将反映对象的任何未来更改。但是,我遇到了案例3不适用的情况:
var obj = {body: {'a': 1, 'b': 2, 'c': 3}};
var ref = obj.body;
ref = JSON.stringify(ref);
console.log(typeof ref); // string
console.log(typeof obj.body); // object
由于ref
被定义为body
的{{1}}属性,我认为将obj
重新定义为字符串也会影响ref
。那我错过了什么?
答案 0 :(得分:2)
JSON.stringify
是一个接受对象并返回其字符串表示的方法,它不会改变任何东西。通过执行ref = x
,您ref
指向另一个事物,它不会影响分配前的内容。
答案 1 :(得分:0)
这只是意味着,您不再引用obj.body
。身体并引用其他内容。
var ref = obj.body;
//ref holding obj.body now any changes to ref will effect obj.body.
ref = JSON.stringify(ref);
//ref holding a String returned by `stringify()` now any changes to ref will effect obj.body.
你知道吗?您只需使用不同的值更改ref
即可。并没有真正改变obj
上的任何内容
答案 2 :(得分:0)
原语是不可改变的。如果与对象相比它们的行为方式存在差异,那么你就无法观察到它,所以忘掉所有关于复制的东西。让我们谈谈“事物”!对象和原语都是事物。将事物分配给变量时,您不会复制该事物。
var x = literally any value;
var y = x;
x
和y
都是包含相同内容的变量。如果你改变了这个东西,将来你从哪里访问它并不重要;事情发生了变化。如果更改变量包含的内容,则之前包含的内容不会受到影响。
var z = some other value;
y = z; // y now contains the same thing as z instead of the same thing as x
// only variables changed, and the things did not
有很多答案用其他术语来讨论这个问题,但我喜欢技术语言。
tl; dr :出于所有意图和目的,JavaScript中对象和基元之间的区别并不是很有用。
ts; iwrse :This article about Python同样适用于JavaScript。