你可能写过这样的代码:使用和所分配的变量名称相同的名称初始化对象。html
let type = 'quartz'; let color = 'rose'; let carat = 21.29; const gemstone = { type: type, color: color, carat: carat }; console.log(gemstone);
看到重复的地方了吗?type: type、color: color
和 carat:carat
不显得很冗长吗?web
好消息是,若是属性名称和所分配的变量名称同样,那么就能够从对象属性中删掉这些重复的变量名称。算法
咱们来看看!code
let type = 'quartz'; let color = 'rose'; let carat = 21.29; const gemstone = { type, color, carat };
还有一种向对象中添加方法的简写方式。orm
let type = 'quartz'; let color = 'rose'; let carat = 21.29; let gemstone = { type, color, carat, calculateWorth() { ... } };
在 ES6 中甚至连function
关键字也不须要.htm
有时候咱们会在后台取出key
值,而不是咱们前台定义好的,这时候咱们如何构建咱们的key
值呢。好比咱们在后台取了一个key
值,而后能够用[ ]
的形式,进行对象的构建。对象
let key='skill'; let obj={ [key]:'web' } console.log(obj.skill);
ES5 比较两个值是否相等,只有两个运算符:相等运算符==
和严格相等运算符===
。它们都有缺点,前者会自动转换数据类型,后者的NaN
不等于自身,以及+0
等于-0
;部署
ES6
提出“Same-value equality”
(同值相等)算法,用来解决这个问题。Object.is
就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符===
的行为基本一致。get
Object.is('foo', 'foo') // true Object.is({}, {}) // false +0 === -0 //true NaN === NaN // false Object.is(+0, -0) // false Object.is(NaN, NaN) // true
Object.assign
方法用于对象的合并,将源对象(source)
的全部可枚举属性,复制到目标对象(target)
。it
Object.assign
方法的第一个参数是目标对象,后面的参数都是源对象。
const target = { a: 1 }; const source1 = { b: 2 }; const source2 = { c: 3 }; Object.assign(target, source1, source2); console.log(target) // {a:1, b:2, c:3}
若是目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
const target = { a: 1, b: 1 }; const source1 = { b: 2, c: 2 }; const source2 = { c: 3 }; Object.assign(target, source1, source2); console.log(target) // {a:1, b:2, c:3}
Object.assign
方法实行的是浅拷贝,而不是深拷贝。也就是说,若是源对象某个属性的值是对象,那么目标对象拷贝获得的是这个对象的引用。
const obj1 = {a: {b: 1}}; const obj2 = Object.assign({}, obj1); obj1.a.b = 2; obj2.a.b // 2
上面代码中,源对象obj1
的a
属性的值是一个对象,Object.assign
拷贝获得的是这个对象的引用。这个对象的任何变化,都会反映到目标对象上面。
为属性指定默认值
const DEFAULTS = { logLevel: 0, outputFormat: 'html' }; function processContent(options) { options = Object.assign({}, DEFAULTS, options); console.log(options); // ... }
面代码中,DEFAULTS
对象是默认值,options
对象是用户提供的参数。Object.assign
方法将DEFAULTS
和options
合并成一个新对象,若是二者有同名属性,则option
的属性值会覆盖DEFAULTS
的属性值。
注意,因为存在浅拷贝的问题,DEFAULTS
对象和options
对象的全部属性的值,最好都是简单类型,不要指向另外一个对象。不然,DEFAULTS
对象的该属性极可能不起做用。