<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title> New Document </title> <script type="text/javascript"> var IdCard = function(paperNo){ var validId15=function(){ //alert(paperNo); return false; } var validId18=function(){ //alert(paperNo); return false; } var valid = function (){ if(paperNo.length==15){ return validId15(); }else if(paperNo.length==18){ return validId18(); } return false; } this.validate = { valueOf: valid, toString: valid } } function test(){ idCard = new IdCard("123456789012345678"); alert(idCard.validate); //此处打印 false if(idCard.validate) alert(true); //此处打印 true } </script> </head> <body> <input type="button" value="" onclick="test()"> </body> </html>
if中的idCard.validate没有被执行,为什么?该怎么修改?
[quote]
alert(idCard.validate); //此处打印 false
if(idCard.validate) alert(true); //此处打印true
[/quote]
修改为
[code="java"]
alert(idCard.validate.valueOf()); //此处打印 false
if(idCard.validate.valueOf()) alert(true); //此处不会打印
[/code]
原因:alert(idCard.validate)会依次执行对象字面量中的valueOf和toString 方法,但alert()方面只显示了最后toString的值;
if(idCard.validate)自然是返回一个不为null的js对象,所以执行alert(true);
你修改
[code="java"]
this.validate = {
valueOf: valid,
toString: function(){
alert("hello");
}
}
[/code]
这里不变
[quote]
alert(idCard.validate); //此处打印 false
if(idCard.validate) alert(true); //此处打印 true
[/quote]
就会发现先弹出hello,而alert(idCard.validate);就返回了undefined,因为toString()无返回值了嘛,而if(idCard.validate)自然不为null,弹出true。
[quote]alert(idCard.validate); //此处打印 false
[/quote]
这个地方可以打印出数据?
如果是这样的话,可以修改
[quote]
if(idCard.validate) alert(true); //此处打印 true
[/quote]
修改为
if(idCard.validate==true) alert(true); //此处打印 true
试试
[quote]alert(idCard.validate); //此处打印 false
if(idCard.validate) alert(true); //此处打印 true [/quote]
把 if(idCard.validate) alert(true);
修改为 if(idCard.validate == true) alert(true);
以上回答有些错误,要纠正下,开始我认为
[quote]alert(idCard.validate);[/quote]
显示的应该是个[object Object],
而不是去执行valueOf和toString 方法,但运行执行却是弹出了false;
不理解怎么是false,检查这个回答时发现
[quote]
去执行valueOf和toString方法
[/quote]
突然间想起了如果对象重写了toString()方法,alert(obj)时就会调用此方法,故疑团也就解决了。
你把toString改个名字,就会显示[object Object]。