Person
变成了一个对象字符串或数字,具体取决于转换上下文 。 toString()
方法用于 Hints = "string" 的转换,valueOf()
用于其他情况(Hints 为“number”或“default”) 。
你可能希望在一个地方处理所有转换 。在这种情况下,只能像这样实现 toString()
方法:
let Person = { name: "Mary", toString() { return this.name; }};alert(Person); // toString -> Maryalert(Person + 1000); // toString -> Mary1000
Symbol.toPrimitive
:与 toString()
和 valueOf()
方法不同 , Symbol.toPrimitive
允许覆盖 JavaScript 中的默认对象到原始值的转换(其中 toString()
和 valueOf
方法由 ToPrimitive 算法使用)并定义我们希望如何将对象转换为原始类型的值 。为此,需要使用此 Symbol 名称定义一个方法,如下所示:
obj[Symbol.toPrimitive] = function(hint) { // 返回原始类型值 // hint 等于 "string", "number", "default" 中的一个}
例如,这里的 Person
对象使用 Symbol.toPrimitive
执行与上面相同的操作:
let Person = { name: "Mary", age: 22, [Symbol.toPrimitive](hint) { alert(`hint: ${hint}`); return hint == "string" ? `{name: "${this.name}"}` : this.age; }};alert(Person); // hint: string -> {name: "Mary"}alert(+Person); // hint: number -> 22alert(Person + 10); // hint: default -> 32
可以看到 , 单个方法 Person[Symbol.toPrimitive]
处理了所有转换情况 。需要注意,在没有 Symbol.toPrimitive
和 valueOf()
的情况下,toString()
将处理所有原始类型转换 。
下面是将对象转化为布尔值、字符串、数字时的执行过程:
(1)对象到布尔值的转换
Javascript 中的所有对象都转换为 true , 包括包装对象 new Boolean(false) 和空数组 。对象到布尔值的转换不需要对象到原始类型算法 。
(2)对象到字符串的转换
当需要将对象转换为字符串时,Javascript 首先使用 ToPrimitive 算法(Hints = “string”)将其转换为原始类型,然后将派生的原始类型转换为字符串 。例如,如果将对象传递给 String() 这样的内置函数,或者在模板字符串中插入对象时 。
(3)对象到数字的转换
当需要将对象转换为数字时,Javascript 首先使用 ToPrimitive 算法(Hints = “number”)将其转换为原始类型,然后将派生的原始类型转换为数字 。期望数字参数的内置 Javascript 函数和方法以这种方式将对象参数转换为数字 , 例如 Math() 。
(3)特殊情况当某些 Javascript 运算符的操作数是对象时,也会发生类型转换:
- + 运算符: 此运算符可以用于执行数字加法和字符串连接 。如果其中任何一个操作数是对象,则使用 ToPrimitive 算法(Hints = “default”)将它们转换为原始值 。一旦将它们转换为原始值,就会检查它们的类型 。如果任一参数是字符串 , 则将另一个参数转换为字符串并连接字符串 。否则 , 它将两个参数都转换为数字并将它们相加 。
- == 和 !== 运算符: 这些运算符以宽松方式执行相等和不相等测试 。如果一个操作数是一个对象而另一个是一个原始值,这些运算符使用 ToPrimitive 算法(Hints = “default”)将对象转换为原始值,然后比较两个原始值 。
- <,<=,> 和 >= 关系运算符: 关系运算符用于比较两个值之间的关系,可用于比较数字和字符串 。如果任一操作数是对象 , 则使用 ToPrimitive 算法将其转换为原始值(Hints = “number”) 。但是,与对象到数字的转换不同,返回的原始值不会转换为数字(因为它们被比较并且不被使用) 。
【彻底搞懂 JS 类型转换】
推荐阅读
- 屋里有蟑螂怎么彻底根除 屋里有蟑螂怎么消灭掉
- 二字网名超拽霸气 二字网名超拽霸气冷酷类型
- 童谣彻底颠覆自己的形象,黑色丝袜搭配双排风衣大秀模特气息!
- 手机频繁提示升级更新?教你一招,彻底关闭它
- Lisa再次作妖?被路易威登彻底抛弃,各国粉丝追着骂
- 刘亦菲彻底告别少女时代,肉色丝袜搭配银星连衣裙女人味十足!
- 韩红的“黑脸”,让《声生不息》节目组彻底被打脸
- 一味山楂健康减肥,不同肥胖类型的配伍秘方!轻松瘦身喝出来!
- 这次连沈腾都遭殃了,彻底触碰到了“底线”,贾玲不加入是正确的
- 心酸!云昊开播带货时聊学历遗憾,二八事件彻底改变人生轨迹