js运算规则和类型转换

类型转换规则

  • 原始类型 -> 数字

    • true => 1
    • false => 0
    • null => 0
    • undefined => NaN
    • string
      • 空字符串(含空白字符) => 0
      • 去掉引号首尾空白字符,不是数字就是 NaN
  • 所有类型 -> bool

    • 转化值转化结果
      null,undefined,0,NaN,空字符串false
      其他true
  • 原始类型 -> 字符串

    • 看到什么就是什么
    • 比如:NaN => “NaN”, null => “null”
  • 对象类型 -> 原始原始类型

    1. 先调用对象的valueOf方法

    2. 得到的结果是原始类型则输出

    3. 如果是对象,调用toString方法

    4. 得到的是原始类型则输出,反之报错

    5. 举例:

      const obj = {}
      console.log(+obj) // => NaN
      /**
       * 对象转数字
       * 1.首先将对象转换为原始类型
       * 调用valueOf 方法
       * console.log(a.valueOf()) => {}
       * 得到的仍然是一个 对象
       * 再次调用对象的toString方法
       * console.log(a.toString()) => "[object Object]" 得到原始类型
       * 2.将得到的原始类型转化为数字 
       * Number("[object Object]") => NaN
       */
      
      // 如果在obj对象中添加valueOf 方法 和toString方法 强制返回对象
      const obj = {
          valueOf(){
              return {}
          },
          toString(){
              return {}
          }
      }
      console.log(+obj) // => TypeError: Cannot convert object to primitive value
      

运算符

  • 算术运算
    • 运算符+ - * / % ++ –
    • 运算规则:前提转化成原始类型
      • 若无特殊情况转换为数字,直接进行运算
      • 特殊情况1:x + y ,若x,y 有一方为字符串,则为字符串拼接
      • 特殊情况2:NaN 与任何类型的算数运算均为NaN
      • 特殊情况 1 优先于 2
  • 比较运算
    • 运算符:> < >= <=
      • 运算规则:前提转化成原始类型
        • 若无特殊情况,转换成数字进行比较
        • 特殊情况:若两端为字符串,比较字典序
    • 运算符:===
      • 运算规则:类型和值必须相同
      • 特殊情况:如果两个操作数都是对象,只有当它们指向同一个对象时才返回 true
    • 运算符:==
      • 运算规则:
        • 两端类型相同,比较值
        • 两端类型不同,转换成数字比较
        • 特殊情况:undefined和null只有与自身比较或者相互比较时,才会返回true
    • 上面三者公共特殊情况:两端存在NaN,一定为false
    • 运算符:!= !== 与 == === 取反
  • 逻辑运算
    • 运算前提:转换成bool值
    • 运算符:! && ||
    • x && y
      • x 为false ,返回x
      • x为true , 返回 y
    • x || y
      • x 为 false 返回 y
      • x 为 true 返回 x

常见面试题

  1. 在问号处输入什么,使得等式成立

    • var a = ?
      console.log(a==1&&a==2&&a==3)
      
      // 思路 当a为原始类型 等式无法成立 由于 == 两端类型不同时,转换成数字进行比较 而对象转换成数字 则分为两步进行 对象 -》原始 原始 -> 数字
      a = {
        index:1,
        valueOf(){
          return this.index++
        }
      }
      
  2. 下面输出什么

    • console.log(([][[]] + [])[+!![]] + ([] + {})[+!![] + +!![]])
      /**
       * [][[]]:(数组取下标运算) [[]] => [[].toString()]=> [''] []['']=>undefined
       * + 转换成原始 [] => "" 
       * [][[]] + [] => undefined + "" = "undefined"
       * [+!![]] : !![] => true +true => 1
       * ([][[]]+[])[+!![]] = "undefined"[1] => "n"
       * ([] + {}) => "" + "[Object object]" => "[Object object]"
       * [+!![] + +!![]] => 1+1 = 2
       * ([] + {})[+!![] + +!![]] => "[Object object]"[2] =>b
       * 所以整个表达式为 "n" + "b" = "nb"
       */
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值