2011-08-08 33 views
1

这使 “的翻译:”:valueOf不工作时,我做警报(OBJ)?

<!doctype html> 
<script> 
var a={}; 
a.valueOf=function(){ 
    return "asd"; 
}; 
alert(a); 
</script> 

但是这给 “ASD”:

<!doctype html> 
<script> 
var a={}; 
a.valueOf=function(){ 
    return "asd"; 
}; 
alert(""+a); 
</script> 

我能理解为什么我在第二个例子中得到 “ASD”。但在第一个例子中,我不应该让“asd”,因为我通过警报函数(基本上最终调用该值 - 反正)对象?

回答

1

当你使用+运算符,JavaScript使用valueOf,否则当对象需要String时,JavaScript使用toString()。在内部,也许在Object.prototype.valueOf中,它被设计成与toString()相同。因此,如果仅定义toString(),而不定义valueOf(),则JavaScript将使用toString()作为'+'(因为内部valueOf调用toString)以及需要String的上下文中。但是,如果你定义了valueOf,那么在有'+'(或者 - 或者任何其他算术运算符)的地方使用。但是当它期望一个字符串时(如警报的情况)它不会被使用。它会调用toString()。

0

“a”是一个对象,以便警告的情况下,一个是显示对象,通过执行警报(“” + a)您是强制“”被当作字符串

+0

但是这不是真的,当我强迫它是一个字符串它不是valueOf运行,但toString? – Pacerier

0

“” +一个返回一个字符串类型。使用typeof()来检查它。

http://jsfiddle.net/zYs73/

<div id='t'></div> 

<script> 
    var a={}; 
    a.valueOf=function(){ 
     return "asd"; 
    }; 
    alert(a); 
    document.getElementById('t').innerHTML += "<br/>" + typeof(a); 

    var b={}; 
    b.valueOf=function(){ 
     return "asd"; 
    }; 
    alert(""+b); 
    document.getElementById('t').innerHTML += "<br/>" + typeof(""+b); 
</script> 
+0

我的意思是我知道,但为什么不通过警报函数将对象转换为字符串? – Pacerier

0

做“” +您要提醒的字符串,并与+您要投在字符串的值,然后加入到空字符串“”

+0

我的意思是我知道,但为什么不通过警报函数将对象转换为字符串? – Pacerier

+0

警报期望字符串,这是JavaScript的性质,它不会将对象转换为可用于警报。 – Rasel