[轉]使用prototype.js 的時候應該特別注意的幾個問題.
Posted on 2006-12-09 10:30 errorfun 閱讀(360) 評論(0) 編輯 收藏 所屬分類: JavaScript今天自己也發現了prototype的一個定位的bug。
轉自:http://www.cnblogs.com/ashun/archive/2006/12/08/prototype-js-bug.html
1. String.prototype.camelize BUG
這個方法用來返回字符串的駱駝寫法。用js 控制元素的 style的時候經常使用
比如
ss = ss.camelize() // fontColor
通常情況下 camelize 會工作得很好,但是有一個特列,那就是浮動定位 float
obj.style[ss.camelize()] = " right " // 這將導致一個錯誤。
顯然,作者沒有考慮 float這種特殊情況,正確的寫法是:
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 arr = [ 2 , 4 , 6 ]
alert (arr.all(f) == true ) // 顯示 true
但是當 arr為空的時候,仍然返回 true
alert(arr.all(f) == true ) // 顯示true
4. Array.prototype.any BUG
同 all方法,對空數組仍然返回true
5.Array.prototype.detect 也就是 find方法
這個不是 Bug ,但是不看原代碼很容易讓人誤解,從而出錯。
這個方法查找第一個能滿足 迭代函數 的元素,最后返回元素的值
誤解一:
var arr = [ 1 , 3 , 5 , 7 ] // 故意定義一個全為奇數的數組。
alert(arr.find(f) == false ) // false
// 很多人誤以為 find 函數在找不到滿足條件的元素的時候會返回 false ,實際上,它返回的是 "undefined"
誤解二:
尋找數組中的數字元素
var arr = [ false , " go_rush " , 0 , " 阿舜 " ]
if (arr.find(f)) alert( " 數組中含有數字元素 " ) // 事實上 這個 alert永遠不會執行。
因為 find方法返回的是第一個符合條件的值。 這里返回:0. 所以.....
6. 對hash 對象的處理需要格外小心的地方
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