gpt4 book ai didi

javascript - native 对象的怪异行为是由什么引起的?

转载 作者:行者123 更新时间:2023-11-30 10:34:23 24 4
gpt4 key购买 nike

最近我开始学习 JavaScript 中的面向对象编程。我的理解是,当引用变量时,我们实际上不是引用它们的实际值,而是引用内存中的位置。这就是为什么所有那些应该复制实例的“return this”方法都不起作用的原因。

因此,示例代码:

//An example object with a simple property and
//failing "copy" function.
function MyObject()
{
this.myProperty = 123;
this.copy = function() { return this; };
}

var iOne = new MyObject();
var iTwo = iOne.copy();
iTwo.myProperty = 321;

现在 iOne 和 iTwo 的“myProperty”属性都等于 321,因为“copy”方法返回一个引用,而不是一个值。此行为是预期的,一切正常。

现在,我尝试对原生对象类型 Number 执行相同的操作。让我们以一种更面向对象的对程序员友好的方式创建它的一个实例:

var iOne = new Number(123);
var iTwo = iOne; //Equals "iTwo = iOne.copy()", except there isn't a copy method

iOne = 321;

现在,可怕的事情发生了。 iOne 等于 321,但 iTwo 保持其值并仍然等于 123。

我不知道这种行为是由什么引起的。也许数字是某种“特殊”?也许与它相关的十进制数不仅仅是一个属性?或者也许它只是为了让没有经验的程序员的生活更轻松?最后一个选项与运算符有关。如果有人对此有所了解,请不要让我理解 JavaScript 的方式分崩离析。

最佳答案

对象、数组和字符串是通过引用分配的(而不是通过复制)。所有其他类型在分配时都是有效的副本(例如,它们创建了一个与旧变量无关的新变量)。

字符串是一种特殊情况,因为它们是不可变的,所以当您更改字符串时,它总是会创建一个新字符串,因此它的行为更像是复制一个副本,即使之前的赋值是一个引用也是如此。

分配:

iOne = 321;

正在用简单的原始数字类型替换 iOne 的值,因此它不会影响任何其他变量。

关于javascript - native 对象的怪异行为是由什么引起的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14917091/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com