談談js中for in 需要注意的地方

2022-03-29 05:01:13 字數 1621 閱讀 8804

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