js中for in 可以遍歷物件或陣列的顯性屬性,也就是說我們自己定義的屬性是可以遍歷的,那些原型上預設已有的屬性,例如:object.prototype.tostring、object.prototype.hasownproperty 是遍歷不出來的。
for in 的基本規則如上,不過還有「坑」的地方需要我們注意:
1、for in迴圈出的值不一定是按順序的。**如下:
var b =for( var key in
b )
低版本瀏覽器彈窗的順序是:1、2、3。現代瀏覽器彈窗的順序是1、3、2。
2、在原型上加擴充套件方法,會被for in 出來。**如下:
object.prototype.test = "i am test"var b =
for( var key in
b )
我們手動加在原型上的方法,for in的時候會被遍歷出來。一般我們遍歷物件並不需要其原型的屬性,所以遍歷時最好object.prototype.hasownproperty方法進行判斷。
3、在例項中定義原型中已有的方法,瀏覽器for in 情況不一致。**如下:
var b =b.tostring = function()
for( var key in
b )
我們給b例項加了乙個原型上已有的方法tostring。現代瀏覽器能迴圈出tostring 低版本瀏覽器卻不能。所以給例項定屬性名時,不要和原型已有的一致。
4、各瀏覽器迴圈出的屬性順序不同。**與2中的一樣:
object.prototype.test = "i am test"var b =
for( var key in
b )
現代瀏覽器先迴圈例項中的屬性,再迴圈原型中的屬性。低版本瀏覽器相反。
這讓我想到了jquery對$.isplainobject()方法實現的一段**:
//own properties are enumerated firstly, so to speed up,
//if last one is own, then all properties are own.
varkey
for ( key in
obj ) {}
return key === undefined || hasown.call( obj, key );
它這裡說如果乙個物件的最後乙個屬性是例項自己的屬性,那麼所有的屬性都是例項自己的屬性。這對低版本瀏覽器來說應該是不對的。所以jquery後來又加了如下**修復:
//support: ie<9
//handle iteration over inherited properties before own properties.
if( support.ownlast )
}
最後想吐槽一下,一般不要在原型上加自定義方法;陣列的迴圈一般不用for in 。哈哈!
JS中物件幾點需要注意的地方
var person checks for both own properties and prototype properties console.log number in person true console.log constructor in person true only check...
JS陣列的需要注意的問題
一 在js中陣列是我們經常使用的資料型別,也為我們提供了很多方法。但是有些方法需要注意使用 1 indexof args 匹配乙個陣列中與args相等的項的索引位置,如果該陣列包含這個匹配項則返回第乙個匹配的索引,並停止匹配。匹配不到返回 1。1 只匹配第乙個元素的索引。2 匹配使用的全等即 即不會...
js中幾個需要注意的資料型別
undefined undefined型別只有乙個值。即undefined.所有已申明而沒有初始化的變數,預設值都為undefined 函式沒有明確返回值的時候,會預設返回undefined null也是object型別的一種 var s alert s underfinedfunction tes...