javascript 基元与对象引用
javascript primitives vs object references
我已经使用 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
被定义为 obj
的 body
属性,我认为将 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;
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。
我已经使用 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
被定义为 obj
的 body
属性,我认为将 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;
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。