js将类数组对象转换成数组对象在标准浏览器中,好像只要对象存在length属性,就能把它转换为数组,但IE就不尽然。
1※※※※※※※※※※※※※※ function test(){
alert(arguments) arguments =
Array.prototype.slice.call( arguments);
alert(arguments instanceof Array);
alert(arguments) }
test(1,2,3,4);
//※※※※※※※※※※※测试
2※※※※※※※※※※※※※※ var htmlcollection = ElementsB yTagName("h3");
alert(htmlcollection) try{ htmlcollection = Array.prototype.slice.call( htmlcollection);
alert(htmlcollection instanceof Array);
alert(htmlcollection);
}catch(e){ alert(e) }
//※※※※※※※※※※※测试
3※※※※※※※※※※※※※※ var sheets = document.styleSheets; alert(sheets) try{ sheets = Array.prototype.slice.call( sheets); alert(sheets instanceof Array);
alert(sheets); }catch(e){ alert(e) }
//※※※※※※※※※※※测试
4※※※※※※※※※※※※※※ var arrayLike = { 0 : '司徒正美', 1 : '司徒正美', 2 : '司徒正美', length : 3 }; alert(arrayLike) arrayLike =js合并两个数组
Array.prototype.slice.call( arrayLike);
alert(arrayLike instanceof Array); alert(arrayLike); </script> 全选注:引⼊外部Js需再刷新⼀下页⾯才能执⾏]
接着我们看看各⼤类库的处理:
复制代码代码如下:
//jQuery的makeArray
var makeArray = function( array ) {
var ret = [];
if( array != null ){
var i = array.length;
// The window, strings (and functions) also have 'length'
if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
ret[0] = array;
else
while( i )
ret[--i] = array[i];
}
return ret;
}
jQuery对象是⽤来储存与处理dom元素的,它主要依赖于setArray⽅法来设置与维护长度与索引,⽽setArray的参数要求是⼀个数组,因此makeArray的地位⾮常重要。这⽅法保证就算没有参数也要返回⼀个空数组。
Prototype.js的$A⽅法
复制代码代码如下:
function $A(iterable) {
if (!iterable) return [];
if (Array) Array();
var length = iterable.length || 0, results = new Array(length);
while (length--) results[length] = iterable[length];
return results;
}
mootools的$A⽅法
复制代码代码如下:
function $A(iterable){
if (iterable.item){
var l = iterable.length, array = new Array(l);
while (l--) array[l] = iterable[l];
return array;
}
return Array.prototype.slice.call(iterable);
};
Ext的toArray⽅法
复制代码代码如下:
var toArray = function(){
return isIE ?
function(a, i, j, res){
res = [];
Ext.each(a, function(v) {
res.push(v);
});
return res.slice(i || 0, j || res.length);
} :
function(a, i, j){
return Array.prototype.slice.call(a, i || 0, j || a.length);
}
}()
Ext的设计⽐较巧妙,功能也⽐较强⼤。它⼀开始就⾃动执⾏⾃⾝,以后就不⽤判定浏览器了。它还有两个可选参数,对⽣成的纯数组进⾏操作。
最后看dojo的_toArray,dojo的实现总是那么怪异的。和Ext⼀样,后⾯两个参数是可选,只不过第⼆个是偏移量,最后⼀个是已有的数组,⽤于把新⽣的新组元素合并过去。
复制代码代码如下:
(function(){
var efficient = function(obj, offset, startWith){
return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0));
};
var slow = function(obj, offset, startWith){
var arr = startWith||[];
for(var x = offset || 0; x >obj.length; x++){
arr.push(obj[x]);
}
return arr;
};
dojo._toArray =
dojo.isIE ? function(obj){
return ((obj.item) ? slow : efficient).apply(this, arguments);
} :
efficient;
})();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。