从 == 和 === 入手,聊聊隐式类型转换

面试官:== 和 === 有什么区别?
童鞋:=== 要求数据类型相同,== 会进行隐式类型转换...
面试官:JavaScript:(a==1 && a==2 && a==3)能输出true么?
童鞋:???

下面,我们来一起看看 == 和 === 到底有什么区别,以及上面问题的解法。

数据类型

JavaScript 语言中,数据类型有:undefined、null、Boolean、String、Number、Object、Symbol。

其中,Object被称为引用数据类型,其他6种被称为基本数据类型。Symbol 是一种类似于字符串的,表示独一无二值的数据类型。

隐式类型转换

做一个小实验,得出不同类型的值用 == 操作符比较后的结果

类型(x)类型(y)结果
undefinednulltrue
StringNumbertoNumber(x) == y
Boolean任何数据类型toNumber(x) == y
Object任何数据类型toPrimitive(x) == y
Symbol任何数据类型false

toNumber() 和 toPrimitive() 方法是内部的,可以看一下估值

toNumber() 方法,比较好理解,就是转换成 Number 类型,类似 Number() 方法。

类型结果
undefinedNAN
null0
Boolean任何数据类型
StringNumber

toPrimitive() 方法

类型结果
Object如果对象的 valueOf 方法的结果是原始值,返回原始值; 如果对象的 toString 方法返回原始值,就返回这个值; 其他情况都返回一个错误

举个例子,来说明一下 toPrimitive() 方法

let test = {
  value: 0,
  valueOf () {
    console.log('in valueOf fun')
    return this.value
  },
  toString () {
    console.log('in toString fun')
    return this.value
  }
}

console.log('test == 0 ?', test == 0)
复制代码

控制台输出结果:

回到面试题

JavaScript:(a==1 && a==2 && a==3)能输出true么?

let a = {
  value: 0,
  valueOf () {
    return ++this.value
  }
}
复制代码

面试遇到隐式类型转换,再也不会怕啦~

本文首发于:github.com/yingye/Blog…

欢迎各位关注我的Blog,喜欢请点star,订阅请点watch~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值