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).
会在左值和右值赋值之后依次执行 GetValue
和 ToPrimitive
,对于 String 和 Symbol 而言,会返回原来的值。接下来,假设操作为 '' + Symbol('word')
,左值为 String ,执行 ToString
操作,此处的 ToString
并不是我们所说的原型链上的 toString
方法,我们需要接着往下看:
换句话说,在 ToString 方法内部判断了值类型,根据类型进行后续不同的操作,而不是简单的调用 toString()
方法,对于 Symbol 类型,它的处理就是抛出异常。
如果我们需要 polyfill,需要进行一系列重载或者复写底层定义,不太好搞。
相关文档
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 标准库time中的常用时间转换方法
- (六)C++中的类型转换与STL标准模板库
- JavaScript进阶系列-类型转换、隐式类型转换
- Android 多国语言转换 Excel 和 Excel 转换为 string
- [SSL证书转换(一)]关于JKS 转换成 CRT 和 KEY
- 中兴通讯助力DevOps标准发布,喜获标准工作组成员授牌
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
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》 这本书的介绍吧!