踩坑之为数组原型扩展方法
来源:互联网 发布:部落冲突防御设施数据 编辑:程序博客网 时间:2024/06/05 21:49
首先来看一段神奇的代码
Array.prototype.remove = function(item){ var idx = this.indexOf(item); if(idx >= 0){ return this.splice(idx,1); } return null;}var arr = [1,3,5,2,4];console.log(arr.remove(3),arr);for(var i in arr){ if(typeof arr[i] === 'number'){ console.log(arr[i]); } else{ console.log([i,'什么鬼']); }}
结果:
[ 3 ] [ 1, 5, 2, 4 ]
1
5
2
4
[ ‘remove’, ‘什么鬼’ ]
没错啊 是吧 为啥最后一个元素是一个remove方法呢,得不到我们预期的结果啊,用原型对象来扩展方法后用for-in遍历会出现这种坑。一般来说for in是用来遍历对象属性的,而数组还是要用for来遍历。所以经过修改我试着采用ES5中的defineProperty来实现这个效果。代码如下:
Object.defineProperty(Array.prototype,'remove', {value:function(item){ var idx = this.indexOf(item); if(idx >= 0){ return this.splice(idx,1); } return null;}});var arr = [1,3,5,2,4];console.log(arr.remove(3),arr);for(var i in arr){ if(typeof arr[i] === 'number'){ console.log(arr[i]); } else{ console.log([i,'什么鬼']); }}
结果:
[ 3 ] [ 1, 5, 2, 4 ]
1
5
2
4
出现这个情况的原因我觉得是remove作为一个属性方法赋值给了数组,之后在用for-in遍历时会将这个属性输出,所以以后为了避免出现这个坑,还是用defineProperty好点。
0 0
- 踩坑之为数组原型扩展方法
- js 原型扩展数组array循环each方法
- 基于内置类的原型扩展方法实现数组去重
- JavaScript Date的原型方法扩展
- js数组方法扩展
- 学以致用之javascript数组原型
- 悟透JavaScript之原型扩展 ---(1)
- 悟透JavaScript之原型扩展 ---(2)
- ECMAScript6(ES6)标准之数组Array扩展方法
- 在Array原型链上扩展remove,contain等方法所遇到的坑
- JavaScript之Object原型方法
- javascript 学习之原型示例练习--- 实现一个each方法,遍历多维数组
- C# 为类型扩展方法
- 利用扩展方法将DataTable转换为特定类型的对象数组
- JavaScript数组去重的原型方法
- js数组的扩展方法
- js Array 数组方法扩展
- 对数组操作扩展方法
- JAVA——构建字符串StringBuilder(二)
- Iterator
- sap 物料MIGO入库时[有关业务/事件类型WA在年2017的号码范围不存在]的解决方法
- 时间日期格式转换
- 【51NOD 1048】【51NOD 1383】整数分解为2的幂 V2
- 踩坑之为数组原型扩展方法
- numpy常用函数及实例
- 谈谈互联网后端基础设施(转载)
- hdu--3782--找规律--xxx定律
- Linux下查看文件和文件夹大小
- C#学习之----string和StringBuilder
- 基于域名的虚拟主机配置(Nginx在 Linux下配置)
- JSP include,paramer
- hdu 1160 FatMouse's Speed ( LIS )