javascript - JS 通过引用传递给函数并可以覆盖属性,但不能覆盖整个对象?

标签 javascript

<分区>

我试图理解有人向我展示的 JavaScript 的复杂性。考虑以下简单函数:

function myFunction(p) {
    p.property = 1;
}

var obj = {property: 0};
console.log(obj); // {property: 0}
myFuncton(obj);
console.log(obj); // {property: 1}

让我们重复一遍,但不是覆盖对象的一部分,而是覆盖整个对象:

function myFunction(p) {
    p = {property: 1};
}

var obj = {property: 0};
console.log(obj); // {property: 0}
myFuncton(obj);
console.log(obj); // {property: 0}

为什么 obj 没有按预期在这里被替换?

最佳答案

Why does obj not get replaced here as expected?

因为当您调用您的函数时,您将引用的副本传递给对象obj。这意味着您可以更改/修改传递给函数的对象的属性,但不能更改实际引用。

在代码方面:

// creates an object and a reference to this object is assigned to the obj
var obj = {property: 0};

function myFunction(p) {
    p = {property: 1};
}

// Here you pass a copy of the reference.
myFunction(obj);

现在无论你做什么都在这个副本上,比如修改它的名为 property 的属性会反射(reflect)到实际对象中,因为 obj 和你传递的引用的副本 < em>指向同一个对象。这就是第一种情况发生的情况。在第二种情况下,您只是尝试为您传递的引用副本分配一个新值。所以原始引用没有任何变化。

关于javascript - JS 通过引用传递给函数并可以覆盖属性,但不能覆盖整个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42353609/

相关文章:

逗号分隔小数的 Javascript 正则表达式

php - 在mysql数据库中存储可由JavaScript和HTML读取的特殊字符

javascript - 如何在浏览器中显示纯文本,从 API 获取

javascript - 如何使用 Javascript AJAX 请求(无 jQuery)仅获取文件的一部分

javascript - 响应式顶部导航——使用 div 重新定位链接?

javascript - 选择单选按钮后重定向到特定页面

javascript - Document.cookie 的 setter 在 Web 浏览器中是异步的吗?

javascript - 为什么 Canvas 的实现速度比 Pixi.JS 快?

javascript - 使用 Rails 6 制作 Highcharts

javascript - 使用 iOS 8 "Scan credit card"功能时,输入字段会触发什么 JS 事件?