被人问了一段代码的问题,一脸懵逼,为了分析清楚自己注释了一遍
Array.prototype.uniq = function(){
var resArr = [];//返回的去处重复元素的数组
var flag = true;//是否已插入过NaN元素
for(var i=0;i<this.length;i++){//从头到尾遍历要处理的数组
if(resArr.indexOf(this[i]) == -1){
//如果要返回的数字中没有当前遍历的元素
//indexOf方法无法识别数组的 NaN成员
//所以对于NaN元素需要单独判断
if(this[i] != this[i]){//如果当前元素是NaN元素
if(flag){//且返回数组中还没有压入过NaN元素
resArr.push(this[i]);//插入NaN元素
flag = false;//标记置为已插入,即下次再遇到无需重复插入
}
}else{//其他情况表示所遭遇元素还没有插入过要返回的结果数组
resArr.push(this[i]);//直接插入该元素即可
}
}
}
return resArr;//遍历结束,返回结果
}
然后某君曰:“{}!={}不是为true吗?那{}元素为什么可以插入很多次?”
这里就不解释我坑爹的探索之旅了,总之:
- indexOf方法无法识别NaN成员,所以要单独处理;
- {}!={}是因为前后两个{}代表两个不同的空对象;
- js中对象判断是通过比较引用所指向的内存地址是否一样来实现的;
网友评论