Javascript 在阵列上异步操作时的副作用
我正在学习node.js atm,现在我在问自己: 普通阵列的“线程安全”程度如何 例如:Javascript 在阵列上异步操作时的副作用,javascript,node.js,Javascript,Node.js,我正在学习node.js atm,现在我在问自己: 普通阵列的“线程安全”程度如何 例如: var myArr = ["Alpha", "Beta", "Gamma", "Delta"]; ee.on('event', function(itemString) { //Loop over an Array that could change its length while looping through for(var i=0; i<myArr.length; i++)
var myArr = ["Alpha", "Beta", "Gamma", "Delta"];
ee.on('event', function(itemString) {
//Loop over an Array that could change its length while looping through
for(var i=0; i<myArr.length; i++) {
// delete the item out of the array
if(myArr[i] == itemString)
myArr.splice(i,1);
}
});
var myArr=[“α”、“β”、“γ”、“δ”];
ee.on('event',函数(itemString){
//在数组上循环,该数组可以在循环时更改其长度
for(var i=0;inode.js
是单线程的,它不会中断同步执行
尽管如此,您仍在修改数组,同时按其长度进行迭代,这可能会导致跳过元素。
此外,您的事件不准备为同一数组元素触发两次。我认为我们已经很好地讨论了线程问题,但您确实应该解决循环问题。有关我所说的“跳过”问题的示例,请尝试以下方法:
var a = [1, 2, 3, 4, 5];
for (var i = 0; i < a.length; i++) {
console.log(a[i]);
if (a[i] === 2) {
a.splice(i, 1);
}
}
请注意,这个循环从未看到数字3
修复此类循环的一种常见方法是,在对数组进行迭代时,可以安全地删除数组中的元素:
var a = [1, 2, 3, 4, 5];
for (var i = a.length - 1; i >= 0; i--) {
console.log(a[i]);
if (a[i] === 2) {
a.splice(i, 1);
}
}
输出:
1
2
4
5
5
4
3
2
1
请注意,我们是这样看待数组的所有元素的。Node.js是单线程的,因此您的代码不能被另一个线程中断。但是上面的代码被破坏了,因为您在迭代过程中修改数组的方式有时会导致跳过元素。假设所有元素数组中的元素是不同的。(您可以跳过一个元素,但只有在找到匹配的元素后,这意味着不再有匹配的元素,所以您才不在乎。)您可能想看看定义“分解?”我很确定最坏的情况是跳过元素。@smarx好吧,如果你有10个元素,在第9次迭代中删除一个,那么就找不到第10个元素。如果数组变短,for循环将永远不会到达第10个元素。(条件i
将在i
达到值9
之前失败)我想知道的是,是否有办法确保循环不会跳过或失败,因为任何元素都可能被同一事件的另一个回调调用删除。关于你的回答:我还没有注意到这种行为……向后循环数组与“正常”方法有什么区别?正如我所说,Node.js是单线程的aded,因此没有其他线程可以打断您。至于为什么向后迭代可以解决跳过问题,我鼓励您手动完成,注意I
的值和数组的内容。