|
|
@ -57,4 +57,29 @@ console.log(symbolObject.constructor == Symbol); //true |
|
|
|
## 拆箱转换 |
|
|
|
## 拆箱转换 |
|
|
|
- 在 JavaScript 标准中,规定了 ToPrimitive 函数,它是对象类型到基本类型的转换(即,拆箱转换) |
|
|
|
- 在 JavaScript 标准中,规定了 ToPrimitive 函数,它是对象类型到基本类型的转换(即,拆箱转换) |
|
|
|
- 拆箱转换会尝试调用 valueOf 和 toString 来获得拆箱后的基本类型。如果 valueOf 和 toString 都不存在,或者没有返回基本类型,则会产生类型错误 TypeError |
|
|
|
- 拆箱转换会尝试调用 valueOf 和 toString 来获得拆箱后的基本类型。如果 valueOf 和 toString 都不存在,或者没有返回基本类型,则会产生类型错误 TypeError |
|
|
|
- |
|
|
|
```javascript |
|
|
|
|
|
|
|
var o = { |
|
|
|
|
|
|
|
valueOf : () => {console.log("valueOf"); return {}}, |
|
|
|
|
|
|
|
toString : () => {console.log("toString"); return {}} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
o * 2 |
|
|
|
|
|
|
|
// valueOf |
|
|
|
|
|
|
|
// toString |
|
|
|
|
|
|
|
// TypeError 拆箱失败 |
|
|
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- 到 String 的拆箱转换会优先调用 toString。我们把刚才的运算从 o x 2 换成 String(o),那么你会看到调用顺序就变了 |
|
|
|
|
|
|
|
- 在 ES6 之后,还允许对象通过显式指定 @@toPrimitive Symbol 来覆盖原有的行为。 |
|
|
|
|
|
|
|
```javascript |
|
|
|
|
|
|
|
var o = { |
|
|
|
|
|
|
|
valueOf : () => {console.log("valueOf"); return {}}, |
|
|
|
|
|
|
|
toString : () => {console.log("toString"); return {}} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
o[Symbol.toPrimitive] = () => {console.log("toPrimitive"); return "hello"} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log(o + "") |
|
|
|
|
|
|
|
// toPrimitive |
|
|
|
|
|
|
|
// hello |
|
|
|
|
|
|
|
``` |