JavaScript在多瀏覽器下for循環(huán)的使用方法
更新時間:2012年11月07日 10:17:21 作者:
JavaScript語言在不同的瀏覽器的下有存在細微的差異,但不像DOM操作差異那么大,現(xiàn)在為大家列舉出其中一個"for循環(huán)"的差異,并介紹如何有效的解決這種差異
一、前言
JavaScript語言在不同的瀏覽器的下有存在細微的差異,但不像DOM操作差異那么大,現(xiàn)在為大家列舉出其中一個"for循環(huán)"的差異,并介紹如何有效的解決這種差異。
二、問題描述
在下面的 測試代碼 例1 中IE6和Chrome輸出的結果是不一致,IE6不執(zhí)行for語句里的代碼
//例1:
alert("準備測試toString是否被for循環(huán)枚舉出來")
var forTest = { toString: 1 }
for (i in forTest) {
alert("toString被循環(huán)出來")//在IE6下這是不執(zhí)行的,但是在Chrome執(zhí)行并輸出結果值“1”
}
三、分析問題
JavaScript中的對象包含了 'toString', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable','toLocaleString', 'hasOwnProperty', 'constructor'這7個內置方法。這7個內置方法用for語句是無法枚舉出來的。但是IE6和Chrome對內置方法覆蓋的支持不一致。
IE6:雖然 可以對其內置覆蓋 方法,但是 FOR循環(huán)無法枚舉 出來。
Chrome:可以對其內置覆蓋 方法,FOR循環(huán)也能枚舉出覆蓋的內置方法。
所以上面的 測試代碼 例1 中 IE6和Chrome瀏覽器輸出結果不一致
四、解決問題
我們要解決上面描述的問題,我們要做二件事情:
用戶使用的瀏覽器是否支持 FOR循環(huán)枚舉出覆蓋的內置方法
如何優(yōu)雅的解決不兼容問題,使所有的瀏覽器都可以 FOR循環(huán)枚舉出覆蓋的內置方法
(解決代碼 例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則瀏覽器支持枚舉覆蓋的內置方法,否則只能如下面的代碼強制的把內置方法復制到新的對象中。
/**
* 所有屬性復制到指定的對象
* @param {Object} object 待合并的對象
* @param {Object} config 來源屬性
* @return {Object} 返回合并后的對象
*/
function apply(object, config) {
if (object && config && typeof config === 'object') {
var i, j, k;
//這里正常的復制對象的方法
for (i in config) {
object[i] = config[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)在編寫幾個測試代碼,來驗證我們成果 (測試代碼 例3)
//例3:
var a={};
for (i in forTest) {
a[i] = forTest[i];
}
alert(a.toString) //ie6下復制失敗只能輸入"native code",并不是輸出我們覆蓋的值
var b=apply({},forTest)
alert(b.toString)//使用apply函數(shù),在IE6和Chrome輸出的值都是我們預期想得到的覆蓋值”1“
五、總結
筆者猜測在IE6里的for語句把那7個內置函數(shù)標識到忽略列表,所以怎么覆蓋也不能在for中枚舉出來,而Chrome就能夠智能的把覆蓋后的內置函數(shù)復制出來。
使用解決代碼 例2 中的apply函數(shù)即可解決多瀏覽器下for循環(huán)不一致的問題 。
筆者是個菜鳥,也很少寫博客,如果我表達觀點的有錯,或者有筆誤,還請肯請大鳥們糾正錯誤。
六、常見問題
問:為什么不先判斷瀏覽器的版本是否為IE6,在來設置對應的枚舉方案呢?
答:我個人的觀點是,我不確定市場那么多的瀏覽器(PC機就有N種瀏覽器,還有手機瀏覽器,以后也不知道還有什么新版本的瀏覽器)分別是用什么機制的for語制。所以就先測試那的for語句的機制。
JavaScript語言在不同的瀏覽器的下有存在細微的差異,但不像DOM操作差異那么大,現(xiàn)在為大家列舉出其中一個"for循環(huán)"的差異,并介紹如何有效的解決這種差異。
二、問題描述
在下面的 測試代碼 例1 中IE6和Chrome輸出的結果是不一致,IE6不執(zhí)行for語句里的代碼
復制代碼 代碼如下:
//例1:
alert("準備測試toString是否被for循環(huán)枚舉出來")
var forTest = { toString: 1 }
for (i in forTest) {
alert("toString被循環(huán)出來")//在IE6下這是不執(zhí)行的,但是在Chrome執(zhí)行并輸出結果值“1”
}
三、分析問題
JavaScript中的對象包含了 'toString', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable','toLocaleString', 'hasOwnProperty', 'constructor'這7個內置方法。這7個內置方法用for語句是無法枚舉出來的。但是IE6和Chrome對內置方法覆蓋的支持不一致。
IE6:雖然 可以對其內置覆蓋 方法,但是 FOR循環(huán)無法枚舉 出來。
Chrome:可以對其內置覆蓋 方法,FOR循環(huán)也能枚舉出覆蓋的內置方法。
所以上面的 測試代碼 例1 中 IE6和Chrome瀏覽器輸出結果不一致
四、解決問題
我們要解決上面描述的問題,我們要做二件事情:
用戶使用的瀏覽器是否支持 FOR循環(huán)枚舉出覆蓋的內置方法
如何優(yōu)雅的解決不兼容問題,使所有的瀏覽器都可以 FOR循環(huán)枚舉出覆蓋的內置方法
(解決代碼 例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則瀏覽器支持枚舉覆蓋的內置方法,否則只能如下面的代碼強制的把內置方法復制到新的對象中。
/**
* 所有屬性復制到指定的對象
* @param {Object} object 待合并的對象
* @param {Object} config 來源屬性
* @return {Object} 返回合并后的對象
*/
function apply(object, config) {
if (object && config && typeof config === 'object') {
var i, j, k;
//這里正常的復制對象的方法
for (i in config) {
object[i] = config[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)在編寫幾個測試代碼,來驗證我們成果 (測試代碼 例3)
復制代碼 代碼如下:
//例3:
var a={};
for (i in forTest) {
a[i] = forTest[i];
}
alert(a.toString) //ie6下復制失敗只能輸入"native code",并不是輸出我們覆蓋的值
var b=apply({},forTest)
alert(b.toString)//使用apply函數(shù),在IE6和Chrome輸出的值都是我們預期想得到的覆蓋值”1“
五、總結
筆者猜測在IE6里的for語句把那7個內置函數(shù)標識到忽略列表,所以怎么覆蓋也不能在for中枚舉出來,而Chrome就能夠智能的把覆蓋后的內置函數(shù)復制出來。
使用解決代碼 例2 中的apply函數(shù)即可解決多瀏覽器下for循環(huán)不一致的問題 。
筆者是個菜鳥,也很少寫博客,如果我表達觀點的有錯,或者有筆誤,還請肯請大鳥們糾正錯誤。
六、常見問題
問:為什么不先判斷瀏覽器的版本是否為IE6,在來設置對應的枚舉方案呢?
答:我個人的觀點是,我不確定市場那么多的瀏覽器(PC機就有N種瀏覽器,還有手機瀏覽器,以后也不知道還有什么新版本的瀏覽器)分別是用什么機制的for語制。所以就先測試那的for語句的機制。
您可能感興趣的文章:
- JavaScript For...In 使用方法
- javascript下for循環(huán)用法小結
- javascript for循環(huán)設法提高性能
- javascript for循環(huán)從入門到偏門(效率優(yōu)化+奇特用法)
- JavaScript在for循環(huán)中綁定事件解決事件參數(shù)不同的情況
- javascript使用for循環(huán)批量注冊的事件不能正確獲取索引值的解決方法
- Javascript基礎教程之for循環(huán)
- JavaScript中for循環(huán)的使用詳解
- 講解JavaScript中for...in語句的使用方法
- javascript 使用for循環(huán)時該注意的問題-附問題總結
- 跟我學習javascript的for循環(huán)和for...in循環(huán)
相關文章
BootstrapValidator驗證用戶名已存在(ajax)
這篇文章主要為大家詳細介紹了BootstrapValidator驗證用戶名已存在,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11
JS小功能(checkbox實現(xiàn)全選和全取消)實例代碼
這篇文章主要介紹了checkbox實現(xiàn)全選和全取消實例代碼,有需要的朋友可以參考一下2013-11-11
用javascript實現(xiàn)兼容IE7的類庫 IE7_0_9.zip提供下載
用javascript實現(xiàn)兼容IE7的類庫 IE7_0_9.zip提供下載...2007-08-08
javascript判斷iphone/android手機橫豎屏模式的函數(shù)
iphone能很好的使用onorientationchange事件,但是android的onresize事件即使不旋轉也會觸發(fā)多次2011-12-12

