问题在于,第一段代码的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>

解决方案 »

  1.   

    这样写也是124!var a = new String("123abc");
    a.valueOf = function(){return parseInt(a);}
    alert(++a);//124
    alert(a-0);//124似乎只有使用new创建滴实例才会被添加到原型链中,
    而直接书写滴字符串并未添加至到原型链中,
    因此重名方法并未覆盖原型方法。
      

  2.   

    第一个a不个是个字符串,虽然它可以当成字符串对象来使用
    但是它其实还是个字符串,在计算的时候它的值是"123abc"
    而第二个就不一样了,a变成了个对象
    而且有valueof方法,计算的时候会自动调用到这个方法返回123进行计算
      

  3.   

    JS中有三种基本数据类型(Basic Data Types),即 String、Number、Boolean
    "123abc"是一个字符串常量,
    而new String("123abc")则返回一个字符串实例,用 instanceof 一测便知!因此在对象实例上重写原型方法时就会覆盖同名原型方法(见2楼栗子)!而在字符串常量"123abc"上的valueOf仅仅是一个动态方法(Dynamic Method),
    当然不会对原型造成任何影响!刚刚查完书,一开始就讲滴是这个问题,怪不得俺都忘了,哈
      

  4.   

    yixianggao 
    你我他,三人行必有我师焉! 
    等 级:
     发表于: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并不是如上所示的对象,所以不能被运行。
      

  5.   

    TO 你我他,三人行必有我师焉!
    請問你查的是JavaScript權威指南(第四版第三章)嗎?
      

  6.   

    这里有个值得注意的地方,就是创建数组对象!我们用:var a = "string" 并不能创建一个String对象,需要 var a = new String("string");
    但是
    var a = ["string"]却可以创建一个Array对象,其实也是不严格的。理论上讲应该是 var a = new Array("string");以上属个人见解,有误还请各位指出!
      

  7.   

    var   a   =   ["string"]一般很少這樣寫,估計也不提倡這種寫法。
    發現js的基礎知識越看越糊塗。
      

  8.   

    <script> 
    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中是识别不到的。愚见,请勿见笑。
      

  9.   

    <script> 
    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中是识别不到的。愚见,请勿见笑。
      

  10.   

    To Clark21俺查滴是 
    JavaScript_2.0_The_Complete_Reference_SecondEdition.chm
        Chapter 2: JavaScript Core Features—Overview 
            Section 4: Basic Data Types
      

  11.   

    干脆把DOM拆开分解出来瞧瞧,无非就是对象、变量、函数罢了
    引古论今,摆书看普的为何?
      

  12.   

    个人觉得是是否对象的问题
    var a="123";不是对象
      

  13.   

    <script> 
    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> 
      

  14.   

    alert(++d);//235 实际执行的是"标志1"的语句不敢苟同,这里其实就是 把字符串转换为数字后再加+