mySymbol
转换为字符串,并且在检测到强制转换时会抛出错误,从而阻止以这种方式使用它 。
同样,我们不能将 symbol
强制转换为数字,所有数学运算符在与符号一起使用时都会引发错误:
const mySymbol = Symbol.for("mySymbol");const factor = mySymbol / 2;console.log(factor); // Uncaught TypeError: Cannot convert a Symbol value to a number
4. 对象类型转换介绍完了基本数组类型的转化 , 下面来看看对象类型的转化 。例如 , 当执行 obj_1 + obj_2
或者 obj_1 - obj_2
时,都会先将对象转换为原始类型,然后将其转换为最终类型 。当然,这里的转化仍然只有三种类型:数字、字符串和布尔值 。
对象通过内部的 ToPrimitive
方法将其转换为原始类型,该算法允许我们根据使用对象的上下文来选择应如何转换对象 。从概念上讲 , ToPrimitive 算法可以分为两部分:Hints 和 Object-to-primitive 转换方法 。
(1)HintsHints 是 ToPrimitive
算法用于确定对象在特定上下文中应转换为什么的信号 。有三种情况:
-
string
:在操作需要字符串的上下文中,如果可以转换为字符串 , 例如alert()
或内置String()
函数:
alert(obj);String(obj)// 使用对象作为属性key值anotherObj[obj] = 1000;
-
number
:如果可以进行这种转换 , 则在操作需要数字的上下文中:
// 显示转换let num = Number(obj);// 数学(二进制加号除外)let x = +obj; // 一元加let difference = Date1 - Date2; // 日期对象// 对象大小比较let less = Obj1 < obj2;
-
default
:在极少数情况下发生 , 不确定需要什么类型 。例如 , 二元 + 运算符既适用于字符串(连接它们)也适用于数字(添加它们) 。在这种情况下 , 对象可以转换为字符串或数字 。或者当使用宽松相等 == 运算符将对象与字符串、数字或 symbol 进行比较时 。
// 二元加let sum = obj1 + obj2;// obj == string/number/symbolif (obj == 10 ) { ... };
所有内置对象(日期除外)都将default
认为是number
, Date 日期对象将default
认为是string
。(2)Methods在 ToPrimitive 算法根据
Hints
确定对象应转换为的原始值类型之后 。然后使用 Object-to-primitive 转换方法将对象转换为原始值 。有三种情况:-
toString/valueOf
:toString()
和valueOf()
被 JavaScript 中的所有对象继承 。它们仅用于对象到原始值的转换 。ToPrimitive 算法首先会尝试toString()
方法 。如果定义了方法,它返回一个原始值 , 那么 JavaScript 使用原始值(即使它不是字符串) 。如果toString()
返回一个对象或不存在,那么 JavaScript 会尝试使用valueOf()
方法,如果该方法存在并返回一个原始值,JavaScript 将使用该值 。否则 , 转换失败并提示TypeError
。 -
toString -> valueOf
:用于 Hints 为string
的情况 。 -
valueOf -> toString
:其他情况 。
let Person = { name: "Mary", age: 22, // hint 是 "string" toString() { return `{name: "${this.name}"}`; }, // hint 是 "number" 或 "default" valueOf() { return this.age; }};alert(Person); // toString -> {name: "Mary"}alert(+Person); // valueOf -> 22alert(Person + 10); // valueOf -> 32
在上面的代码中,
推荐阅读
- 屋里有蟑螂怎么彻底根除 屋里有蟑螂怎么消灭掉
- 二字网名超拽霸气 二字网名超拽霸气冷酷类型
- 童谣彻底颠覆自己的形象,黑色丝袜搭配双排风衣大秀模特气息!
- 手机频繁提示升级更新?教你一招,彻底关闭它
- Lisa再次作妖?被路易威登彻底抛弃,各国粉丝追着骂
- 刘亦菲彻底告别少女时代,肉色丝袜搭配银星连衣裙女人味十足!
- 韩红的“黑脸”,让《声生不息》节目组彻底被打脸
- 一味山楂健康减肥,不同肥胖类型的配伍秘方!轻松瘦身喝出来!
- 这次连沈腾都遭殃了,彻底触碰到了“底线”,贾玲不加入是正确的
- 心酸!云昊开播带货时聊学历遗憾,二八事件彻底改变人生轨迹