调用addKeyAndValue函数出现ReferenceError,求原因及解决方法
为啥会触发ReferenceError?还有如何实现你的需求?
嘿,我来帮你一步步理清问题所在!
首先,ReferenceError的直接原因
你调用函数的时候写的是addKeyAndValue(obj, isItawesome, true)——这里的isItawesome没有加引号,JS会把它当成一个变量去查找,但你根本没定义过这个变量啊!所以直接抛出了ReferenceError。
你真正想要的是把键名设为字符串"isItawesome",所以调用时第二个参数必须加引号,改成:
addKeyAndValue(obj, "isItawesome", true)
其次,就算解决了报错,你的代码逻辑也达不到预期
除了引号的问题,你的代码还有两个逻辑错误:
- 属性访问方式错了:
arr[i].key = value里的点语法会把key当成字面量属性名,也就是给每个对象加一个叫"key"的属性,而不是你传入的key变量对应的属性名。要使用变量作为属性名,必须用方括号语法:arr[i][key] = value。 - 返回结果不对:你
newOne.push(arr[i].key = value)其实是把赋值的结果(也就是true)push进去了,最后返回的newOne会是[true, true, true],而不是你想要的带新属性的对象数组。
修复后的代码方案
方案1:修改原数组(有副作用)
如果你不介意修改原数组里的对象,可以直接这样写:
obj = [{name: 'Elie'},{name: 'Tim'},{name: 'Elie'}] function addKeyAndValue(arr, key, value) { arr.forEach(function(val) { val[key] = value; // 用方括号访问变量属性名,直接修改原对象 }); return arr; // 返回修改后的原数组 } // 正确调用 console.log(addKeyAndValue(obj, "isItawesome", true));
方案2:不修改原数组(更推荐,无副作用)
如果不想改动原数组,用map方法生成新数组,同时拷贝原对象添加新属性:
obj = [{name: 'Elie'},{name: 'Tim'},{name: 'Elie'}] function addKeyAndValue(arr, key, value) { return arr.map(function(val) { // 展开原对象,添加新属性(ES6语法) return {...val, [key]: value}; // 如果环境不支持ES6,也可以用Object.assign: // return Object.assign({}, val, {[key]: value}); }); } console.log(addKeyAndValue(obj, "isItawesome", true));
这样就能得到你期望的结果啦!
内容的提问来源于stack exchange,提问作者dogamoluy
相关产品推荐
相关产品推荐

