当前位置: 首页 > 面试题库 >

JavaScript:如何按值传递对象?

於英朗
2023-03-14
问题内容
  • 当将对象作为参数传递时,JavaScript通过引用传递它们,这使得创建对象的本地副本变得困难。
var o = {};
(function(x){
var obj = x;
obj.foo = 'foo';
obj.bar = 'bar';
})(o)

o 将有.foo.bar

  • 通过克隆可以解决这个问题。简单的例子:
     var o = {};

    function Clone(x) {
       for(p in x)
       this[p] = (typeof(x[p]) == 'object')? new Clone(x[p]) : x[p];
    }

    (function(x){
        var obj = new Clone(x);
        obj.foo = 'foo';
        obj.bar = 'bar';
    })(o)

o 不会.foo.bar

  1. 除了创建本地副本/克隆以外,还有没有更好的方法可以按值传递对象?

问题答案:

并不是的。

根据你的实际需要,一个 可能性 可能是集o作为一个新的对象的原型。

var o = {};
(function(x){
    var obj = Object.create( x );
    obj.foo = 'foo';
    obj.bar = 'bar';
})(o);

alert( o.foo ); // undefined

因此,您添加到的任何属性obj都不会添加到中oobj使用与中的属性相同的属性名称添加到的任何属性o都将阴影该o属性。

当然,如果没有阴影,添加到的任何属性o都将可用obj,并且o原型链中所有对象的更新都将相同o

另外,如果obj具有引用另一个对象的属性(例如Array),则需要确保在将该对象添加到对象之前将其遮蔽,否则,这些成员将添加到中obj,并将在所有对象之间共享有obj原型链。

var o = {
    baz: []
};
(function(x){
    var obj = Object.create( x );

    obj.baz.push( 'new value' );

})(o);

alert( o.baz[0] );  // 'new_value'

在这里您可以看到,因为您没有使用bazon obaz属性将on 遮蔽在Array 上obj,所以o.bazArray被修改了。

因此,您需要先对其进行阴影处理:

var o = {
    baz: []
};
(function(x){
    var obj = Object.create( x );

    obj.baz = [];
    obj.baz.push( 'new value' );

})(o);

alert( o.baz[0] );  // undefined


 类似资料:
  • 问题内容: 基本类型(数字,字符串等)按值传递,但对象未知,因为它们都可以按值传递(如果我们认为保存对象的变量实际上是对该对象的引用) )和按引用传递(当我们认为对象的变量包含对象本身时)。 尽管最后并没有什么大不了,但我想知道呈现通过惯例的参数的正确方法是什么。是否有JavaScript规范的摘录,其中定义了与此相关的语义? 问题答案: JavaScript很有趣。考虑以下示例: 产生输出: 如

  • 本文向大家介绍JavaScript中的值是按值传递还是按引用传递问题探讨,包括了JavaScript中的值是按值传递还是按引用传递问题探讨的使用技巧和注意事项,需要的朋友参考一下 最近遇到个有趣的问题:“JS中的值是按值传递,还是按引用传递呢?”   在分析这个问题之前,我们需了解什么是按值传递(call by value),什么是按引用传递(call by reference)。在计算机科学里,

  • 问题内容: 我一直在尝试以下方法: 我得到的是: 因此,这意味着 my_list 是按值传递的,因为它没有突变。那么,是否将规则传递给另一个进程时确实按值传递规则呢?谢谢。 问题答案: 正如AndréLaszlo所说,该库需要对传递给方法的所有对象进行腌制,以将它们传递给工作进程。酸洗过程导致在工作进程中创建一个不同的对象,因此在工作进程中对该对象所做的更改不会影响父对象中的对象。在Linux上,

  • 纬度和经度都显示出来了,所以我知道脚本正在工作,直到得到纬度和经度。我的问题是在window.location.href中传递id值。我得到[object HtmlPanelment]作为我的值。这是我访问“虚拟网站”的URLhttps://https://my_website/index.php?category=fast 食物

  • 本文向大家介绍JS是按值传递还是按引用传递,包括了JS是按值传递还是按引用传递的使用技巧和注意事项,需要的朋友参考一下 按值传递 VS. 按引用传递 按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。   按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被

  • 问题内容: 我一直认为Java使用传递引用。 但是,我已经看到了几篇博客文章声称不是(博客文章说Java使用值传递)。 我不认为我能理解他们的区别。 有什么解释? 问题答案: Java总是按值传递。 不幸的是,我们根本不处理任何对象,而是处理称为引用的 对象句柄(当然是通过值传递)。选择的术语和语义很容易使许多初学者感到困惑。 它是这样的: 在上面的示例中仍将返回”Max”。值aDog内main未