在此代码中:
function myFunction(obj) {
console.log(obj);
}
var obj = {
key : 'value',
funct : function(){},
elem : document.getElementById('navigation').getElementsByTagName('a')
}
myFunction(obj);
对象“obj”是否在myFunction内的控制台中打印出我定义的同一个对象,或者是一个新实例?
另外,如果我将它从myFunction传递给另一个函数怎么办?
答案 0 :(得分:2)
它应该是您定义的同一个对象,无论您传递多少次,它都将继续使用相同的对象。为什么?你看到的东西表明情况并非如此吗?
您可能会感到困惑,因为原始值是按值传递的,而对象是通过引用传递的。
这是对差异的相当不错的描述:http://snook.ca/archives/javascript/javascript_pass
妙语可以是他的代码示例:
这是一个处理原始值的示例,在这种情况下是一个整数。有原始价值观, 原始值通过值传递,这意味着值的新副本将放置在具有函数调用的堆栈上。它还意味着对函数中的值所做的任何更改都是该函数的本地更改。
function myfunction(x)
{
// x is equal to 4
x = 5;
// x is now equal to 5
}
var x = 4;
alert(x); // x is equal to 4
myfunction(x);
alert(x); // x is still equal to 4
这是一个示例,显示了引用传递的工作原理。在这种情况下,对函数提供对象的引用,并且具有引用的每个人都可以看到对该对象的任何更改。
function myobject()
{
this.value = 5;
}
var o = new myobject();
alert(o.value); // o.value = 5
function objectchanger(fnc)
{
fnc.value = 6;
}
objectchanger(o);
alert(o.value); // o.value is now equal to 6
最后,如果用新引用替换传递给函数的引用,则此更改不会反映在函数外部。建立前一个例子:
function myobject()
{
this.value = 5;
}
var o = new myobject();
function objectchanger2(fnc)
{
function myObject2()
{
this.value = 10
}
fnc = new myObject2()
}
objectchanger(o);
alert(o.value); // o.value is still 5
答案 1 :(得分:2)
它是同一个对象,不是一个新实例。传递给函数的是对象的引用,而不是对象的副本。 JavaScript是一种纯粹的传值语言。传递给对象的函数(并保存在变量等中)的值是引用到对象,而不是对象本身。
您可以通过在函数中修改对象并查看是否看到这些mod来轻松证明对象未被复制:
function foo(obj) {
alert(obj.prop1);
obj.prop2 = "foo";
}
var thingy = {
prop1: 'bar'
}
foo(thingy);
alert(thingy.prop2);
通过上述内容,您首先看到foo
显示prop1
thingy
属性的警告,然后您会看到显示prop2
的外部代码的警告分配给foo
。
答案 2 :(得分:2)
这很容易为自己回答。试试这段代码,看看会发生什么:
function Test(obj) {
obj.Whatever = "!";
}
var testObj = { original: true };
Test(testObj);
alert(testObj.Whatever);
如果警报显示“未定义”,则在传入函数时进行了复制。如果警报显示“!”,则您将对象本身(或引用或指针)传递给函数。
我很确定你会看到“!”
答案 3 :(得分:2)
所有非基元都在JavaScript中通过引用传递 - 也就是说,它们是同一个对象。但是,原语是通过值传递的:
function change(a) {
a = 2;
}
var a = 1;
change(a);
alert(a); // should alert 1
function change2(a) {
a.test = 2;
}
var obj = {test:1};
change2(obj);
alert(obj.test); // should alert 2
答案 4 :(得分:1)
我相信javascript通过引用传递,因此myFunction将看到对同一对象的引用。