什么是'值是引用'表示JavaScript对象
What does 'value is a reference' mean for JavaScript objects
我试图理解JavaScript中变量和对象的传递,看到了这个页面
据解释,JavaScript对象是通过值传递的,但值本身是一个引用。尽管我理解那一页上给出的例子中发生了什么,但我仍然困惑于为什么。有人能解释一下"价值本身就是参考"是什么意思吗?
有些语言对函数参数有"通过引用传递"的概念,这意味着当您调用一个函数并通过引用传递变量时,该函数可以修改原始变量以保存其他值-它引用了原始变量。
使用"按值传递",当您调用一个函数并传入一个变量时,该函数只获取值,因此无法更改传入的原始变量。
JS只有"pass-by-value",但当您将对象作为参数传递时,"value"是对原始对象的引用,因此函数可以修改、创建或删除该对象的属性,但函数不能修改原始变量以引用其他对象或值。
示例:
function changeObj(someObj) {
someObj.a = 1000;
someObj.c = "test";
someObj = { "x" : 5 };
console.log(someObj); // { "x" : 5 }
}
var o = { "a" : 1, "b" : 2 };
changeObj(o);
console.log(o); // { "a" : 1000, "b" : 2, "c" : "test" }
我展示的代码创建了一个变量o
,它引用了一个具有a
和b
属性的对象。然后它调用函数changeObj
并传入o
。该函数更改a
属性的值并创建一个新的c
属性-该函数正在修改变量o
引用的同一对象,因为它引用了该对象。但随后函数将someObj
赋值为一个全新的对象。这根本不会影响o
,因为函数只引用了o
所指向的对象,而不能访问o
变量本身。
与Java、Python和许多其他语言一样,在JavaScript中,对象不是值。
这意味着,当你计算一个表达式时,你从中得到的值要么是基元,要么是引用(引用是指向对象的指针)。创建对象时,该表达式的计算结果为引用。当您访问对象的字段或调用对象的方法时,左边的内容是引用。基本上,您对对象所做的任何操作都必须通过对对象的引用来完成。没有直接处理对象的语法。
不能有一个值"是"对象的变量(与C++不同,在C++中,既可以有值为对象的变量,也可以有值指向对象的指针的变量);只能有一个变量,其值是指向对象的引用。
这一点很明显,因为当您指定一个变量时,永远不会创建新对象。指定引用时,指定的变量具有原始引用值的副本,因此指向与原始引用相同的对象。在变量中没有任何内容可以导致指定它来创建新对象。
所以,如果有人说"将对象传递给函数",我会说,不,你不能传递对象,因为对象不是值。您必须传递对对象的引用。就像赋值一样,当传递引用时,它的值会被复制。JavaScript总是按值传递。
据解释,JavaScript对象是通过值传递的,但值本身是一个引用。
这是相当令人困惑的措辞。它们的意思是,当对象传递给函数时,传递的是指向对象的引用值,而不是实际对象。
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 循环遍历以数组为值的Javascript对象
- 从ajax请求中获取javascript对象
- 如何从对象的原型方法访问JavaScript对象属性
- 将XML转换为普通的旧JavaScript对象
- 通过引用传递JavaScript对象
- javascript对象操作:根据指定条件选择属性
- Javascript对象类在单击时打开窗口进行颜色选择,并在更改时替换对象背景颜色
- 如何在异步函数中使用javascript对象
- 临时Javascript对象
- 如何在ASP中为用户控件添加Javascript对象网
- 使用数组向下搜索Javascript对象
- Rails将JavaScript对象存储到Model的有效方式
- JavaScript对象不是从原型链继承的
- 如何创建具有默认值的JavaScript对象字段?(AngularJS模型相关)
- SetInterval在javascript对象中表现怪异
- Javascript 对象和 this 关键字
- 如何在不知道关键字的情况下访问javascript对象值
- 在 JavaScript 对象中设置要使用的运算符的属性
- 如何搜索JavaScript对象并更改值