来自 前端技术 2019-09-04 19:43 的文章
当前位置: 六合联盟网 > 前端技术 > 正文

in进行数组遍历陷阱分类

一、提问:在extjs中有如下代码,猜一下施行后的结果?

Author:月影
From:

var arr=[1,2,3];

复制代码 代码如下:

for(var k in arr){

<script> 
function ArrayList() 

  var ins = Array.apply(this, arguments); 
  ins.constructor = arguments.callee; 
  ins.base = Array; 

alert(arr[k]);

  ins.each = function(closure) 
  { 
    if(typeof closure == 'undefined') 
      closure = function(x){return x}; 
    if(typeof closure != 'function') 
    { 
      var c = closure; 
      closure = function(x){return x == c} 
    } 

}

    var ret = new ArrayList(); 
    var args = Array.apply(this, arguments).slice(1); 

二、答案:会先后alert出来5项:

    for(var i = 0; i < this.length; i++) 
    { 
      var rval = closure.apply(this, [this[i]].concat(args).concat(i)) 
      if(rval || rval === 0) 
        ret.push(rval); 
    } 

1,

    return ret; 
  } 

2,

  ins.trim = function() 
  { 
    return this.each.apply(this); 
  } 

3,

  ins.all = function(closure) 
  { 
    return this.each.apply(this, arguments).length == this.length; 
  } 

function(b,c){var a=this.length;c=c||0;c+=(c<0)?a:0;for(;c

  ins.any = function(closure) 
  { 
    return this.each.apply(this, arguments).length > 0; 
  } 

 

  ins.contains = function(el) 
  { 
    return this.any(function(x){return x == el}); 
  } 

===b){return c}}return -1},

  ins.indexOf = function(el) 
  { 
    var ret = this.each.call(this, function(x, i){return el == x?i:false})[0]; 
    return ret ? ret : -1; 
  } 

function(b){var a=this.indexOf(b);if(a!=-1){this.splice(a,1)}return this}

  ins.subarr = function(start, end) 
  { 
    end = end || Math.Infinity; 
    return this.each.call(this, function(x, i){return i >= start && i < end ? x : null}); 
  } 

三、消除措施有两种:

  ins.valueOf = ins.toString; 

1、用length来遍历:

  ins.toString = function() 
  { 
    return '['+this.valueOf()+']'; 
  } 

var arr=[1,2,3];

  ins.map = function(list, closure) 
  { 
    if (typeof list == 'function' && typeof closure != 'function') 
    { 
      var li = closure; 
      closure = list; 
      list = li; 
    } 
    closure = closure || ArrayList; 

var arrLen=arr.length;

    return this.each.call(this, function(x, i){return closure.call(this, x, list[i])}); 
  }; 

for(var i=0; i alert(arr[i]);

  ins.slice = function() 
  { 
    return this.constructor(ins.base.prototype.slice.apply(this, arguments)); 
  } 

}

  ins.splice = function() 
  { 
    return this.constructor(ins.base.prototype.splice.apply(this, arguments)); 
  } 

2、扩充剖断标准:

  ins.concat = function() 
  { 
    return this.constructor(ins.base.prototype.concat.apply(this, arguments)); 
  } 

var arr=[1,2,3];

  return ins; 

for(var k in arr){

var a = new ArrayList(1,2,3); 
alert(a.length); 
alert(a); 
alert(a instanceof Array); 
alert(a.constructor); 
alert(a instanceof ArrayList); // 缺憾那一个值不对,然而迫于完成,只可以甩掉了 

if(arr.hasOwnProperty(k)){

alert(a.each(function(x){return x+x})); 
alert(a.all(function(x){return x>0})); 
alert(a.all(function(x){return x<1})); 
alert(a.any(function(x){return x == 2})); 

alert(arr[k]);

alert(a.contains(2)); 
alert(a.contains(-1)); 

}

var b = a.map([3,2], function(x, y){return x+y}); 
alert(b); 
alert(a.map([2,3,4])); 

}

alert(a.indexOf(2)); 
alert(a.indexOf(-1)); 

四、分析原因:

alert(a.subarr(1,3)); 
alert(a.toString()); 
var b = new ArrayList(a,a); 
alert(b.toString()); 
alert(b.slice(1)); 
</script> 

将�0�2 alert(arr[k]);�0�2�0�2 改为�0�2 alert(k+’�0�2�0�2�0�2 ‘+arr[k]);�0�2�0�2 就拜见到k值比预料多了indexOf和remove。用for in遍历数组的劣点再一次爆出出来。

arr.all 是当数组(集合)中的全数因素都满意条件时,重返true,否则重回false
arr.any 是当数组(会集)中的全部因素中随心所欲一个满意条件时,重回true,尽管都不满意,重回false
arr.each 重回由符合条件的每一个要素构成的子数组
arr.map 是合作五个数组(会集)并把它们的成分用钦定闭包实行计算 

查看ext-base.js源码你会意识ExtJS对JavaScript中的Array、Date、Function、Number、string等举办了增加,对数组的扩展代码如下:

Ext.applyIf(Array.prototype, {

indexOf: function(b, c) {

var a = this.length;

c = c || 0;

c += (c < 0) ? a: 0;

for (; c < a; ++c) {

if (this 

 

=== b) {

return c

}

}

return - 1

},

remove: function(b) {

var a = this.indexOf(b);

if (a != -1) {

this.splice(a, 1)

}

return this

}

});

 

办法求证:

indexOf:剖断钦赐对象是还是不是存在于数组中,倘诺存在则赶回对应的目录,即便不设有则赶回-1。

remove:从数组中删除内定对象。

 

var arr=[1,2,3]; for(var k in arr){ alert(arr[k]); } 二、答案:会先后alert出来5项: 1, 2,...

本文由六合联盟网发布于前端技术,转载请注明出处:in进行数组遍历陷阱分类

关键词: