JavaScript中心观点(1):范例转换

本文首发于
个人博客

《JavaScript中心观点(1):范例转换》

看到这个是否是有一种想打人的觉得,渣滓 JavaScript,这特么都什么鬼,置信很多人不管是笔试照样口试,都被 JS 的范例转换岂非过,置信仔细看完我这篇文章,妈妈再也不必忧郁范例转换的问题了。

原始值到原始值的转换

  1. 原始值转化为布尔值

    一切的假值(undefined、null、0、-0、NaN、””)会被转化为 false,其他都邑被转为 true

  2. 原始值转化为字符串
    都相当于 原始值 + “”
  3. 原始值转为数字

    • 布尔转数字: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 相干

《JavaScript中心观点(1):范例转换》

- valueOf 相干

《JavaScript中心观点(1):范例转换》

== 运算符怎样举行范例转换

  1. 假如一个值是null,另一个值是undefined,则相称
  2. 假如一个是字符串,另一个值是数字,则把字符串转换成数字,举行比较
  3. 假如恣意值是true,则把true转换成1再举行比较;假如恣意值是false,则把false转换成0再举行比较
  4. 假如一个是对象,另一个是数值或字符串,把对象转换成基本范例的值再比较。对象转换成基本范例,应用它的 toString 或许 valueOf 要领。 js 中心内置类,会尝试 valueOf 先于 toString(能够理解为对象优先转换成数字);破例的是 Date,Date 应用的是 toString 转换。非 js 中心的对象,经由过程本身的完成中定义的要领转换成原始值。

+ 运算符怎样举行范例转化

  1. 假如作为一元运算符就是转化为数字,常经常使用来将字符串转化为数字

    +"2" //  2
    2+false // 0
  2. 假如作为二元运算符就有两种转换体式格局

    • 双方假如有字符串,另一边一会转化为字符串举行相加
    • 假如没有字符串,双方都邑转化为数字举行相加,对象也依据前面的要领转化为原始值数字。
    • 假如个中的一个操作数是对象,则将对象转换成原始值,日期对象会经由过程 toString() 要领举行转换,其他对象经由过程 valueOf()要领举行转换,然则大多数要领都是不具备可用的 valueOf() 要领,所以照样会经由过程 toString() 要领实行转换。

流程图以下:
《JavaScript中心观点(1):范例转换》

实战剖析

1. []+[] // ""

_1. 起首运算符是 + 运算符而且很明显是二元运算符,并且有对象,所以挑选末了一点,操作数是对象,将对象转换为原始值。

_2. 双方对象都是数组,左侧的数组先挪用 valueOf() 要领无果,然后去挪用 toString(), 要领,在 toString() 的转化划定规矩内里有『将数组转化为字符串,用逗号分开』,由于没有其他元素,所以直接是空字符串 “”。

![](https://user-gold-cdn.xitu.io/2018/8/7/165124228cd61ccc?w=236&h=64&f=png&s=2453)

_3. 由于加号有一边是字符串了,所以别的一边也转为 字符串,所以双方都是空字符串 “”。

_4. 所以加起来也是空字符串 “”。

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

_1. 起首我们会看到挺多一元运算符,「+」、「!」,关于一元运算符是右连系性,所以能够画出以下运算递次。
《JavaScript中心观点(1):范例转换》

_2. 关于+[],数组是会被转化为数字的而不是字符串,可见「+ 运算符怎样举行范例转化」的第一条,所以经由第一步就会转化为

(!0 + [] + "false").length

_3. 第二步比较简单,0 转化为布尔值就是 false,所以经由第二步就转化为

(true + [] + "false").length

_4. 第三步中心的 []会转为空字符串,在「+ 运算符怎样举行范例转化」第二条的第三点,对象会被转转化为原始值,就是空字符,所以经由第三步以后就会变成

("true" + "false").length

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

"truefalse".length // 9

附录:

《JavaScript中心观点(1):范例转换》
《JavaScript威望指南》中范例转换表格

《JavaScript中心观点(1):范例转换》
个人民众号,迎接继承交换

    原文作者:leexiaoran
    原文地址: https://segmentfault.com/a/1190000015954808
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞