07|类型转换:V8是怎么实现1+“2”的?
李兵
该思维导图由 AI 生成,仅供参考
你好,我是李兵。
前面我们花了很多篇幅聊了 JavaScript 中最基础却很容易被忽略的“对象”,以及 V8 是怎么处理“对象”的,今天我们继续来聊另一个非常基础,同时也是很容易被大家忽略的问题,那就是 JavaScript 中的“类型系统”。
在理解这个概念之前,你可以先思考一个简单的表达式,那就是在 JavaScript 中,“1+‘2’等于多少?”
其实这相当于是在问,在 JavaScript 中,让数字和字符串相加是会报错,还是可以正确执行。如果能正确执行,那么结果是等于数字 3,还是字符串“3”,还是字符串“12”呢?
如果你尝试在 Python 中使用数字和字符串进行相加操作,那么 Python 虚拟机会直接返回一个执行错误,错误提示是这样的:
这段错误代码提示了这是个类型错误,表明 Python 并不支持数字类型和字符串类型相加的操作。
不过在 JavaScript 中执行这段表达式,是可以返回一个结果的,最终返回的结果是字符串“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
《图解 Google V8》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(30)
- 最新
- 精选
- Silence1003 , 先调 valueOf,存在则不调 toString , Number(100).toString() + '3' = '1003'
作者回复: 赞
2020-03-3132 - 红白十万一只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-17317 - 狂躁小胖忽然想明白一个问题,为什么数字要转为字符串,而不是字符串转为数字,因为的数字一定可以转为字符串,而字符串不一定可以转为数字
作者回复: 为什么这样做,我也没弄明白
2020-04-10317 - 杨越图解v8、浏览器原理、罗剑锋老师的HTTP三个专栏就是面试神器和学习神器
作者回复: 嘿嘿,的确是
2020-03-31312 - 子云一开始我以为应该是2003,后面才反应过来是数字100和字符串3相加。虽然我很喜欢js,但我觉得这样的操作真的是毒瘤
作者回复: 是啊,javascript的细节坑很多
2020-05-025 - 潇潇雨歇字符串1003,先调用对象的valueOf方法转为100,原始类型直接可以进行+操作,这里为字符串连接
作者回复: 没问题
2020-03-314 - wuqilv"1003", 如果其中一项是字符串,那么 V8 会默认将另外一个值也转换为字符串
作者回复: 对的
2020-03-312 - bright'1003',先调用obj的valueOf方法返回100,然后使用强制类型转换为‘100’
作者回复: 赞的
2020-03-312 - Stony.修行僧2003 V8 会先通过 ToPrimitive 函数,将对象转换为原生的字符串或者是数字类型,在转换过程中,ToPrimitive 会先调用对象的 valueOf 方法,如果没有 valueOf 方法,则调用 toString 方法,如果 vauleOf 和 toString 两个方法都不返回基本类型值,便会触发一个 TypeError 的错误。
作者回复: 是的
2020-03-3142 - luckyone一直有个疑问,js垃圾回收会回收原型吗,比如fuction,我声明了之后,没有用,会被垃圾回收给给回收掉吗,还是想其他静态语言一样一直程序生命结束一直存在
作者回复: 函数是不会被回收的
2020-03-3121
收起评论