zoukankan      html  css  js  c++  java
  • 类型转换

    JS 中类型转换只有三种情况,分别是:

    转换为布尔值
    转换为数字
    转换为字符串

    转Boolean

    在条件判断时,除了 undefined, null, false, NaN, '', 0, -0,其他所有值都转为 true,包括所有对象。

    对象转原始类型

    对象在转换类型的时候,会调用内置的 [[ToPrimitive]] 函数,对于该函数来说,算法逻辑一般来说如下:

    如果已经是原始类型了,那就不需要转换了
    调用 x.valueOf(),如果转换为基础类型,就返回转换的值
    调用 x.toString(),如果转换为基础类型,就返回转换的值
    如果都没有返回原始类型,就会报错
    当然你也可以重写 Symbol.toPrimitive ,该方法在转原始类型时调用优先级最高。

    let a = {
      valueOf() {
        return 0
      },
      toString() {
        return '1'
      },
      [Symbol.toPrimitive]() {
        return 2
      }
    }
    1 + a // => 3
    

    四则运算符

    加法运算符不同于其他几个运算符,它有以下几个特点:

    运算中其中一方为字符串,那么就会把另一方也转换为字符串
    如果一方不是字符串或者数字,那么会将它转换为数字或者字符串
    1 + '1' // '11'
    true + true // 2
    4 + [1,2,3] // "41,2,3"
    如果你对于答案有疑问的话,请看解析:

    对于第一行代码来说,触发特点一,所以将数字 1 转换为字符串,得到结果 '11'
    对于第二行代码来说,触发特点二,所以将 true 转为数字 1
    对于第三行代码来说,触发特点二,所以将数组通过 toString 转为字符串 1,2,3,得到结果 41,2,3
    另外对于加法还需要注意这个表达式 'a' + + 'b'

    'a' + + 'b' // -> "aNaN"
    因为 + 'b' 等于 NaN,所以结果为 "aNaN",你可能也会在一些代码中看到过 + '1' 的形式来快速获取 number 类型。

    那么对于除了加法的运算符来说,只要其中一方是数字,那么另一方就会被转为数字

    4 * '3' // 12
    4 * [] // 0
    4 * [1, 2] // NaN

    比较运算符

    如果是对象,就通过 toPrimitive 转换对象
    如果是字符串,就通过 unicode 字符索引来比较
    let a = {
    valueOf() {
    return 0
    },
    toString() {
    return '1'
    }
    }
    a > -1 // true
    在以上代码中,因为 a 是对象,所以会通过 valueOf 转换为原始类型再比较值。

  • 相关阅读:
    Fastify 系列教程四 (求对象、响应对象和插件)
    Fastify 系列教程三 (验证、序列化和生命周期)
    Fastify 系列教程二 (中间件、钩子函数和装饰器)
    Fastify 系列教程一 (路由和日志)
    使用 Vuejs 开发 chrome 插件的注意事项
    五十行javascript代码实现简单的双向数据绑定
    markown编辑器截图粘贴预览,并将图片传至七牛云
    线程与进程的区别
    TeamViewer卡在正在初始化显示参数
    Chrome 字体模糊解决
  • 原文地址:https://www.cnblogs.com/lyly96720/p/12263562.html
Copyright © 2011-2022 走看看