携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
日常js小技巧在线更新中。
为什么你应该在相等比较中使用 Object.is()
我们都知道 JavasSript 是弱类型编程语言,并且当我们使用 == 做比较时会存在隐性转换,在一些情况下由于类型转换再比较,会出现意想不到的结果。举个例子:
0 == ''; // true
null == undefined; // true
0 == false; // true
[1] == true; // true
因此 JavasSript 给我们提供了全等操作符 ===, 它比==不全等操作符更加严格并且对比的时候不会发生类型转换。在大多数情况下,=== 能满足我们的要求,但是用 === 来进行比较并不是最好的解决方案。你可能会得到:
NaN === NaN; // false
好消息是 ES6 中提供了新的对比方法 Object.is() ,相对 === ,Object.is() 表现得更严谨:
Object.is(NaN, NaN); // true
Object.is(0, ''); // false
Object.is(null, undefined); // false
Object.is(0, false); // false
Object.is([1], true); // false
Mozilla 团队并不认为 Object.is() 比 === 更加严格,他们认为我们应该考虑的是这个方法如何处理 NaN, -0 和 +0。但是总的来说, 我认为它在实际应用中是一个很好的实践,一些案例对比参考:
迭代一个空数组
JavaScript 中使用 new Array() 方法传一个number参数直接创建的数组(如new Array(4)),只是声明了数组的长度,数组实际没有元素,使用 map 遍历的时候,会有意想不到的结果:
let arr = new Array(4).map((elem, index) => index); // arr: [空属性 × 4]
想要解决这个问题,你可以使用在创建新数组的时候使用 Array.apply :
let arr = Array.apply(null, new Array(4)).map((elem, index) => index); // arr: [0, 1, 2, 3]
也可以:
let arr = [...new Array(4).keys()].map((elem, index) => index); // arr: [0, 1, 2, 3]
更多场景,大家可以自由发挥😜
给方法传一个空参数
调用 JavaScript 的方法,当你不填其中的一个参数时候, JavaScript 就会报错,例如:
function foo (a, b, c) {
console.log(a, b, c)
};
foo(1,,2); // Uncaught SyntaxError: Unexpected token ','
一个人们常用的解决方法是把不想传递的参数用 null 或 undefined 或 '' 等替换一下。根据 ES6 中对扩展运算符 ... 的介绍,有一个更简洁的方法可以将空参数传递给一个方法:
foo(...[1,,2]); // 1 undefined 2
本期小技巧就到这里🤳