理解JavaScript的传值

时间:2014-05-05 10:40:30

标签: javascript compiler-construction

众所周知,JavaScript中的所有内容都是按值传递的,即使是 Objects ,因为函数参数被视为对象的实际引用的传值。

我的问题是,我有可能访问一个Object,就像我可以修改它的属性一样 - 谈论作为参数传递给函数的对象,但我可以重写对象本身?

这是一种有意识的机制来避免某些错误,还是只是设计缺陷或限制?如果它是故意想要实现的目标呢?能够重写对象本身有什么额外的好处以及可能发生的错误/错误类型?

我完全理解它是由对象引用的值传递引起的,但是我无法弄清楚是什么阻止我重写对象,我已经有了它的引用副本 - 和我也可以修改它。

示例:

var x = { arr: [1,2,3] };

var modify = function ( _x ) {
    _x.arr.push(4);
}

var rewrite = function ( _x ) {
    _x = { str: "X" };
    // OR
    _x = "X";
}

modify(x);
console.log( "X after modification: ", x );
rewrite(x);
console.log( "X after rewrite: ", x );

jsFiddle

2 个答案:

答案 0 :(得分:3)

在修改或重写方法内部,变量x和_x是对同一对象的引用。重写函数将_x变量更改为指向另一个对象。这不会更改仍然指向原始对象的x变量引用。

答案 1 :(得分:2)

您可以使用其他值覆盖引用,也可以更改引用的对象的属性。

JavaScript无法更改引用指向的位置。语法不存在,这就是你无法做到的原因。