ECMAScript 标准的十万个为什么 - Symbol 的隐式转换

栏目: JavaScript · 发布时间: 7年前

内容简介:ECMAScript 标准的十万个为什么 - Symbol 的隐式转换

今天苏老师发了一篇: Symbol Polyfill 填坑之旅 ,文章中提到 Symbol 隐式转换的问题,作为一个只在文章中看过 Symbol 的萌豚,我也想知道究竟为什么 Symbol 可以有 toString() 方法,却不能进行 '' + Symbol('word') 的操作。

标准

MDN - Symbol 中有一些规则,它告诉我们当 Symbol 尝试隐式类型转换时会报错,但是为什么会这样,底层是是怎么实现的,我们还是不太清楚。

Symbol 类型转换

当使用 symbol 值进行类型转换时需要注意一些事情:

尝试将一个 symbol 值转换为一个 number 值时,会抛出一个 TypeError 错误 (e.g. +sym or sym | 0).

使用宽松相等时, Object(sym) == sym returns true.

这会阻止你从一个 symbol 值隐式地创建一个新的 string 类型的属性名。例如,Symbol("foo") + "bar" 将抛出一个 TypeError (can't convert symbol to string).

"safer" String(sym) conversion works like a call to Symbol.prototype.toString() with symbols,但是注意 new String(sym) 将抛出异常。

标准实现

我们从底层标准看起,首先看 + 时发生了什么:

Let lref be the result of evaluating AdditiveExpression.

Let lval be ? GetValue(lref).

Let rref be the result of evaluating MultiplicativeExpression.

Let rval be ? GetValue(rref).

Let lprim be ? ToPrimitive(lval).

Let rprim be ? ToPrimitive(rval).

If Type(lprim) is String or Type(rprim) is String, then

Let lstr be ? ToString(lprim).

Let rstr be ? ToString(rprim).

Return the String that is the result of concatenating lstr and rstr.

Let lnum be ? ToNumber(lprim).

Let rnum be ? ToNumber(rprim).

会在左值和右值赋值之后依次执行 GetValueToPrimitive ,对于 String 和 Symbol 而言,会返回原来的值。接下来,假设操作为 '' + Symbol('word') ,左值为 String ,执行 ToString 操作,此处的 ToString 并不是我们所说的原型链上的 toString 方法,我们需要接着往下看:

ECMAScript 标准的十万个为什么 - Symbol 的隐式转换

换句话说,在 ToString 方法内部判断了值类型,根据类型进行后续不同的操作,而不是简单的调用 toString() 方法,对于 Symbol 类型,它的处理就是抛出异常。

如果我们需要 polyfill,需要进行一系列重载或者复写底层定义,不太好搞。

相关文档


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript Web应用开发

JavaScript Web应用开发

[阿根廷] Nicolas Bevacqua / 安道 / 人民邮电出版社 / 2015-9 / 59.00元

本书是面向一线开发人员的一本实用教程,对最新的Web开发技术与程序进行了全面的梳理和总结,为JavaScript开发人员提供了改进Web开发质量和开发流程的最新技术。本书主要分两大块,首先是以构建为目标实现JavaScript驱动开发,其次介绍如何管理应用设计过程中的复杂度,包括模块化、MVC、异步代码流、测试以及API设计原则。一起来看看 《JavaScript Web应用开发》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具