Javascript 赋值给在ES5中作为参数传递的对象

Javascript 赋值给在ES5中作为参数传递的对象,javascript,ecmascript-5,Javascript,Ecmascript 5,我有一个对象,作为参数传递到函数中。在这个函数中,我想给它分配一个不同的值,但是因为在这个函数中,我们只有对原始对象的引用,所以不能使用简单的赋值= 在ES2015中,我可以使用 除了将属性复制到引用之外,在ES5中是否还有其他解决方法 这里有一个例子 除了将属性复制到引用之外,在ES5中是否还有其他解决方法 不是真的,Object.assign也只是复制属性。但您只需在es2015之前的代码中使用和使用Object.assign() if (typeof Object.assign != 'f

我有一个对象,作为参数传递到函数中。在这个函数中,我想给它分配一个不同的值,但是因为在这个函数中,我们只有对原始对象的引用,所以不能使用简单的赋值=

在ES2015中,我可以使用

除了将属性复制到引用之外,在ES5中是否还有其他解决方法

这里有一个例子

除了将属性复制到引用之外,在ES5中是否还有其他解决方法

不是真的,Object.assign也只是复制属性。但您只需在es2015之前的代码中使用和使用Object.assign()

if (typeof Object.assign != 'function') {
  Object.assign = function(target) {
    'use strict';
    if (target == null) {
      throw new TypeError('Cannot convert undefined or null to object');
    }

    target = Object(target);
    for (var index = 1; index < arguments.length; index++) {
      var source = arguments[index];
      if (source != null) {
        for (var key in source) {
          if (Object.prototype.hasOwnProperty.call(source, key)) {
            target[key] = source[key];
          }
        }
      }
    }
    return target;
  };
}
if(type of Object.assign!=“function”){
Object.assign=函数(目标){
"严格使用",;
if(target==null){
抛出新的TypeError('无法将未定义或null转换为对象');
}
目标=对象(目标);
for(var index=1;index
看起来您正试图将
x
完全更改为另一个对象。如果是这样,谢天谢地,你不能这么做。甚至
Object.assign(x,y)
只需将属性从
x
复制到
y
,就像@baao的polfill一样
x
仍然引用同一对象。但你可以:

var x = {prop:1};
function foo(x1) {
    var y = {prop:2};
    return y;
}
x = foo(x);
console.log("x ", x);

在我看来,这些解决方案比您想要的要好,因为调用者可以看到变量
x
现在指向不同的对象,这可能很重要。例如,在Javascript语言中,调用方可能总是做出如下假设:

 y = x;
 foo(x);
 y === x; // always true

我可以从查找表和其他结构中引用
x
,但这些不会被替换,这可能会让人非常困惑。在其他语言中,如C#可以通过引用传递对象,但有一个不同的调用签名,如
foo(ref x)
这样您就可以很容易地看到,当您阅读代码时,x可能会被替换。

在您的示例中:x1.prop=2;可以将每个对象修改为与另一个相等。无需重新创建一个
对象。assign
不会将
x
分配给其他对象。它将
y
的所有属性复制到
x
@baao的答案模仿了“Object.assign”的说法。很抱歉,你提出的是变通办法,而不是解决方案没有解决方案,所以变通办法是一个有用的答案。谢天谢地,为什么?我发现传递引用而不是传递对象本身非常重要confusing@daniel.sedlacek我编辑了答案来解释。这并不是说只有polyfill复制属性,这正是
Object.assign
所做的。
var x = {prop:1};
function foo(ref) {
    var y = {prop:2};
    ref.x = y;
}
var refX = {x: x};
foo(refX);
console.log("x ", refX.x);
 y = x;
 foo(x);
 y === x; // always true