数据类型
众所周知,javascript
是动态数据类型,也就是在使用 var(或let)
声明之后,可以被赋值为不同的类型。
javascript
包含字符串、数字、布尔、数组、对象等数据类型。可以使用 typeof
关键字查看当前变量的数据类型,获得的表明数据类型的结果是 string
。
1 | var a = 1; |
==
在javascript
中, 相等运算符 ==
在比较时会自动转换数据类型
1 | console.log(1 == '1'); // true |
这种比较机制在判断条件中也是有效的。
1 | if (0) // 等价于 if(false) |
这显然不是我们所期望的,所以又有了严格相等运算符 ===
。
===
1 | // - |
这似乎已经达到了我们的预期。但是也存在一些不能接受的情况。
1 | console.log(NaN === NaN); // false |
下面详细列举一下 ===
的判断流程:
- 如果 Type(x) 和 Type(y) 不同,返回 false
- 如果 Type(x) 为 Undefined,返回 true
- 如果 Type(x) 为 Null,返回 true
- 如果 Type(x) 为 Number,则进入下面的判断逻辑
- 如果 x 为 NaN,返回 false
- 如果 y 为 NaN,返回 false
- 如果 x 的数字值和 y 相等,返回 true
- 如果 x 是 +0 且 y 是 -0,返回 true
- 如果 x 是 -0 且 y 是 +0,返回 ture
- 返回 false
Object.is()
ES6
提出“Same-value equality”(同值相等)算法,用来解决这个问题。Object.is
就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符 ===
的逻辑判断基本一致。只有下面两种不同:
1 | +0 === -0 //true |