问题在于,第一段代码的a.valueOf并没有运行;而第二段代码的a.toString和a.valueOf都被运行了;你可以这样测试一下:
<script>
String.prototype.valueOf = function(){alert('bingo');return parseInt(a);}
var a = new String("123abc");
alert(++a);//124
alert(a-0);//NaN124
</script><script>
var a = new Object();
alert(++a);//NaN
alert(a-0);//NaN
a.toString = function(){alert('bingo');return "123abc";}
a.valueOf = function(){alert('bingo');return parseInt(a);}
</script>
<script>
String.prototype.valueOf = function(){alert('bingo');return parseInt(a);}
var a = new String("123abc");
alert(++a);//124
alert(a-0);//NaN124
</script><script>
var a = new Object();
alert(++a);//NaN
alert(a-0);//NaN
a.toString = function(){alert('bingo');return "123abc";}
a.valueOf = function(){alert('bingo');return parseInt(a);}
</script>
解决方案 »
- 利用闭包实现私有成员的单体(Singleton),访问内部成员时出现的差别,不知道为何
- 懂正则表达式的请进
- List<>集合绑定到select控件
- ie的innerhtml的问题,请高手帮一下帮忙?不太会用js ,谢谢
- 右侧浮标 放到asp页面里就不好使了^_多人请教_^
- 请问 ,如何将全角状态下的数字替换为英文状态下的数字,在线等待中...
- 一个字符串的值为一个函数名,怎么通过这个字符串的值调用这个函数?
- 在 HTML 静态页面里怎样装载另一个 HTML 页面,就像是:ASP 里面的 FSO 的 ReadAll 然后 reaponse.write xxx 一样效果,谢谢~~~
- 如何设置窗口在30秒无鼠标或键盘响应的情况下自动关闭?
- 上传文件路径问题,求助
- CSDN左面菜单上面的导航线条是怎么实现的?
- 请问如何在A页面中链接到B页面的框架中呢
a.valueOf = function(){return parseInt(a);}
alert(++a);//124
alert(a-0);//124似乎只有使用new创建滴实例才会被添加到原型链中,
而直接书写滴字符串并未添加至到原型链中,
因此重名方法并未覆盖原型方法。
但是它其实还是个字符串,在计算的时候它的值是"123abc"
而第二个就不一样了,a变成了个对象
而且有valueof方法,计算的时候会自动调用到这个方法返回123进行计算
"123abc"是一个字符串常量,
而new String("123abc")则返回一个字符串实例,用 instanceof 一测便知!因此在对象实例上重写原型方法时就会覆盖同名原型方法(见2楼栗子)!而在字符串常量"123abc"上的valueOf仅仅是一个动态方法(Dynamic Method),
当然不会对原型造成任何影响!刚刚查完书,一开始就讲滴是这个问题,怪不得俺都忘了,哈
你我他,三人行必有我师焉!
等 级:
发表于:2007-12-28 11:42:024楼 得分:0
To 风之石 楼主要问滴就是为啥没执行,原因是啥? 俺滴解释是凭感觉,不知道正宗滴解释是啥,哈
=====================================简单点讲toString 方法
应用于:Array 对象 | Boolean 对象 | Date 对象 | Error 对象 | Function 对象 | Number 对象 | Object 对象 | String 对象
返回对象的字符串表示。
valueOf 方法
请参阅
toString 方法
应用于:Array 对象 | Boolean 对象 | Date 对象 | Function 对象 | Number 对象 | Object 对象 | String 对象
返回指定对象的原始值。因为第一段的a并不是如上所示的对象,所以不能被运行。
請問你查的是JavaScript權威指南(第四版第三章)嗎?
但是
var a = ["string"]却可以创建一个Array对象,其实也是不严格的。理论上讲应该是 var a = new Array("string");以上属个人见解,有误还请各位指出!
發現js的基礎知識越看越糊塗。
var a = new String("123abc");
a.valueOf = function(){alert('a valueOf');return parseInt(this);}
alert(++a);//124
alert(a-0);//124 String.prototype.valueOf = function(){alert('b valueOf');return parseInt(this);}
var b = new String("123abc");
alert(++b);//124
alert(b-0);//124 var c = new Object();
c.valueOf = function(){alert('c valueOf');return 99;}
alert(++c);//100
alert(c-0);//100 var d = "234";
d.valueOf = function(){alert('d valueOf');return 99;}
alert(++d);//235
alert(d-0);//235var e = "345";
e.valueOf = function(){alert('e valueOf');return 999;}
alert(++e);//346
alert(e-0);//346
</script> 为什么会这样呢?这就是传引用和传值的区别。
脚本是怎么执行的呢?在WINDOWS下通通由 Microsoft Windows Script Interfaces 来管理的。
所有的解释器,vbs,js都是以COM的形式存在的,和Windows脚本接口通讯。呵呵,COM接口支持几种基本的数据类型,字符串,布尔类型,整数,浮点数,分别对应 VT_BSTR , VT_BOOL , VT_INT , VT_DECIMAL,
这些类型是传值的,即直接的值复制,所以不存在任何其它信息,如方法。而对象呢?是对应的VT_DISPATCH,即IDispatch接口,也就是对象,是传递指针的。
所以上面代码中添加的 valueOf 是也可以访问的到的。所以上例中,对于 a, b, c, 都是对象,都是IDispatch,所以他们的 valueOf 是有效的。
d, e, 是VT_BSTR,VT_INT,所以valueOf根本不会被调用,但valueOf确实是存在 d, e对象里的,所以你在 js中可以使用d.valueOf 和 e.valueOf。
但COM中是识别不到的。愚见,请勿见笑。
var a = new String("123abc");
a.valueOf = function(){alert('a valueOf');return parseInt(this);}
alert(++a);//124
alert(a-0);//124 String.prototype.valueOf = function(){alert('b valueOf');return parseInt(this);}
var b = new String("123abc");
alert(++b);//124
alert(b-0);//124 var c = new Object();
c.valueOf = function(){alert('c valueOf');return 99;}
alert(++c);//100
alert(c-0);//100 var d = "234";
d.valueOf = function(){alert('d valueOf');return 99;}
alert(++d);//235
alert(d-0);//235var e = "345";
e.valueOf = function(){alert('e valueOf');return 999;}
alert(++e);//346
alert(e-0);//346
</script> 为什么会这样呢?这就是传引用和传值的区别。
脚本是怎么执行的呢?在WINDOWS下通通由 Microsoft Windows Script Interfaces 来管理的。
所有的解释器,vbs,js都是以COM的形式存在的,和Windows脚本接口通讯。呵呵,COM接口支持几种基本的数据类型,字符串,布尔类型,整数,浮点数,分别对应 VT_BSTR , VT_BOOL , VT_INT , VT_DECIMAL,
这些类型是传值的,即直接的值复制,所以不存在任何其它信息,如方法。而对象呢?是对应的VT_DISPATCH,即IDispatch接口,也就是对象,是传递指针的。
所以上面代码中添加的 valueOf 是也可以访问的到的。所以上例中,对于 a, b, c, 都是对象,都是IDispatch,所以他们的 valueOf 是有效的。
d, e, 是VT_BSTR,VT_INT,所以valueOf根本不会被调用,但valueOf确实是存在 d, e对象里的,所以你在 js中可以使用d.valueOf 和 e.valueOf。
但COM中是识别不到的。愚见,请勿见笑。
JavaScript_2.0_The_Complete_Reference_SecondEdition.chm
Chapter 2: JavaScript Core Features—Overview
Section 4: Basic Data Types
引古论今,摆书看普的为何?
var a="123";不是对象
var a = new String("123abc"); //创建String类型的实例
a.valueOf = function(){alert('a valueOf');return parseInt(this);} //仅仅更改a实例的valueOf方法
alert(++a);//124 这里实际执行的就是上面一句
alert(a-0);//124 //对所有String实例的valueOf进行重载
String.prototype.valueOf = function(){alert('b valueOf');return parseInt(this);} //标记1
var b = new String("123abc"); //创建String类型的实例
alert(++b);//124 这里执行的是"标记1"的语句
alert(b-0);//124 var c = new Object(); //这里创建了一个Object对象实例 不是String对象实例
c.valueOf = function(){alert('c valueOf');return 99;} //仅仅更改了c的valueOf方法
alert(++c);//100 这里执行的是上面一句
alert(c-0);//100 var d = "234"; //因为javascript对部分值类型数据的处理模式 导致这里创建的是String对象 这个值使用的是统一的实例方法
d.valueOf = function(){alert('d valueOf');return 99;} //所以这句无效
alert(++d);//235 实际执行的是"标志1"的语句
alert(d-0);//235//同上
var e = "345";
e.valueOf = function(){alert('e valueOf');return 999;}
alert(++e);//346
alert(e-0);//346/*javascript对部分值类型的数据处理时是先在内存中创建一个区域,用于存放一个值.当有另外一个相等的值存进来的时候,它先会查找内存区域中有没有相等的值.有则将这个变量的引用指向之前存在的值的区域.目的是节省内存空间.而且能节省处理string1 == string2时间,在这种处理机制下这些值类型就不具有自己的方法熟悉.所以"aa".valueOf = .....是无效的;
*/
//测试以下这几句帮助理解
//alert(["aa" instanceof String,false instanceof Boolean,1 instanceof Number]);
//alert([new String("aa") == new String("aa"),new String("aa") instanceof String]);
</script>