繁体   English   中英

为什么JavaScript会那样表现?

[英]Why JavaScript behaves like that?

让我们看一下这些例子:

var a = 1;
var b = { toString:function() {return '1'} };
var c = 1;

a + b + c === "111" // true

这真是令人震惊。 我知道当我们使用+运算符时,JS解释器会执行ToPrimitive或ToString操作。 但是,当没有提示PreferredType时,为什么将对象b转换为字符串。 因此,它可能正在使用ToString操作。

另请注意:如果对象上存在toString方法,则仅将其转换为字符串,为什么? 如果我将该方法称为“ toNumber”,为什么不将其转换为数字?

为什么JavaScript会那样表现?

但是,当没有提示PreferredType时,为什么将对象b转换为字符串。

如果没有传递任何提示,则将首先调用对象的valueOf方法。 但是由于b.valueOf()不返回原始值(默认情况下它返回对象本身), b.toString()下一步将调用b.toString()

请参阅规格

转换规则可以总结如下:

  • 如果没有提示或提示为number ,请首先调用valueOf
  • 如果hint是string ,请首先调用toString
  • 如果返回值不是原始值,则调用另一个方法。
  • 如果返回值仍然不是原始值,则引发错误。

它仅在对象上存在toString方法时才转换为字符串,为什么?

不确定我是否理解此声明。 每个对象都有一个toString方法。 如果尝试在没有toString方法的对象上执行此操作(通过Object.create(null) ),则会引发错误。

如果我将该方法称为“ toNumber”,为什么不将其转换为数字?

因为toNumber在JavaScript中没有意义。 toStringvalueOf是将对象转换为原始值的两个“魔术”方法:

 var n = 1; var o = { toString() { return 'bar'; }, valueOf() { return 2; } }; console.log(n + o); console.log(String(o)); 

如果这些方法均未返回原语,则也会产生错误。

  var n = 1; var o = { toString() { return this; }, }; console.log(n + o); 

这两种方法及其命名似乎有些武断。 从ES6开始,定义转换函数的首选方法是使用众所周知的@@toPrimitive符号:

 var a = 1; var b = { [Symbol.toPrimitive]: function() {return 1} }; var c = 1; console.log(a + b + c); 

在调用valueOftoString之前先调用@@toPrimitive

为什么JavaScript会那样表现?

因为这就是规范中定义的方式。 如果您想了解其背后的理由 ,则必须询问做出该决定的人员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM