Javascript 当我发出警报(obj)时不工作的价值?

Javascript 当我发出警报(obj)时不工作的价值?,javascript,html,Javascript,Html,这将给出“[对象]”: 变量a={}; a、 valueOf=函数(){ 返回“asd”; }; 警报(a); 但这给了“asd”: 变量a={}; a、 valueOf=函数(){ 返回“asd”; }; 警报(“+a”); 我能理解为什么在第二个例子中我得了“自闭症”。但是在第一个例子中,我不应该也得到“asd”吗,因为我将对象放入警报函数(基本上最终调用了的值)?“a”是一个对象,因此在显示对象时发出警报,通过执行警报(“+a”),您强制将“a”视为字符串要实现您需要的结果: va

这将给出“[对象]”:


变量a={};
a、 valueOf=函数(){
返回“asd”;
};
警报(a);
但这给了“asd”:


变量a={};
a、 valueOf=函数(){
返回“asd”;
};
警报(“+a”);
我能理解为什么在第二个例子中我得了“自闭症”。但是在第一个例子中,我不应该也得到“asd”吗,因为我将对象放入警报函数(基本上最终调用了的值)?

“a”是一个对象,因此在显示对象时发出警报,通过执行警报(“+a”),您强制将“a”视为字符串要实现您需要的结果:

var a={};
a.toString=function(){
    return "asd";
};
alert(a);
看看这个

“+a返回一个字符串类型。使用typeof()检查此项


变量a={};
a、 valueOf=函数(){
返回“asd”;
};
警报(a);
document.getElementById('t').innerHTML+=“
”+typeof(a); var b={}; b、 valueOf=函数(){ 返回“asd”; }; 警报(“+b”); document.getElementById('t').innerHTML+=“
”+typeof(“+b”);
通过执行“+”您尝试警告字符串,而使用“+”您尝试在字符串中强制转换任何值,然后将其添加到空字符串“

当您使用+运算符时,JavaScript使用valueOf,否则当对象预期有字符串时,JavaScript使用toString()。在内部,可能在Object.prototype.valueOf中,它的设计与toString()相同。因此,如果只定义toString(),而不定义valueOf(),JavaScript将对“+”(因为内部valueOf调用toString)和需要字符串的上下文使用toString()。但是,如果定义了valueOf,则将在存在“+”(或-或/或任何其他算术运算符)的情况下使用它。但当它需要一个字符串时(比如在警报的情况下),就不会使用它。它将调用toString()。

但当我强制它成为字符串时,不是运行的值而是toString吗?我的意思是我知道,但是当我将对象放入警报函数时,为什么不将其转换为字符串呢?我的意思是我知道,但是,当我使用alert函数时,为什么不将对象转换为字符串呢?alert需要字符串,这是javascript的本质,它不会将对象转换为可用于alert的字符串。
<!doctype html>
<script>
var a={};
a.valueOf=function(){
    return "asd";
};
alert(""+a);
</script>
var a={};
a.toString=function(){
    return "asd";
};
alert(a);
<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>