在前面我们介绍了使用JSON.stringify 来过滤对象的属性的方法。这里,我们介绍另外一种使用ES6 中的解构赋值 和拓展运算符 的特性来过滤属性的方法。
比如,下面这段示例:
// 我们想过滤掉对象 types 中的 inner 和 outer 属性 const { inner, outer, ...restProps } = { inner: 'This is inner', outer: 'This is outer', v1: '1', v2: '2', v4: '3' }; console.log(restProps); // {v1: "1", v2: "2", v4: "3"}
用解构赋值获取嵌套对象的属性
解构赋值 的特性很强大,它可以帮我们从一堆嵌套很深的对象属性中,很方便地拿到我们想要的那一个。比如下面这段代码:
// 通过解构赋值获取嵌套对象的值 const car = { model: 'bmw 2018', engine: { v6: true, turbo: true, vin: 12345 } }; // 这里使用 ES6 中的简单写法,使用 { vin } 替代 { vin: vin } const modalAndVIN = ({ model, engine: { vin }}) => { console.log(`model: ${model}, vin: ${vin}`); } modalAndVIN(car); // "model: bmw 2018, vin: 12345"
合并对象
ES6 中新增的拓展运算符,可以用来解构数组,也可以用来解构对象,它可以将对象中的所有属性展开。
通过这个特性,我们可以做一些对象合并的操作,如下:
// 使用拓展运算符合并对象,在后面的属性会重写前面相同属性的值 const obj1 = { a: 1, b: 2, c: 3 }; const obj2 = { c: 5, d: 9 }; const merged = { ...obj1, ...obj2 }; console.log(merged); // {a: 1, b: 2, c: 5, d: 9} const obj3 = { a: 1, b: 2 }; const obj4 = { c: 3, d: { e: 4, ...obj3 } }; console.log(obj4); // {c: 3, d: {a: 1, b: 2, e: 4} }
使用 === 代替 ==
在JavaScript 中,=== 和== 是有很大的不同的,== 会将两边的变量进行转义,然后将转义后的值进行比较,而=== 是严格比较,要求两边的变量不仅值要相同,它们自身的类型也要相同。
JavaScript 经常被调侃成一个神奇的语言,就是因为它的转义的特性,而用== 可能会引入一些深埋的bug。远离 bug,还是要用===:
[10] == 10 // true [10] === 10 // false '10' == 10 // true '10' === 10 // false [] == 0 // true [] === 0 // false '' == false // true '' === false // false
当然,在用=== 时,也会出问题,比如:
NaN === NaN // false
ES6 中提供了一个新的方法:Object.is(),它具有=== 的一些特点,而且更好、更准确,在一些特殊场景下变现的更好:
Object.is(0 , ' '); //false Object.is(null, undefined); //false Object.is([1], true); //false Object.is(NaN, NaN); //true
下图,是关于==、=== 和Object.is 的对比:
您可能感兴趣的文章: