JavaScript核心概念(1):类型转换

本文首发于我的博客面试

看到这个是否是有一种想打人的感受,垃圾 JavaScript,这特么都什么鬼,相信不少人不论是笔试仍是面试,都被 JS 的类型转换难道过,相信认真看完我这篇文章,妈妈不再用担忧类型转换的问题了。数组

原始值到原始值的转换

  1. 原始值转化为布尔值bash

    全部的假值(undefined、null、0、-0、NaN、””)会被转化为 false,其余都会被转为 true函数

  2. 原始值转化为字符串 都至关于 原始值 + ""spa

  3. 原始值转为数字3d

    • 布尔转数字:true -> 1, false -> 0
    • 字符串转数字:以数字表示的字符串能够直接会转为字符串,若是字符串头尾有空格会忽略,可是空格在中间,转换结果就是 NaN。
    +" 66" // 66
      +" 6 7 " // NaN
    复制代码

原始值到对象的转换

  • null 和 undefined 转对象直接抛异常
  • 原始值经过调用 String()、Number()、Boolean()构造函数,转换为他们各自的包装对象

对象到原始值的转换

  1. 对象转为布尔都为 true
  2. 对象到字符串
    • 若是对象有 toString() 方法,就调用 toString() 方法。若是该方法返回原始值,就讲这个值转化为字符串。
    • 若是对象没有 toString() 方法或者 该方法返回的不是原始值,就会调用该对象的 valueOf() 方法。若是存在就调用这个方法,若是返回值是原始值,就转化为字符串。
    • 不然就报错
  3. 对象到数字
    • 对象转化为数字作了跟对象转化为字符串作了想同的事儿,不一样的是后者是先调用 valueOf 方法,若是调用失败或者返回不是原始值,就调用 toString 方法。
  4. 补充。一些经常使用内置对象 toString 方法和 valueOf 的转换规则
    • toString 相关
    • valueOf 相关

== 运算符如何进行类型转换

  1. 若是一个值是null,另外一个值是undefined,则相等
  2. 若是一个是字符串,另外一个值是数字,则把字符串转换成数字,进行比较
  3. 若是任意值是true,则把true转换成1再进行比较;若是任意值是false,则把false转换成0再进行比较
  4. 若是一个是对象,另外一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的 toString 或者 valueOf 方法。 js 核心内置类,会尝试 valueOf 先于 toString(能够理解为对象优先转换成数字);例外的是 Date,Date 利用的是 toString 转换。非 js 核心的对象,经过本身的实现中定义的方法转换成原始值。

+ 运算符如何进行类型转化

  1. 若是做为一元运算符就是转化为数字,经常用来将字符串转化为数字code

    +"2" //  2
    2+false // 0
    复制代码
  2. 若是做为二元运算符就有两种转换方式cdn

    • 两边若是有字符串,另外一边一会转化为字符串进行相加
    • 若是没有字符串,两边都会转化为数字进行相加,对象也根据前面的方法转化为原始值数字。
    • 若是其中的一个操做数是对象,则将对象转换成原始值,日期对象会经过 toString() 方法进行转换,其余对象经过 valueOf()方法进行转换,可是大多数方法都是不具有可用的 valueOf() 方法,因此仍是会经过 toString() 方法执行转换。

流程图以下: 对象

实战分析

1. []+[] // ""

_1. 首先运算符是 + 运算符并且很明显是二元运算符,而且有对象,因此选择最后一点,操做数是对象,将对象转换为原始值。blog

_2. 两边对象都是数组,左边的数组先调用 valueOf() 方法无果,而后去调用 toString(), 方法,在 toString() 的转化规则里面有『将数组转化为字符串,用逗号分隔』,因为没有其余元素,因此直接是空字符串 “”。

_3. 由于加号有一边是字符串了,因此另一边也转为 字符串,因此两边都是空字符串 “”。

_4. 因此加起来也是空字符串 “”。

2. (! + [] + [] + ![]).length // 9

_1. 首先咱们会看到挺多一元运算符,「+」、「!」,对于一元运算符是右结合性,因此能够画出如下运算顺序。

_2. 对于+[],数组是会被转化为数字的而不是字符串,可见「+ 运算符如何进行类型转化」的第一条,因此通过第一步就会转化为

(!0 + [] + false).length

_3. 第二步比较简单,0 转化为布尔值就是 false,因此通过第二步就转化为

(true + [] + false).length

_4. 第三步中间的 []会转为空字符串,在「+ 运算符如何进行类型转化」第二条的第三点,对象会被转转化为原始值,就是空字符,因此通过第三步以后就会变成

("true" + false).length

_5. 第五步就比较简单啦,最终就是

"truefalse".length // 9

附录:

《JavaScript权威指南》中类型转换表格

qrcode_for_gh_39aba8571ae1_258.jpg
我的公众号,欢迎继续交流
相关文章
相关标签/搜索