博客园 :: 首页 ::  ::  ::  :: 管理

1. String.prototype.camelize    BUG

这个方法用来返回字符串的骆驼写法。用js 控制元素的 style的时候经常使用
比如

var ss="font-color"  
ss
=ss.camelize()    // fontColor

通常情况下 camelize 会工作得很好,但是有一个特列,那就是浮动定位  float

var ss="float"  
obj.style[ss.camelize()]
="right" // 这将导致一个错误。

显然,作者没有考虑 float这种特殊情况,正确的写法是: 

ie:   obj.style.styleFloat="right"
ff:   obj.style.cssFloat
="right"


2. String.prototype.inspect   BUG

这里 inspect 方法是有Bug的, 作者用replace 方法的时候没有用正则,导致只能替换掉第一个匹配的字符。

正确的写法应该这样
  inspect: function() {
    return "'" + this.replace(/\\/g, '\\\\').replace(/"/g, '\\\"') + "'";
  }

3. Array.prototype.all   BUG
 这个方法检测是否数组中所有元素都能够让迭代函数为真。 如果全部能满足,则返回true,否则返回false

var f=function(x){return x%2==0}  //检查一个数是否是偶数
var arr=[2,4,6]
alert (arr.all(f)
==true)   //显示 true

但是当  arr为空的时候,仍然返回 true

var arr=[]
alert(arr.all(f)
==true)   //显示true


4.  Array.prototype.any  BUG
同 all方法,对空数组仍然返回true

5.Array.prototype.detect  也就是 find方法
这个不是 Bug ,但是不看原代码很容易让人误解,从而出错。
这个方法查找第一个能满足 迭代函数 的元素,最后返回元素的值
误解一:

   var f=function(x){return x%2==0}  //检测是否是偶数
   var arr=[1,3,5,7]    //故意定义一个全为奇数的数组。
   alert(arr.find(f)==false)   //false 
   //很多人误以为 find 函数在找不到满足条件的元素的时候会返回 false ,实际上,它返回的是 "undefined"

误解二:
   寻找数组中的数字元素

   var f=function(x){return !isNaN(x) && typeof(x)==="number"}
   
var arr=[false,"go_rush",0,"阿舜"]
   
if (arr.find(f)) alert("数组中含有数字元素")     //事实上 这个 alert永远不会执行。

因为 find方法返回的是第一个符合条件的值。  这里返回:0.  所以.....


6. 对hash 对象的处理需要格外小心的地方

var hash={member:1,test:2,ids:3}
alert(hash.member)
alert($H(hash).inspect())
alert($H(hash).toQueryString())
//hash.member实际是存在的  但是.inspect() 和 .toQueryString()却当它不存在

同样下面这些属性也会和 prototype.js 相冲突。

each, all, any, collect, detect, findAll, grep, include, inject, invoke, max, min,
partition, pluck, reject, sortBy, toArray, zip, inspect, map, find, select, member, entries

http://community.csdn.net/Expert/topic/4964/4964523.xml?temp=4.314822E-02


0
0
(请您对文章做出评价)
« 上一篇:再论怎么有效利用浏览器缓存之------怎么避免浏览器缓存静态文件.
» 下一篇:总结两个Javascript的哈稀对象的一些编程技巧

Feedback

#1楼   回复  引用  查看    

2006-12-08 13:11 by Jeffrey Zhao      
都是经验之谈。:)

#2楼[楼主]   回复  引用  查看    

2006-12-08 13:14 by Go_Rush      
@Jeffrey Zhao
老赵,你发随笔很勤快阿,怎么赶都赶不上你。

#3楼   回复  引用  查看    

2006-12-08 13:19 by MS的明天      
谢谢楼主的提醒,随便问一句,楼主用过YAHOOUI吗?

#4楼[楼主]   回复  引用  查看    

2006-12-08 13:21 by Go_Rush      
@MS的明天
我用 prototype.js 不用yui,本来想系统研究一下 yui,dojo,jquery的。不过
现在公司项目紧,没时间弄

#5楼   回复  引用  查看    

2006-12-08 13:27 by Jeffrey Zhao      
@Go_Rush
TODO List积压着太多东西了,不抓紧不行。:(

#6楼   回复  引用    

2006-12-08 13:33 by ddee[未注册用户]
不错,
的确是经验之谈,prototype.js我们项目也在用,上面的问题的确存在,但是从总体上来说,还是一个相当稳定、不错的东东^_^

#7楼   回复  引用    

2006-12-08 13:50 by genson
我用 jquery,好像prototype.js好烦。可能我没认真用过吧

#8楼   回复  引用  查看    

2006-12-08 14:30 by Cat Chen      
@Jeffrey Zhao
写文章都要todo啦,呵呵……我也存了一大堆在draft里面。

#9楼   回复  引用  查看    

2006-12-09 00:07 by 布尔      
第一个有些牵强了:float的骆驼表示当然不能是styleFloat更不能是cssFloat,只能是用法错误
第二个的确是考虑不周
第三、四个只需要把Enumerable的all 和any方法最后返回修改为 return result && this.length>0;
第五个似乎不应该把find指向detect,也不该提供这个捷径,detect找不到时就该返回undefine

#10楼   回复  引用  查看    

2006-12-09 00:09 by 布尔      
能不能解释一下为什么member没有被现实出来?

看到了,谢谢提醒,呵呵。prototype我已经看了一遍又一遍了,继续扩展之改进之。

#11楼[楼主]   回复  引用  查看    

2006-12-09 18:49 by Go_Rush      
@布尔
>>能不能解释一下为什么member没有被现实出来?
你看看我文中最后给出的那个链接啊.为什么member没有被显示出来.
我在论坛曾经有讨论过的

#12楼   回复  引用    

2007-03-06 09:15 by loadinger[未注册用户]
确实经验.....呵呵.好多我根本没发现...收藏先....
好象有两个在1.4里已经解决了....:)
对了.交个朋友啊....向你学习!!

#13楼   回复  引用    

2007-11-22 11:45 by 匿名[未注册用户]
通常情况下 camelize 会工作得很好,但是有一个特列,那就是浮动定位 float
var ss="float"
obj.style[ss.camelize()]="right" // 这将导致一个错误。

显然,作者没有考虑 float这种特殊情况,正确的写法是:
ie: obj.style.styleFloat="right"
ff: obj.style.cssFloat="right"

"显然,作者没有考虑 float这种特殊情况",,楼主看看prototype的源代码吧,setStyle里面怎么没有考虑float呢?大师使用camelize是谨慎的

#14楼[楼主]   回复  引用  查看    

2007-11-29 12:36 by Go_Rush      
re : #13楼

本文钟对的是 prototype.js v1.4 存在的问题或者Bug.
这些bug或许在后续的版本中修复了,但是v1.4版本中确实存在过