数据类型

众所周知,javascript 是动态数据类型,也就是在使用 var(或let) 声明之后,可以被赋值为不同的类型。
javascript 包含字符串、数字、布尔、数组、对象等数据类型。可以使用 typeof 关键字查看当前变量的数据类型,获得的表明数据类型的结果是 string

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var a = 1;
console.log(typeof a); // number
console.log(typeof(typeof a)); // string
a = '1';
console.log(typeof a); // string
a = true;
console.log(typeof a); // boolean
a = [];
console.log(typeof a); // object
a = {};
console.log(typeof a); // object
a = null;
console.log(typeof a); // object
a = undefined;
console.log(typeof a); // undefined

==

javascript 中, 相等运算符 == 在比较时会自动转换数据类型

1
2
3
4
5
console.log(1 == '1'); // true
console.log(1 == true); // true
console.log(0 == false); // true
console.log(null == undefined); // true
console.log(null == false); // false

这种比较机制在判断条件中也是有效的。

1
2
if (0) // 等价于 if(false)
while (1) // 等价于 while (true)

这显然不是我们所期望的,所以又有了严格相等运算符 ===

===

1
2
3
4
// -
console.log(1 === '1'); // false
console.log(1 === true); // false
console.log(0 === false); // false

这似乎已经达到了我们的预期。但是也存在一些不能接受的情况。

1
console.log(NaN === NaN); // false

下面详细列举一下 === 的判断流程:

  1. 如果 Type(x) 和 Type(y) 不同,返回 false
  2. 如果 Type(x) 为 Undefined,返回 true
  3. 如果 Type(x) 为 Null,返回 true
  4. 如果 Type(x) 为 Number,则进入下面的判断逻辑
    1. 如果 x 为 NaN,返回 false
    2. 如果 y 为 NaN,返回 false
    3. 如果 x 的数字值和 y 相等,返回 true
    4. 如果 x 是 +0 且 y 是 -0,返回 true
    5. 如果 x 是 -0 且 y 是 +0,返回 ture
  5. 返回 false

Object.is()

ES6 提出“Same-value equality”(同值相等)算法,用来解决这个问题。Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等,与严格比较运算符 === 的逻辑判断基本一致。只有下面两种不同:

1
2
3
4
5
+0 === -0 //true
NaN === NaN // false

Object.is(+0, -0) // false
Object.is(NaN, NaN) // true