首页 > 技术文章 > 你可能不知道的js -- 数据类型转换

hubufen 2020-04-30 11:08 原文

请先思考问题:
(a == 1 && a == 2 && a == 3)可能为true吗?

答案必然是可以的。

大家都知道,“ === ”是指类型和值都相等,而“ == ”只需要值相等。当两个数据类型不同的的情况下进行==比较时,会将不同的数据类型转换为同一数据类型,再进行比较。

什么时候(a == 1 && a == 2 && a == 3)为true?

解法一: 对象类型转换
var a = {
  i: 1,
  toString: function () {
    return a.i++
  }
}

Object类型与Number类型进行比较时,对象类型会转换为Number类型,对象转换为Number时,会尝试调用Object.valueOf()和Object.toString()来获取相应的数字基本类型

数组类型转换
let a = [1, 2, 3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3)

与上面类型转换一样,数组调用toString()会隐含调用Array.join()方法
而数组的shift方法的用法:shift()方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。如果数组是空的,那么shift()方法将不进行任何操作,返回undefined值。请注意,该方法不创建新数组,而是直接修改原有的arrayObject

所以我们可以看到a==1时会调用toString(),toString()方法调用join(),join()等于shift(),则转换为Number类型后为1

定义a的get
var val = 0; Object.defineProperty(window, 'a', { get: function() { return ++val; } }); console.log(a == 1 && a == 2 && a == 3);

使用一个get,让a的返回值为三个不同的值

推荐阅读