我有一个对象,我将其作为参数传递给函数。在该函数内部我想为它赋予一个不同的值,但因为在函数内部我们只引用了原始对象,所以我们不能使用简单赋值=。
在ES2015中,我可以使用Object.assign
我是否可以在ES5中使用解决方法,而不是将属性复制到引用?
以下是https://jsbin.com/wimuvaqosi/1/edit?js,console
的示例var x = {prop:1};
function foo(x1) {
var y = {prop:2};
x1 = y; //this obviously does not work
//x1 = Object.assign(x1, y); //this works only in ES2015
}
foo(x);
console.log("x ", x);
答案 0 :(得分:8)
我是否可以在ES5中使用解决方法,而不是将属性复制到引用?
不是,Object.assign也只是复制属性。但您只需使用polyfill并在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;
};
}
答案 1 :(得分:1)
您似乎正在尝试将x
完全更改为其他对象。如果是这样,谢天谢地,你不能这样做。即使Object.assign(x, y)
只是将x
的属性复制到y
,就像@ baao的垃圾邮件一样。 x
仍然引用同一个对象。但你可以:
var x = {prop:1};
function foo(x1) {
var y = {prop:2};
return y;
}
x = foo(x);
console.log("x ", x);
或者
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);
IMO这些解决方案比你正在寻找的更好,因为调用者可以看到变量x
现在指向另一个对象 - 这可能很重要。例如,在Javascript语言中,调用者可能总是做出如下假设:
y = x;
foo(x);
y === x; // always true
我可以从查找表和其他结构中引用x
,这些不会被替换 - 它可能会变得非常混乱。在其他语言中,例如C#,您可以通过引用传递对象,但是有一个不同的调用签名,如foo(ref x);
,因此您可以轻松地看到在读取代码时可以替换x。