首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 两段代码的不同之处 [已结贴,结贴人:Clark21]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-28 10:18:59 楼主
    在网上看到有这么两个例子。
    第一个:
    JScript code
    var a = "123abc"; a.valueOf = function(){return parseInt(a);} alert(++a);//NaN alert(a-0);//NaN


    第二个:
    JScript code
    var a = new Object(); a.toString = function(){return "123abc";} a.valueOf = function(){return parseInt(a);} alert(++a);//124 alert(a-0);//124


    请教各位,为什么第一个alert出来的都是NaN?第二个alert出来的都是124呢?这两个例子有什么区别呢?谢谢!
    10  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-28 11:32:421楼 得分:5
    问题在于,第一段代码的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>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-28 11:37:132楼 得分:5
    这样写也是124!
    JScript code
    var a = new String("123abc"); a.valueOf = function(){return parseInt(a);} alert(++a);//124 alert(a-0);//124

    似乎只有使用new创建滴实例才会被添加到原型链中,
    而直接书写滴字符串并未添加至到原型链中,
    因此重名方法并未覆盖原型方法。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-28 11:39:373楼 得分:0
    第一个a不个是个字符串,虽然它可以当成字符串对象来使用
    但是它其实还是个字符串,在计算的时候它的值是"123abc"
    而第二个就不一样了,a变成了个对象
    而且有valueof方法,计算的时候会自动调用到这个方法返回123进行计算

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-28 11:42:024楼 得分:0
    To 风之石

    楼主要问滴就是为啥没执行,原因是啥?

    俺滴解释是凭感觉,不知道正宗滴解释是啥,哈
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-28 12:08:355楼 得分:0
    JS中有三种基本数据类型(Basic Data Types),即 String、Number、Boolean
    "123abc"是一个字符串常量,
    而new String("123abc")则返回一个字符串实例,用 instanceof 一测便知!

    因此在对象实例上重写原型方法时就会覆盖同名原型方法(见2楼栗子)!

    而在字符串常量"123abc"上的valueOf仅仅是一个动态方法(Dynamic Method),
    当然不会对原型造成任何影响!

    刚刚查完书,一开始就讲滴是这个问题,怪不得俺都忘了,哈
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-28 12:51:296楼 得分:0
    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并不是如上所示的对象,所以不能被运行。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-28 14:38:157楼 得分:0
    TO 你我他,三人行必有我师焉!
    請問你查的是JavaScript權威指南(第四版第三章)嗎?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-28 15:04:418楼 得分:0
    这里有个值得注意的地方,就是创建数组对象!

    我们用:

    var a = "string" 并不能创建一个String对象,需要 var a = new String("string");
    但是
    var a = ["string"]却可以创建一个Array对象,其实也是不严格的。理论上讲应该是 var a = new Array("string");

    以上属个人见解,有误还请各位指出!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-28 15:34:529楼 得分:0
    var  a  =  ["string"]一般很少這樣寫,估計也不提倡這種寫法。
    發現js的基礎知識越看越糊塗。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-28 17:10:0510楼 得分:0
    感謝各位的精彩答復,如果沒異議,就此結帖。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • r_swordsman
    • 等级:
    发表于:2007-12-28 18:38:1611楼 得分:0
    HTML code
    <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);//235 var 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中是识别不到的。

    愚见,请勿见笑。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • r_swordsman
    • 等级:
    发表于:2007-12-28 18:39:2412楼 得分:0
    HTML code
    <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);//235 var 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中是识别不到的。

    愚见,请勿见笑。

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-29 00:15:0213楼 得分:0
    To Clark21

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

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tantaiyizu
    • 等级:
    发表于:2007-12-29 17:41:4914楼 得分:0
    没有什么意义
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-30 12:38:2015楼 得分:0
    本来是来灌水的,不过发现还不错哦
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • cloudgamer
    • 等级:
    发表于:2007-12-30 15:59:3016楼 得分:0
    太深入了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-31 16:26:5817楼 得分:0
    来看下!谢谢!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Phenlit
    • 等级:
    发表于:2007-12-31 17:59:5718楼 得分:0
    干脆把DOM拆开分解出来瞧瞧,无非就是对象、变量、函数罢了
    引古论今,摆书看普的为何?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-12-31 19:42:2619楼 得分:0
    个人觉得是是否对象的问题
    var a="123";不是对象
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-01 14:21:5720楼 得分:0
    该回复于2008-01-02 14:49:04被管理员删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-01-02 10:09:5321楼 得分:0
    HTML code
    <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>
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友