Object.is vs ===
Object.is 和 ===(严格等于运算符)都用于比较两个值是否相等,但它们在某些特殊情况下的行为有细微差别。
===
-
不会进行类型转换,如果两个值的类型不同,立即返回 false。
-
对于数值来说,NaN 不等于自身。
-
+0 和 -0 被认为是相等的。
Object.is
-
和 === 很相似,也不会进行类型转换。
-
Object.is 认为 NaN 等于自身。
-
+0 和 -0 被认为是不相等的。
使用场景
通常情况下,建议使用 ===,因为它的速度更快,也是JavaScript中比较常见的比较方式。 但是在以下特定场景中,您可能会选择使用 Object.is:
-
当您需要判断一个值是否确实是 NaN 时(因为 NaN === NaN 的结果是 false,而 Object.is(NaN, NaN) 的结果是 true)。
-
当您认为 +0 和 -0 应该是不相等的时候。
console.log(Object.is(NaN, NaN)); // 输出:true console.log(NaN === NaN); // 输出:false console.log(Object.is(+0, -0)); // 输出:false console.log(+0 === -0); // 输出:true
for...in
vs for...of
for...in
-
for...in 循环用于遍历一个对象的所有可枚举属性,包括继承的可枚举属性。
-
它遍历的是对象的键(key),不仅仅是数组,也包括其他类型的对象。
-
for...in 更适合遍历对象,不推荐用来遍历数组,因为它可能会得到意外的结果,如遍历到原型链上的属性或方法。
const object = { a: 1, b: 2, c: 3 }; for (const property in object) { console.log(property); // 输出 'a', 'b', 'c' }
for...of
-
for...of 循环用于遍历可迭代对象的元素,如数组、字符串、Map、Set等。
-
它直接遍历的是对象的值(value),提供了一种简洁的方法来迭代这些可迭代对象的元素。
-
for...of 不会遍历对象的属性,也不会遍历原型链上的属性。
const array = [1, 2, 3]; for (const value of array) { console.log(value); // 输出 1, 2, 3 }
使用场景
-
当你需要遍历一个对象的属性时,使用 for...in。
-
当你需要遍历一个数组或其他可迭代对象的元素时,使用 for...of。