平时写法
let name = 'doudou'; let age = 18; let obj = { name: name, age: age, run: function() { console.log('running') } } console.log(obj)简洁语法
let name = 'doudou'; let age = 18; let obj = { name, age, run() { console.log('running') } } console.log(obj)JavaScript 定义对象的属性,有两种方法。
// 方法一 obj.foo = true; // 方法二 obj['a' + 'bc'] = 123;但是,如果使用字面量方式定义对象(使用大括号),在 ES5 中只能使用方法一(标识符)定义属性。
var obj = { foo: true, abc: 123 };ES6 允许字面量定义对象时,用方法二(表达式)作为对象的属性名,即把表达式放在方括号内。
let propKey = 'foo'; let obj = { [propKey]: true, ['a' + 'bc']: 123 };表达式还可以用于定义方法名。
let obj = { ['h' + 'ello']() { return 'hi'; } }; obj.hello() // hi注意,属性名表达式与简洁表示法,不能同时使用,会报错。
// 报错 const foo = 'bar'; const bar = 'abc'; const baz = { [foo] }; // 正确 const foo = 'bar'; const baz = { [foo]: 'abc'};ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。
JavaScript 缺乏一种运算,在所有环境中,只要两个值是一样的,它们就应该相等。
ES6 提出同值相等算法,用来解决这个问题。Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。
对于基本数据类型;我们用户肉眼上看着相等就为true,看着不等就为false
Object.is(NaN,NaN); // true NaN == NaN; // false Object.is(+0,-0); // false +0 == -0 // true // 引用数据类型还是比较内存地址 Object.is({}, {}) // false用法
let 新对象 = Object.assign(目标对象,需要合并的对象)
// 返回目标对象
let json = {a:1}; let json2 = {b:2}; let json3 = {c:3}; // 后面的添加到第一个对象里并返回 let obj = Object.assign({},json,json2,json3); console.log(obj); // {a: 1, b: 2, c: 3} // 如果要合并的对象具有相同的的属性,则后面的覆盖前面的 let json = {a:1}; let json2 = {b:2 , a:2}; // a属性和json对象重复 let json3 = {c:3}; let obj = Object.assign({},json,json2,json3); console.log(obj); // {a: 2, b: 2, c: 3}如果合并的对象的属性名有重复就是后面的覆盖前面的
let json = {name:'wuwei'} let json2 = {name:'haha',age:18} let json3 = {name:'xiaxia',age:18,sex:1} let obj = Object.assign({},json,json2,json3); // {name: "xiaxia", age: 18, sex: 1}循环json 和对象
ES2017新增的
let json = { name: "wuwei", age : 18, sex: "男" } // 遍历属性 for(let key of Object.keys(json)){ console.log(key); // name age sex } // 遍历属性值 for(let val of Object.values(json)){ console.log(val); // wuwei 18 男 } // 遍历键值对 for(let item of Object.entries(json)){ console.log(item); // ["name", "wuwei"] ["age", 18] ["sex", "男"] } // 解构遍历的键值对 for(let [key,value] of Object.entries(json)){ console.log(key,value); // name wuwei age 18 sex 男 }也可以通过解构将Object身上的是哪个方法解构出来
// 解构Object身上的方法 let {keys,values,entries} = Object; let json = { name: "wuwei", age : 18, sex: "男" } // 遍历属性 for(let key of keys(json)){ console.log(key); // name age sex } // 遍历属性值 for(let val of values(json)){ console.log(val); // wuwei 18 男 } // 遍历键值对 for(let item of entries(json)){ console.log(item); // ["name", "wuwei"] ["age", 18] ["sex", "男"] } // 解构遍历的键值对 for(let [key,value] of entries(json)){ console.log(key,value); // name wuwei age 18 sex 男 }由于解构赋值要求等号右边是一个对象,所以如果等号右边是undefined或null,就会报错,因为它们无法转为对象。
let { x, y, ...z } = null; // 运行时错误 let { x, y, ...z } = undefined; // 运行时错误解构赋值必须是最后一个参数,否则会报错。
let { ...x, y, z } = obj; // 句法错误 let { x, ...y, ...z } = obj; // 句法错误注意,解构赋值的拷贝是浅拷贝,即如果一个键的值是复合类型的值(数组、对象、函数)、那么解构赋值拷贝的是这个值的引用,而不是这个值的副本。
let obj = { a: { b: 1 } }; let { ...x } = obj; obj.a.b = 2; x.a.b // 2扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中。
let z = { a: 3, b: 4 }; let n = { ...z }; n // { a: 3, b: 4 }这等同于使用Object.assign方法。
let aClone = { ...a }; // 等同于 let aClone = Object.assign({}, a);