资讯专栏INFORMATION COLUMN

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

learning / 864人阅读

摘要:面试官和有什么区别童鞋要求数据类型相同,会进行隐式类型转换面试官能输出么童鞋下面,我们来一起看看和到底有什么区别,以及上面问题的解法。其中,被称为引用数据类型,其他种被称为基本数据类型。是一种类似于字符串的,表示独一无二值的数据类型。

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

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

数据类型

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

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

隐式类型转换

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

类型(x) 类型(y) 结果
undefined null true
String Number toNumber(x) == y
Boolean 任何数据类型 toNumber(x) == y
Object 任何数据类型 toPrimitive(x) == y
Symbol 任何数据类型 false

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

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

类型 结果
undefined NAN
null 0
Boolean 任何数据类型
String Number

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
  }
}

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

本文首发于:https://github.com/yingye/Blog/issues/1

欢迎各位关注我的Blog,正文以issue形式呈现,喜欢请点star,订阅请点watch~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107762.html

相关文章

  • ++[[]][+[]]+[+[]]==10? 深入浅出弱类型 JS 的隐式转换

    摘要:与此相对,强类型语言的类型之间不一定有隐式转换。三为什么是弱类型弱类型相对于强类型来说类型检查更不严格,比如说允许变量类型的隐式转换,允许强制类型转换等等。在中,加性运算符有大量的特殊行为。 从++[[]][+[]]+[+[]]==10?深入浅出弱类型JS的隐式转换 本文纯属原创? 如有雷同? 纯属抄袭? 不甚荣幸! 欢迎转载! 原文收录在【我的GitHub博客】,觉得本文写的不算烂的...

    miya 评论0 收藏0
  • 你不知道的js中关于this绑定机制的解析[看完还不懂算我输]

    摘要:绑定书中提到在中,实际上并不存在所谓的构造函数,只有对于函数的构造调用。规则使用构造调用的时候,会自动绑定在期间创建的对象上。指向新创建的对象绑定比隐式绑定优先级高。 showImg(http://ww1.sinaimg.cn/large/005Y4rCogy1fstcwvzkjzj30sg0g0qqn.jpg); 前言 最近正在看《你不知道的JavaScript》,里面关于this绑...

    dunizb 评论0 收藏0
  • 性能优化详解

    摘要:几个月前面试的时候问我性能优化我可能会开始背诵雅虎军规,加点,代码层面稍稍讲点,现在系统的梳理下性能优化的方方面面本文涉及方面有代码优化网络请求过程角度入手解析建立链接网络往返时延数据传输网络问题角度入手请求数量流量性能优化测试工具代码优化 几个月前面试的时候问我性能优化我可能会开始背诵雅虎军规,加点webp,代码层面稍稍讲点,现在系统的梳理下性能优化的方方面面 本文涉及方面有: 代...

    piapia 评论0 收藏0
  • 性能优化详解

    摘要:几个月前面试的时候问我性能优化我可能会开始背诵雅虎军规,加点,代码层面稍稍讲点,现在系统的梳理下性能优化的方方面面本文涉及方面有代码优化网络请求过程角度入手解析建立链接网络往返时延数据传输网络问题角度入手请求数量流量性能优化测试工具代码优化 几个月前面试的时候问我性能优化我可能会开始背诵雅虎军规,加点webp,代码层面稍稍讲点,现在系统的梳理下性能优化的方方面面 本文涉及方面有: 代...

    godlong_X 评论0 收藏0
  • 33 个 js 核心概念(四):显式 (名义) 与 隐式 (鸭子)类型转换

    摘要:相对于显式使用,隐式转换则更加简洁。隐式转换为布尔值将其他类型值隐式转换为布尔值是我们最常用的一种转换。在以下场景中,都是进行判断,而只要传入的值不是布尔值,都会通过隐式类型转换转为布尔值。原文地址阿木木的博客与隐式鸭子类型转换 showImg(https://segmentfault.com/img/remote/1460000017309581); 前言 说实话,JavaScrip...

    hoohack 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<