重新分配函数返回的引用对象

时间:2019-04-02 01:36:32

标签: javascript javascript-objects lvalue

创建对象并从函数返回它。

var obj = {
    color : 'green'
}

function returnObj(){
    return obj
}

console.log(JSON.stringify(obj))
>>>{color : 'green'}

以这种方式添加新的键值对有效。 返回值(例如对象或数组)的条目是引用。

returnObj().size = "big"
console.log(JSON.stringify(obj))
>>>{color : 'green', size  : 'big'}

将其重新分配给新对象无效。

returnObj() = { yellow : 'house'}
>>> ReferenceError: Invalid left-hand side in assignment

我要执行的是强制该函数返回l值而不是r值。 以下内容也不起作用。

returnObj().this = { yellow : 'house'}
console.log(JSON.stringify(obj))
>>>{"color":"green","size":"big","this":{"yellow":"house"}}

这样做的原因是,根据用户设置,有不同的对象要引用。

var data = {
house: {color: 'green'}
car : {speed: "fast"},
}

var setting = 'house'

function returnDataObj(){
return obj[setting]
}

2 个答案:

答案 0 :(得分:0)

您不能以这种方式为函数分配值。您应该将参数传递给函数(returnObj) 例如

var obj = {
color : 'green'
}

function returnObj(key , value){
  obj[key] = value;
  return obj;
}

obj = returnObj("size","big");
console.log(JSON.stringify(obj))

答案 1 :(得分:0)

函数返回总是返回一个值而不是引用。 对象条目和数组条目是该值内的引用。

var obj = { color : 'green' }

var reference_to_obj = obj
reference_to_obj.color = 'red'
console.log(obj.color)
>>>red

function return_obj(){return obj}
return_obj().color = "blue"
console.log(obj.color)
>>>blue

所有三个对象都引用相同的对象内容

但是我们可以将名称“ reference_to_obj”重新分配给另一个值

reference_to_obj = 'string'

函数return_obj()的行为类似于对该对象的“匿名”引用。 仅了解对象/数组的内容,但忽略了变量名保存在其下。

return_obj() = {} //is similar to 
AnonymousReference_1231kf10h1kf1 = {} // pseudocode for illustration

解决方法:

1。将动态参考存储在变量中。不幸的是,您必须记住在引用应该更改时调用更新函数

var objectReference;
function updateObjectReference(){
objectReference = obj[setting]
}

2。内部嵌套:深一层

var obj = {content : {color: green}}
returnObj().content = {size: big}

3。外部嵌套:全局对象窗口。

window[returnObjectNameString()]={size: big}

4。函数返回对象,但也可以替换它。

function returnObj(replacementObj){
if(typeof replacementObj !== 'undefined'){ obj = replacementObj }
return obj
}

5。删除所有值并分配新值。注意:它将仍然是一个对象。

var props = Object.keys(returnObj());
for (var i = 0; i < props.length; i++) {
  delete returnObj()[props[i]];
}