图解 Google V8
李兵
前盛大创新院高级研究员
立即订阅
3742 人已学习
课程目录
已完结 25 讲
0/4登录后,你可以任选4讲全文学习。
宏观视角 (2讲)
开篇词 | 如何学习谷歌高性能 JavaScript 引擎V8?
免费
01 | V8是如何执行一段JavaScript代码的?
JavaScript设计思想篇 (7讲)
02 | 函数即对象:一篇文章彻底搞懂JavaScript的函数特点
03 | 快属性和慢属性:V8是怎样提升对象属性访问速度的?
04 | 函数表达式:涉及大量概念,函数表达式到底该怎么学?
05|原型链:V8是如何实现对象继承的?
06|作用域链:V8是如何查找变量的?
07|类型转换:V8是怎么实现1+“2”的?
08|答疑:如何构建和使用V8的调试工具d8?
V8编译流水线 (8讲)
09 | 运行时环境:运行JavaScript代码的基石
10 | 机器代码:二进制机器码究竟是如何被CPU执行的?
11 | 堆和栈:函数调用是如何影响到内存布局的?
12 | 延迟解析:V8是如何实现闭包的?
13 | 字节码(一):V8为什么又重新引入字节码?
14|字节码(二):解释器是如何解释执行字节码的?
15 | 隐藏类:如何在内存中快速查找对象属性?
16 | 答疑: V8是怎么通过内联缓存来提升函数执行效率的?
事件循环和垃圾回收 (6讲)
17 | 消息队列:V8是怎么实现回调函数的?
18 | 异步编程(一):V8是如何实现微任务的?
19|异步编程(二):V8是如何实现async/await的?
20 | 垃圾回收(一):V8的两个垃圾回收器是如何工作的?
21 | 垃圾回收(二):V8是如何优化垃圾回收器执行效率的?
22|答疑:几种常见内存问题的解决策略
结束语 (2讲)
结束语 | 我的前端学习踩坑史
结课测试 | 这些V8的知识你都掌握了吗?
图解 Google V8
15
15
1.0x
00:00/00:00
登录|注册

07|类型转换:V8是怎么实现1+“2”的?

李兵 2020-03-31
你好,我是李兵。
前面我们花了很多篇幅聊了 JavaScript 中最基础却很容易被忽略的“对象”,以及 V8 是怎么处理“对象”的,今天我们继续来聊另一个非常基础,同时也是很容易被大家忽略的问题,那就是 JavaScript 中的“类型系统”。
在理解这个概念之前,你可以先思考一个简单的表达式,那就是在 JavaScript 中,“1+‘2’等于多少?”
其实这相当于是在问,在 JavaScript 中,让数字和字符串相加是会报错,还是可以正确执行。如果能正确执行,那么结果是等于数字 3,还是字符串“3”,还是字符串“12”呢?
如果你尝试在 Python 中使用数字和字符串进行相加操作,那么 Python 虚拟机会直接返回一个执行错误,错误提示是这样的:
>>> 1+'2'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
这段错误代码提示了这是个类型错误,表明 Python 并不支持数字类型和字符串类型相加的操作。
不过在 JavaScript 中执行这段表达式,是可以返回一个结果的,最终返回的结果是字符串“12”。
最终结果如下所示:
>>> 1+'2'
>>> "12"
为什么同样一条的表达式,在 Python 和 JavaScript 中执行会有不同的结果?为什么在 JavaScript 中执行,输出的是字符串“12”,不是数字 3 或者字符串“3”呢?
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《图解 Google V8》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(24)

  • Silence
    1003 , 先调 valueOf,存在则不调 toString , Number(100).toString() + '3' = '1003'

    作者回复: 赞

    2020-03-31
    11
  • 狂躁小胖
    忽然想明白一个问题,为什么数字要转为字符串,而不是字符串转为数字,因为的数字一定可以转为字符串,而字符串不一定可以转为数字

    作者回复: 为什么这样做,我也没弄明白

    2020-04-10
    7
  • 潇潇雨歇
    字符串1003,先调用对象的valueOf方法转为100,原始类型直接可以进行+操作,这里为字符串连接

    作者回复: 没问题

    2020-03-31
    4
  • 红白十万一只
    ToPrimitive的第二个参数期望值
    如果没填默认值是number
    但是date类型的默认值是string。

    Number就是valueof先调用
    string就是tostring先调用

    toNumberic
    toNumber
    toBigint
    >和<
    都是传递Number
    toprimitive(arguments,Number)

    tostring
    是传递string
    toprimitive(arguments,string)

    ==和+都是没传递preferredtype的,会使用当前类型的默认值(日期是string,其他都是Number)

    作者回复: 赞

    2020-04-17
    3
  • wuqilv
    "1003", 如果其中一项是字符串,那么 V8 会默认将另外一个值也转换为字符串

    作者回复: 对的

    2020-03-31
    2
  • bright
    '1003',先调用obj的valueOf方法返回100,然后使用强制类型转换为‘100’

    作者回复: 赞的

    2020-03-31
    2
  • 子云
    一开始我以为应该是2003,后面才反应过来是数字100和字符串3相加。虽然我很喜欢js,但我觉得这样的操作真的是毒瘤

    作者回复: 是啊,javascript的细节坑很多

    2020-05-02
    1
  • 杨越
    图解v8、浏览器原理、罗剑锋老师的HTTP三个专栏就是面试神器和学习神器

    作者回复: 嘿嘿,的确是

    2020-03-31
    2
    1
  • 王楚然
    思考题:
    结果是字符串“1003”。Obj有valueOf并返回数字,与字符串类型相加,会做以下隐式转换:
    Number(100).toString() + "3"

    作者回复: 赞的

    2020-03-31
    1
  • Geek_3894f9
    思考题答案是’1003’。第一个对象,valueof()有效,返回数字100,第二个对象是字符串,所以都转成字符串,再拼接。

    作者回复: 是的

    2020-03-31
    1
  • 伏枫
    思考题,应该返回字符串1003。obj先被调用valueOf方法,得到了一个原始类型number的值100,然后就是100 + '3',相加表达式中 有一个为字符串类型,则将另一个也转换为字符串再进行相加,最后结果为字符串'1003'

    作者回复: 是的

    2020-03-31
    1
  • Stony.修行僧
    2003 V8 会先通过 ToPrimitive 函数,将对象转换为原生的字符串或者是数字类型,在转换过程中,ToPrimitive 会先调用对象的 valueOf 方法,如果没有 valueOf 方法,则调用 toString 方法,如果 vauleOf 和 toString 两个方法都不返回基本类型值,便会触发一个 TypeError 的错误。

    作者回复: 是的

    2020-03-31
    2
    1
  • senga
    在判断相等时,ES5 规范 11.9.3.4-5 这样定义:
    (1) 如果 Type(x) 是数字,Type(y) 是字符串,则返回 x == ToNumber(y) 的结果。 (2) 如果 Type(x) 是字符串,Type(y) 是数字,则返回 ToNumber(x) == y 的结果;为什么相加时,是将number转换为string
    2020-04-29
  • 泷沁心
    言简意赅,补充一下大佬们写的其他类型的转换规则:https://github.com/mqyqingfeng/Blog/issues/159

    作者回复: 赞

    2020-04-29
  • HenryJia
    请问如何解释 1 + new Date() 的结果呢,或者var d2 = new Date(); 1 + d2, 结果类似
    "1Wed Apr 08 2020 00:15:07 GMT+0800 (中国标准时间)"
    2020-04-08
    2
  • 大蓝
    老师可以衍生讲一下这个 sum(1)(2)(3) == sum(1,2,3); Function 也有valueOf;
    2020-04-05
  • 墨灵
    哈哈哈,看到标题,感觉是被老师点名表扬了

    作者回复: 哈哈,你说之前的留言吧

    2020-04-02
  • Geek_e69cdd
    老师,之后能讲一下es6模块化是如何实现的吗,顺便对比一下和commonJS的区别
    2020-04-01
  • 杨越
    老师,下一讲是答疑吗?希望把快属性慢属性那一块再讲讲,那一讲底下的评论问题还是挺多的,我也没有完全理解。其他的几讲都讲的特别清楚
    2020-03-31
  • 林克的小披风
    「这是因为 JavaScript 认为字符串和数字相加是有意义的,V8 会将其中的数字转换为字符」,请问老师,为什么是数字转成字符,而不是其它的规则,这是ES规范规定的么?
    2020-03-31
收起评论
24
返回
顶部