浅析JavaScript中的array数组类型系统(3)

  javascript规范允许for/in循环以不同的顺序遍历对象的属性。通常数组元素的遍历实现是升序的,但不能保证一定是这样的。特别地,如果数组同时拥有对象属性和数组元素,返回的属性名很可能是按照创建的顺序而非数值的大小顺序。如果算法依赖于遍历的顺序,那么最好不要使用for/in而用常规的for循环

类数组

  拥有length属性和对应非负整数属性的对象叫做类数组(array-like object)

//类数组演示 var a = {}; var i = 0; while(i < 10){ a[i] = i*i; i++; } a.length = i; var total = 0; for(var j = 0; j < a.length; j++){ total += a[j]; }

  有三个常见的类数组对象:

  【1】arguments对象

// arguments对象 function args() { return arguments } var arrayLike = args('a', 'b'); arrayLike[0] // 'a' arrayLike.length // 2 arrayLike instanceof Array // false

  【2】DOM方法(如document.getElementsByTagName()方法)返回的对象

// DOM元素 var elts = document.getElementsByTagName('h3'); elts.length // 3 elts instanceof Array // false

  【3】字符串

// 字符串 'abc'[1] // 'b' 'abc'.length // 3 'abc' instanceof Array // false

  [注意]字符串是不可变值,故当把它们作为数组看待时,它们是只读的。如push()、sort()、reverse()、splice()等数组方法会修改数组,它们在字符串上是无效的,且会报错

var str = 'abc'; Array.prototype.forEach.call(str, function(chr) { console.log(chr);//a b c }); Array.prototype.splice.call(str,1); console.log(str);//TypeError: Cannot delete property '2' of [object String]

  数组的slice方法将类数组对象变成真正的数组

var arr = Array.prototype.slice.call(arrayLike);

  javascript数组方法是特意定义为通用的,因此它们不仅应用在真正的数组而且在类数组对象上都能正确工作。在ECMAScript5中,所有的数组方法都是通用的。在ECMAScript3中,除了toString()和toLocaleString()以外的所有方法也是通用的

var a = {'0':'a','1':'b','2':'c',length:3}; Array.prototype.join.call(a,'+');//'a+b+c' Array.prototype.slice.call(a,0);//['a','b','c'] Array.prototype.map.call(a,function(x){return x.toUpperCase();});//['A','B','C']

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzsyjs.html