图解 Google V8
李兵
前盛大创新院高级研究员
26763 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
图解 Google V8
15
15
1.0x
00:00/00:00
登录|注册

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

思考题
总结
V8是怎么执行加法操作的?
什么是类型系统(Type System)
JavaScript类型系统

该思维导图由 AI 生成,仅供参考

你好,我是李兵。
前面我们花了很多篇幅聊了 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/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript中的类型系统是一个复杂而又重要的主题。本文深入探讨了V8引擎是如何处理类似1+"2"这样的操作的。相比于其他语言,JavaScript在执行加法操作时会严格按照ECMAScript标准进行处理,通过ToPrimitive函数将对象转换为原生的字符串或数字类型。具体来说,V8会将数字转换为字符串,然后执行字符串的连接操作,最终返回一个新的字符串。文章通过具体例子和流程图解释了V8执行加法操作的过程,帮助读者深入理解JavaScript中类型系统的工作原理。 此外,文章还提出了一个思考题,要求读者分析一段代码的执行结果。这样的互动设计能够引发读者的思考和讨论,增加了文章的趣味性和参与度。 通过本文的阅读,读者可以对JavaScript中的类型系统有一个清晰的认识,了解V8引擎是如何处理类型转换和加法操作的。同时,通过思考题的设置,读者也能够在实践中加深对所学知识的理解和运用。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《图解 Google V8》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(30)

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

    作者回复: 赞

    2020-03-31
    32
  • 红白十万一只
    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
    17
  • 狂躁小胖
    忽然想明白一个问题,为什么数字要转为字符串,而不是字符串转为数字,因为的数字一定可以转为字符串,而字符串不一定可以转为数字

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

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

    作者回复: 嘿嘿,的确是

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

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

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

    作者回复: 没问题

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

    作者回复: 对的

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

    作者回复: 赞的

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

    作者回复: 是的

    2020-03-31
    4
    2
  • luckyone
    一直有个疑问,js垃圾回收会回收原型吗,比如fuction,我声明了之后,没有用,会被垃圾回收给给回收掉吗,还是想其他静态语言一样一直程序生命结束一直存在

    作者回复: 函数是不会被回收的

    2020-03-31
    2
    1
收起评论
显示
设置
留言
30
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部