【问题标题】:Implicit coercion for objects对象的隐式强制
【发布时间】:2013-06-16 12:29:31
【问题描述】:

我在使用 JavaScript 中的 + 运算符进行隐式强制转换时遇到了麻烦。即valueOf和toString的优先顺序。

var obj = {};

obj.toString(); => "[object 对象]"

obj.valueOf(); => 对象 {}

'Hello ' + obj; => "你好 [object Object]"

所以 obj 是使用 toString() 方法而不是 valueOf() 隐式强制转换为字符串的;

var obj2 = {
    toString: function() {
        return "[object MyObject]"; 
    },
    valueOf: function() { 
        return 17;
    }
};

obj2.toString(); => "[object MyObject]"

obj2.valueOf(); => 17

'Hello ' + obj2; => "你好 17"

所以当我重写 toString 和 valueOf 方法时,+ 运算符将强制使用 valueOf。

我错过了什么?谢谢。

【问题讨论】:

  • 有趣...顺便说一句,如果你从 obj2 中取出 valueOf,+ 运算符将再次强制转换为 toString
  • 当使用带有 + 运算符的 Object 参数时,valueOf 总是优先于 toString。结果 obj.valueOf().toString() === "[object Object]";现在说得通了。
  • 我想知道如何才能真正利用 Javascript 的这一特性。

标签: javascript


【解决方案1】:

可以在类似的帖子中找到答案:valueOf() vs. toString() in Javascript

如果对象可以转换为“原始”,JavaScript 会尝试将其视为数字。否则,将使用通过 toString 方法进行的字符串连接。如果没有valueOf 方法,JavaScript 无法判断如何转换数据,因此对象将被连接为字符串。

如果您有兴趣,可以在第 58 页左右的以下 pdf 中找到准确的规格:http://www.webreference.com/javascript/reference/ECMA-262/E262-3.pdf

希望有所帮助:-)

【讨论】:

  • pdf 太长了。无论如何,这是一个奇怪的问题。我现在明白了,这个想法是给定 var num = Object.valueOf();和 var str = Object.toString();我们应该总是有 num.toString() === str;否则我们会得到 obj2 示例的混乱。谢谢!
【解决方案2】:

为了更容易理解,考虑以下两种情况 -

var p = {};

//Case 1, here valueOf() method is called.
console.log(p); //Prints: Object {}


//Case 2, toString() method will be called.
console.log('the value of p is'+ p); //Prints: the value of p is[object Object]

所以基本上这取决于你使用这个对象的方式。

【讨论】:

  • 情况2,先调用valueOf(),再调用toString()。
  • valueOf 总是在你引用 'p' 变量时被调用,试试这个 p === p.valueOf() //returns true
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多