这是我的对象文字:
var obj = {key1: value1, key2: value2};
如何将值为3的字段key3添加到对象中?
这是我的对象文字:
var obj = {key1: value1, key2: value2};
如何将值为3的字段key3添加到对象中?
当前回答
大多数答案中已经提到了两种最常用的方法
obj.key3 = "value3";
obj["key3"] = "value3";
定义属性的另一种方法是使用Object.defineProperty()
Object.defineProperty(obj, 'key3', {
value: "value3", // undefined by default
enumerable: true, // false by default
configurable: true, // false by default
writable: true // false by default
});
当您希望在定义属性时拥有更多控制权时,此方法非常有用。用户可以将定义的属性设置为可枚举、可配置和可写。
其他回答
根据ECMA-262中定义的属性访问器(http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf,P67),有两种方法可以将财产添加到现有对象。通过这两种方式,Javascript引擎将对它们一视同仁。
第一种方法是使用点符号:
obj.key3 = value3;
但是这样,您应该在点符号后使用IdentifierName。
第二种方法是使用括号表示法:
obj["key3"] = value3;
以及另一种形式:
var key3 = "key3";
obj[key3] = value3;
这样,您可以在括号符号中使用表达式(包括标识符名称)。
您可以使用其中一个(前提是key3是您想要使用的实际键)
arr[ 'key3' ] = value3;
or
arr.key3 = value3;
如果key3是变量,则应执行以下操作:
var key3 = 'a_key';
var value3 = 3;
arr[ key3 ] = value3;
之后,请求arr.a_key将返回值3,即文本3。
大多数答案中已经提到了两种最常用的方法
obj.key3 = "value3";
obj["key3"] = "value3";
定义属性的另一种方法是使用Object.defineProperty()
Object.defineProperty(obj, 'key3', {
value: "value3", // undefined by default
enumerable: true, // false by default
configurable: true, // false by default
writable: true // false by default
});
当您希望在定义属性时拥有更多控制权时,此方法非常有用。用户可以将定义的属性设置为可枚举、可配置和可写。
表演
今天2020.01.14,我在Chrome v78.0.0、Safari v13.0.4和Firefox v71.0.0上对MacOs HighSierra 10.13.6进行了测试,以获得选定的解决方案。我将解分为可变的(第一个字母M)和不可变的(第二个字母I)。我还提供了一些不可变的解决方案(IB、IC、ID/IE),这些解决方案尚未在回答这个问题时发布
结论
最快的可变解决方案比最快的不可变解决方案快得多(>10倍)像obj.key3=“abc”(MA,MB)这样的经典可变方法是最快的对于不可变的解决方案,{…obj,key3:'abc'}和Object.assign(IA,IB)是最快的令人惊讶的是,对于chrome(MC-IA)和safari(MD-IB),存在比某些可变解决方案更快的不可变解决方案
细节
在下面的片段中,有经过测试的解决方案,您可以在这里从您的机器上进行测试(2022年更新:我向Josh DeLong表示感谢,他从jspref.com重写了测试,jsbench.me停止工作)变量o={key1:真,键2:3,};var log=(s,f)=>console.log(`${s}-->${JSON.stringify(f({…o}))}`);函数MA(obj){obj.key3=“abc”;返回obj;}函数MB(obj){obj['key3']=“abc”;返回obj;}函数MC(obj){Object.assign(obj,{key3:'abc'});返回obj;}函数MD(obj){Object.defineProperty(obj,'key3'{value:“abc”,//默认情况下未定义enumerable:true,//默认为false可配置:true,//默认为false可写:默认为true//false});返回obj;}函数IA(obj){return{…obj,key3:'abc'};}函数IB(obj){return Object.assign({key3:'abc'},obj);}函数IC(obj){let ob=JSON.parse(JSON.stringify(obj))ob.key3=“abc”;返回ob;}函数ID(obj){let ob=Object.fromEntries(Object.entries(obj));ob.key3=“abc”;返回ob;}函数IE(obj){return Object.fromEntries(Object.entries(obj).contat([['key3','abc']]))}日志('MA',MA);日志('MB',MB);日志('MC',MC);日志('MD',MD);日志(‘IA’,IA);日志('IB',IB);日志('IC',IC);日志('ID',ID);日志('IE',IE);此代码段仅显示代码-它本身不执行测试!
var employees = [];
employees.push({id:100,name:'Yashwant',age:30});
employees.push({id:200,name:'Mahesh',age:35});