You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用addKeyAndValue函数出现ReferenceError,求原因及解决方法

为啥会触发ReferenceError?还有如何实现你的需求?

嘿,我来帮你一步步理清问题所在!

首先,ReferenceError的直接原因

你调用函数的时候写的是addKeyAndValue(obj, isItawesome, true)——这里的isItawesome没有加引号,JS会把它当成一个变量去查找,但你根本没定义过这个变量啊!所以直接抛出了ReferenceError。

你真正想要的是把键名设为字符串"isItawesome",所以调用时第二个参数必须加引号,改成:

addKeyAndValue(obj, "isItawesome", true)

其次,就算解决了报错,你的代码逻辑也达不到预期

除了引号的问题,你的代码还有两个逻辑错误:

  1. 属性访问方式错了:arr[i].key = value里的点语法会把key当成字面量属性名,也就是给每个对象加一个叫"key"的属性,而不是你传入的key变量对应的属性名。要使用变量作为属性名,必须用方括号语法:arr[i][key] = value。
  2. 返回结果不对:你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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:34:19