javascript 基元与对象引用

javascript primitives vs object references

我已经使用 JavaScript 多年了,这个让我很困惑。据我了解,在定义 var 时,会发生以下两种情况之一:

  1. 如果表达式是原语,var 被定义为该原语的新实例,不引用传递的表达式。
  2. 如果表达式是对象文字,则会创建一个新对象。
  3. 如果表达式是现有对象,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 被定义为 objbody 属性,我认为将 ref 重新定义为字符串也会影响 obj.body.那我错过了什么?

JSON.stringify 是一种接受对象和 returns 其字符串表示的方法,它不会改变任何东西。通过执行 ref = x 可以使 ref 指向另一件事,它不会影响赋值前的内容。

这只是意味着,您不再引用 obj.body.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

上并没有真正改变任何东西

基元是不可变的。如果与对象相比它们的行为方式有所不同,您将无法观察到,所以忘记所有关于复制的东西。让我们用“事物”来代替!对象和基元都是事物。当您将事物分配给变量时,您并不是在复制事物。

var x = literally any value;
var y = x;

xy 都是包含相同内容的变量。如果你改变了东西,以后从哪里访问它都没有关系;事情变了。如果更改变量包含的内容,则它之前包含的内容不受影响。

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。