for循环删除数组时的问题
来源:互联网 发布:非线性优化 编辑:程序博客网 时间:2024/04/27 17:17
在删除数组元素时,会引起数组长度变换。下面的两种写法,在一次删除一个数组元素时,是没有问题的。
var fruits = ["Banana", "Orange", "Apple", "Mango"];for (var i = fruits.length - 1; i >= 0; i--) { if (fruits[i] === "Apple"){ fruits.splice(i,1); }}console.log("fruits is ",fruits);
或者
var fruits = ["Banana", "Orange", "Apple", "Mango"];for (var i = 0; i < fruits.length; i++) { if (fruits[i] === "Apple") { fruits.splice(i, 1); }}console.log("fruits is ", fruits);
以上代码可以遍历,完成一个元素的删除。
但是当元素有重复的时候,就需要对index进行操作:
"use strict";var fruits = ["Banana", "Orange", "Apple", "Apple","Mango"];for (var i = 0; i < fruits.length; i++) { if (fruits[i] === "Apple") { fruits.splice(i, 1); i--; // 不然会少删除Apple }}console.log("fruits is ", fruits);
js Array的原型提供的filter方法,也可删除数组中不需要的元素,但是新new了一个数组来存放需要的元素,并不改变原有数组的内容。因此不存在上面的问题。
其内部实现如下:
if (!Array.prototype.filter){ Array.prototype.filter = function(fun /* , thisArg*/) { "use strict"; if (this === void 0 || this === null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (typeof fun !== "function") throw new TypeError(); var res = []; var thisArg = arguments.length >= 2 ? arguments[1] : void 0; for (var i = 0; i < len; i++) { if (i in t) { var val = t[i]; // NOTE: Technically this should Object.defineProperty at // the next index, as push can be affected by // properties on Object.prototype and Array.prototype. // But that method's new, and collisions should be // rare, so use the more-compatible alternative. if (fun.call(thisArg, val, i, t)) res.push(val); } } return res; };}
以上代码中有 void 0的使用。 void 是 JavaScript 中非常重要的关键字,该操作符指定要计算一个表达式但是不返回值。例如,javascript:void(0), 表示一个死链接;又如
a = void(5+7);console.log(a); // undefined
那么问题来了,为啥用void 0。非严格模式下,undefined是可以重写的,严格模式则不能重写。所以,用void 0是为了防止undefined被重写而出现判断不准确的情况。
阅读全文
0 0
- for循环删除数组时的问题
- 关于swift for 循环 遍历数组删除元素的bug问题
- for循环/forEach,不要删除数组元素
- for循环中删除集合元素的问题
- for循环删除List中的数据产生的问题
- java中for循环删除元素的问题
- for循环调用数组时的控制
- 在循环的过程中删除数组元素的问题
- 使用splice函数对数组中的元素进行删除for循环和for...in的区别
- java 增强for循环中的删除问题
- 用数组+for循环解决递归问题
- for 循环删除数组里面的多个对象 需要用到 removeObjectsAtIndexes
- 约瑟夫环:每隔两个循环删除数组元素,求最后删除者的下标问题
- for循环中删除精灵的处理
- for循环的效率问题
- for循环的嵌套问题
- 用for循环来删除ArrayList集合中的所有元素所遇到的问题
- for循环增强(数组的遍历)
- 解决NLog输出中文为乱码问题
- .net中的Queue和Stack,及各种list集合使用
- 75.颜色排序
- 人和人最大的差别不是技术上的高低,而是你的人生观价值观
- redhat-kernel-kdump-crash----内核dump文件分析
- for循环删除数组时的问题
- 如何学习网络编程
- 库文件如何加载到内存?程序编译如何找到这些库文件并加载?
- SDWebImage的实现原理
- Linux系统中的文件的s权限
- Get和Post请求的区别
- DX,DevExpress中的RichEditControl如何替换选中的文字
- WOJ1064-What is Left
- EVC