面试题:JS中的隐式转换 和 显示转换

84 阅读2分钟

面试题:

  1. 相等操作符 和 全等操作符的区别: 会发生隐式转换
  2. '5'==5---> true : 因为一侧数字,一侧字符串, 字符串会---> 数字
  3. true == 5 ---> false : 因为一侧boolean,转换boolean
  4. 逻辑或 如果第一个参数隐式转换后为false ,则直接返回第一个
  5. Boolean() 有6中情况为false,其他为true

一. 显式转换

Number()

  • undefiend :NaN
  • null:0
  • symbol:报错
  • true: 1, false:0
  • object: 对象会先调用 valueOf() 方法,如果结果不是原始类型,再调用 toString() 方法,然后将结果转换为数字。
  • bigInt: 去掉n

parseInt相比Number,就没那么严格了,parseInt函数逐个解析字符,遇到不能转换的字符就停下来

Boolean()转换以下6种情况为false,其他为true:

  1. undefined
  2. null
  3. false
  4. +0,-0
  5. NaN
  6. ""

String() || toString() 转换为字符串

  • 对于 null 和 undefined: String()
  • 其他对象: toString()

二. 隐式转换

所谓隐式转换,就是说在进行一些操作的时候,两边类型不同的情况下, 使用Number()或者Boolean() 默默进行转换后再比较或者判断!!! 所以哪些能转成什么结果还是要看上面的显式转换规则;

隐式转换操作符:

1. Boolean() - 转换为布尔值

在逻辑运算(&&||)、条件语句(ifwhile)、三元运算符(? :)等情况下会发生Boolean()进行隐式转换

  • 与 &&: 第一个参数(进行隐式转换)为false的话,直接返回第一个
  • 或 ||: 第一参数为false的话,直接返回第二个 image.png

2. Number() - 转换为数字

一元加 +, 算术运算符:(-*/%),比较运算符(>,<)

  • 字符串 ---> 数字
    • 无法转换的的显示NaN,如'abc'-10 ===> NaN;
    • 可以转换的 如'2'-1 ==> 1

3. toString() - 转换为字符串

+ 运算符,一侧是字符串, 一侧是数值,则进行字符串拼接如"abc" + 10 => "abc10"

遇到复杂数据类型的时候,先转成原始数据类型,然后再转成字符串

image.png

相等操作符隐式转换规则

  1. 一侧布尔值,则将其转换为数值
  2. 一侧字符串,一侧数值,则尝试将字符串转换为数值
  3. 一侧对象,另一个操作数不是,则调用对象的 valueOf()方法取得其原始值,再根据前面的规则进行比较
  4. nullundefined相等
  5. 如果有任一操作数是 NaN ,则相等操作符返回 false
  6. 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true