JavaScript在多瀏覽器下for循環(huán)的使用方法
更新時間:2012年11月07日 10:17:21 作者:
JavaScript語言在不同的瀏覽器的下有存在細(xì)微的差異,但不像DOM操作差異那么大,現(xiàn)在為大家列舉出其中一個"for循環(huán)"的差異,并介紹如何有效的解決這種差異
一、前言
JavaScript語言在不同的瀏覽器的下有存在細(xì)微的差異,但不像DOM操作差異那么大,現(xiàn)在為大家列舉出其中一個"for循環(huán)"的差異,并介紹如何有效的解決這種差異。
二、問題描述
在下面的 測試代碼 例1 中IE6和Chrome輸出的結(jié)果是不一致,IE6不執(zhí)行for語句里的代碼
//例1:
alert("準(zhǔn)備測試toString是否被for循環(huán)枚舉出來")
var forTest = { toString: 1 }
for (i in forTest) {
alert("toString被循環(huán)出來")//在IE6下這是不執(zhí)行的,但是在Chrome執(zhí)行并輸出結(jié)果值“1”
}
三、分析問題
JavaScript中的對象包含了 'toString', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable','toLocaleString', 'hasOwnProperty', 'constructor'這7個內(nèi)置方法。這7個內(nèi)置方法用for語句是無法枚舉出來的。但是IE6和Chrome對內(nèi)置方法覆蓋的支持不一致。
IE6:雖然 可以對其內(nèi)置覆蓋 方法,但是 FOR循環(huán)無法枚舉 出來。
Chrome:可以對其內(nèi)置覆蓋 方法,FOR循環(huán)也能枚舉出覆蓋的內(nèi)置方法。
所以上面的 測試代碼 例1 中 IE6和Chrome瀏覽器輸出結(jié)果不一致
四、解決問題
我們要解決上面描述的問題,我們要做二件事情:
用戶使用的瀏覽器是否支持 FOR循環(huán)枚舉出覆蓋的內(nèi)置方法
如何優(yōu)雅的解決不兼容問題,使所有的瀏覽器都可以 FOR循環(huán)枚舉出覆蓋的內(nèi)置方法
(解決代碼 例2)
//例2:
enumerables = true,
forTest = { toString: 1 }
for (i in forTest) {
enumerables = null;
}
if (enumerables) {//這些都是Object對象的屬性,有的瀏覽器(ie6)的for循環(huán)不會把這些屬性給遍歷出來,所以要手功的把屬性遍歷出來
enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable',
'toLocaleString', 'toString', 'constructor'];
}
//如果enumerables為null則瀏覽器支持枚舉覆蓋的內(nèi)置方法,否則只能如下面的代碼強(qiáng)制的把內(nèi)置方法復(fù)制到新的對象中。
/**
* 所有屬性復(fù)制到指定的對象
* @param {Object} object 待合并的對象
* @param {Object} config 來源屬性
* @return {Object} 返回合并后的對象
*/
function apply(object, config) {
if (object && config && typeof config === 'object') {
var i, j, k;
//這里正常的復(fù)制對象的方法
for (i in config) {
object[i] = config[i];
}
//兼容多瀏覽器把內(nèi)置的屬性都能重制新的對象中
if (enumerables) {
for (j = enumerables.length; j--;) {
k = enumerables[j];
if (config.hasOwnProperty(k)) {//判斷對象是否有某個特定的屬性。必須用字符串指定該屬性。(例如,config.hasOwnProperty("toString"))
object[k] = config[k];
}
}
}
}
return object;
};
現(xiàn)在編寫幾個測試代碼,來驗(yàn)證我們成果 (測試代碼 例3)
//例3:
var a={};
for (i in forTest) {
a[i] = forTest[i];
}
alert(a.toString) //ie6下復(fù)制失敗只能輸入"native code",并不是輸出我們覆蓋的值
var b=apply({},forTest)
alert(b.toString)//使用apply函數(shù),在IE6和Chrome輸出的值都是我們預(yù)期想得到的覆蓋值”1“
五、總結(jié)
筆者猜測在IE6里的for語句把那7個內(nèi)置函數(shù)標(biāo)識到忽略列表,所以怎么覆蓋也不能在for中枚舉出來,而Chrome就能夠智能的把覆蓋后的內(nèi)置函數(shù)復(fù)制出來。
使用解決代碼 例2 中的apply函數(shù)即可解決多瀏覽器下for循環(huán)不一致的問題 。
筆者是個菜鳥,也很少寫博客,如果我表達(dá)觀點(diǎn)的有錯,或者有筆誤,還請肯請大鳥們糾正錯誤。
六、常見問題
問:為什么不先判斷瀏覽器的版本是否為IE6,在來設(shè)置對應(yīng)的枚舉方案呢?
答:我個人的觀點(diǎn)是,我不確定市場那么多的瀏覽器(PC機(jī)就有N種瀏覽器,還有手機(jī)瀏覽器,以后也不知道還有什么新版本的瀏覽器)分別是用什么機(jī)制的for語制。所以就先測試那的for語句的機(jī)制。
JavaScript語言在不同的瀏覽器的下有存在細(xì)微的差異,但不像DOM操作差異那么大,現(xiàn)在為大家列舉出其中一個"for循環(huán)"的差異,并介紹如何有效的解決這種差異。
二、問題描述
在下面的 測試代碼 例1 中IE6和Chrome輸出的結(jié)果是不一致,IE6不執(zhí)行for語句里的代碼
復(fù)制代碼 代碼如下:
//例1:
alert("準(zhǔn)備測試toString是否被for循環(huán)枚舉出來")
var forTest = { toString: 1 }
for (i in forTest) {
alert("toString被循環(huán)出來")//在IE6下這是不執(zhí)行的,但是在Chrome執(zhí)行并輸出結(jié)果值“1”
}
三、分析問題
JavaScript中的對象包含了 'toString', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable','toLocaleString', 'hasOwnProperty', 'constructor'這7個內(nèi)置方法。這7個內(nèi)置方法用for語句是無法枚舉出來的。但是IE6和Chrome對內(nèi)置方法覆蓋的支持不一致。
IE6:雖然 可以對其內(nèi)置覆蓋 方法,但是 FOR循環(huán)無法枚舉 出來。
Chrome:可以對其內(nèi)置覆蓋 方法,FOR循環(huán)也能枚舉出覆蓋的內(nèi)置方法。
所以上面的 測試代碼 例1 中 IE6和Chrome瀏覽器輸出結(jié)果不一致
四、解決問題
我們要解決上面描述的問題,我們要做二件事情:
用戶使用的瀏覽器是否支持 FOR循環(huán)枚舉出覆蓋的內(nèi)置方法
如何優(yōu)雅的解決不兼容問題,使所有的瀏覽器都可以 FOR循環(huán)枚舉出覆蓋的內(nèi)置方法
(解決代碼 例2)
復(fù)制代碼 代碼如下:
//例2:
enumerables = true,
forTest = { toString: 1 }
for (i in forTest) {
enumerables = null;
}
if (enumerables) {//這些都是Object對象的屬性,有的瀏覽器(ie6)的for循環(huán)不會把這些屬性給遍歷出來,所以要手功的把屬性遍歷出來
enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable',
'toLocaleString', 'toString', 'constructor'];
}
//如果enumerables為null則瀏覽器支持枚舉覆蓋的內(nèi)置方法,否則只能如下面的代碼強(qiáng)制的把內(nèi)置方法復(fù)制到新的對象中。
/**
* 所有屬性復(fù)制到指定的對象
* @param {Object} object 待合并的對象
* @param {Object} config 來源屬性
* @return {Object} 返回合并后的對象
*/
function apply(object, config) {
if (object && config && typeof config === 'object') {
var i, j, k;
//這里正常的復(fù)制對象的方法
for (i in config) {
object[i] = config[i];
}
//兼容多瀏覽器把內(nèi)置的屬性都能重制新的對象中
if (enumerables) {
for (j = enumerables.length; j--;) {
k = enumerables[j];
if (config.hasOwnProperty(k)) {//判斷對象是否有某個特定的屬性。必須用字符串指定該屬性。(例如,config.hasOwnProperty("toString"))
object[k] = config[k];
}
}
}
}
return object;
};
現(xiàn)在編寫幾個測試代碼,來驗(yàn)證我們成果 (測試代碼 例3)
復(fù)制代碼 代碼如下:
//例3:
var a={};
for (i in forTest) {
a[i] = forTest[i];
}
alert(a.toString) //ie6下復(fù)制失敗只能輸入"native code",并不是輸出我們覆蓋的值
var b=apply({},forTest)
alert(b.toString)//使用apply函數(shù),在IE6和Chrome輸出的值都是我們預(yù)期想得到的覆蓋值”1“
五、總結(jié)
筆者猜測在IE6里的for語句把那7個內(nèi)置函數(shù)標(biāo)識到忽略列表,所以怎么覆蓋也不能在for中枚舉出來,而Chrome就能夠智能的把覆蓋后的內(nèi)置函數(shù)復(fù)制出來。
使用解決代碼 例2 中的apply函數(shù)即可解決多瀏覽器下for循環(huán)不一致的問題 。
筆者是個菜鳥,也很少寫博客,如果我表達(dá)觀點(diǎn)的有錯,或者有筆誤,還請肯請大鳥們糾正錯誤。
六、常見問題
問:為什么不先判斷瀏覽器的版本是否為IE6,在來設(shè)置對應(yīng)的枚舉方案呢?
答:我個人的觀點(diǎn)是,我不確定市場那么多的瀏覽器(PC機(jī)就有N種瀏覽器,還有手機(jī)瀏覽器,以后也不知道還有什么新版本的瀏覽器)分別是用什么機(jī)制的for語制。所以就先測試那的for語句的機(jī)制。
您可能感興趣的文章:
- JavaScript For...In 使用方法
- javascript下for循環(huán)用法小結(jié)
- javascript for循環(huán)設(shè)法提高性能
- javascript for循環(huán)從入門到偏門(效率優(yōu)化+奇特用法)
- JavaScript在for循環(huán)中綁定事件解決事件參數(shù)不同的情況
- javascript使用for循環(huán)批量注冊的事件不能正確獲取索引值的解決方法
- Javascript基礎(chǔ)教程之for循環(huán)
- JavaScript中for循環(huán)的使用詳解
- 講解JavaScript中for...in語句的使用方法
- javascript 使用for循環(huán)時該注意的問題-附問題總結(jié)
- 跟我學(xué)習(xí)javascript的for循環(huán)和for...in循環(huán)
相關(guān)文章
Javascript實(shí)現(xiàn)Vue跨組件通信的方法詳解
這篇文章主要為大家詳細(xì)介紹了Vue的跨組件通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
跨瀏覽器開發(fā)經(jīng)驗(yàn)總結(jié)(三) 警惕“IE依賴綜合癥”
跨瀏覽器開發(fā)經(jīng)驗(yàn)總結(jié)(三) 警惕“IE依賴綜合癥”2010-05-05
Javascript保存網(wǎng)頁為圖片借助于html2canvas庫實(shí)現(xiàn)
借助于html2canvas庫,把網(wǎng)頁保存為Canvas畫布,再把生成的canvas保存成圖片,下面的示例,大家可以看看2014-09-09
JavaScript cookie與session的使用及區(qū)別深入探究
這篇文章主要介紹了Java中Cookie和Session詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下2022-10-10

