跳至主要內容

01.类型是如何转换的?

pinia大约 2 分钟面试题

类型转换规则

  • 原始-->数字
    • true:1
    • false:0
    • null:0
    • undefined:NaN
    • String
      • 空字符串(含空白字符):0
      • 去掉引号,不是数字就是NaN
  • 其他类型-->bool
    • null:false
    • undefined:false
    • number
      • 0:false
      • NaN:false
      • 其他:true
    • string
      • 空字符串:false
      • 其他:true
    • 对象:true
  • 原始-->字符串
    • null:'null'
    • undefined:'undefined'
    • number:'数字'
    • boolean
      • true:'true'
      • false:'false'
  • 对象-->原始
    • 调用valueof-->得到的是对象?重新调用toString-->得到的还是对象?报错

运算规则

  • 算数运算符:+ - * / % ++ --
    • 转换为原始类型
      • 转换为数字,然后再进行运算
      • 特殊情况:x+y,x+y有一个字符串,转换为字符串,然后拼接
      • 特殊情况:NaN和任何类型运算的到的还是NaN
  • 比较运算符:> < >= <= == != === !==
    • (> < >= <=)
      • 转换成原始类型
        • 转换成数字,再进行比较
        • 特殊情况:俩端全是字符串,比较字典的顺序
        • 特殊情况:俩端存在NaN,一定是false
    • ===
      • 类型和值必须相同
      • 特殊情况:俩端存在NaN,一定为false
    • ==
      • 俩端类型相同,比较值
      • 俩端都是原始类型,转换成数字比较
      • 一端是原始类型,一端是对象类型,把对象转换成原始类型在进行比较
      • 特殊情况:undefined和null只有与自身比较,或者互相比较时,才会返回true
      • 特殊情况:俩端存在NaN,一定为false
    • != !==
      • 对等取反
  • 逻辑运算符:!&& || ?:
    • 转换为boolean
      • x&&y
        • x为false,返回x
        • x为true,返回y
      • x||y
        • x为false,返回y
        • x为true,返回x

表达式

概念:数据与运算符的结合

Number('123')			+'123'
Boolean('123')			!!'123'
if(a = undefined||a = null){a = 10}		a = a||10
user && user.addr && user.addr.city

面试题

  let a = {
    n: 0,
    valueOf: function () {
      return ++this.n
    }
  }
  console.log(!!(a == 1 && a == 2 && a == 3))
console.log(([][[]]+[])[+!![]]+([]+{})[+!![] + +!![]])
/**
 * ([][[]]+[])[+!![]]+([]+{})[+!![] + +!![]]
 * ([]['']+[])[+!![]]+([]+{})[+!![] + +!![]]
 * (undefined+'')[1]+(''+'[Object Object]')[1+1]
 * ('undefined')[1]+('[Object Object]')[2]
 * nb
 */
var obj1 = {
  a:1,
  b:2,
  valueOf:function (){
    return this.a+this.b
  },
  toString:function (){
    return 1
  }
}
// 对象转boolean为true
var obj2 = {
  toString:function () {
    return 0
  }
}
console.log(obj1+!!obj2)//4
上次编辑于:
贡献者: 林深不见鹿