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

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

内容简介: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,需要进行一系列重载或者复写底层定义,不太好搞。

相关文档


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

查看所有标签

猜你喜欢:

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

Inside Larry's and Sergey's Brain

Inside Larry's and Sergey's Brain

Richard Brandt / Portfolio / 17 Sep 2009 / USD 24.95

You’ve used their products. You’ve heard about their skyrocketing wealth and “don’t be evil” business motto. But how much do you really know about Google’s founders, Larry Page and Sergey Brin? Inside......一起来看看 《Inside Larry's and Sergey's Brain》 这本书的介绍吧!

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

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

HSV CMYK互换工具