今天使用for in 发现问题:
For(let index in array)
index 并不是Number 而是String 所以check 要check ‘2’
所以准备抽空研究下 forEach for of for in区别
先说结论
const arr = ['a', 'b', 'c'];
arr.forEach(function(element) {
console.log(element);
});
array.forEach(callback(currentValue, index, array){
//do something
}, this)
array.forEach(callback[, thisArg])
forEach() 方法对数组的每个元素执行一次提供的回调函数。
forEach 方法按升序为数组中含有效值的每一项执行一次callback 函数,那些已删除(使用delete方法等情况)或者未初始化的项将被跳过(但不包括那些值为 undefined 的项)(例如在稀疏数组上)。
遍历的范围在第一次调用 callback 前就会确定。调用forEach 后添加到数组中的项不会被 callback 访问到。如果已经存在的值被改变,则传递给 callback 的值是 forEach 遍历到他们那一刻的值。已删除的项不会被遍历到。如果已访问的元素在迭代时被删除了(例如使用 shift()) ,之后的元素将被跳过。
您正在测试一个数组里的元素是否符合某条件,且需要返回一个布尔值。
那么可使用 Array.every 或 Array.some。如果可用,新方法 find() 或者findIndex() 也可被用于真值测试的提早终止。如:
var objArr = [{id:1, name:'jiankian'}, {id:23, name:'anan'}, {id:188, name:'superme'}, {id:233, name:'jobs'}, {id:288, name:'bill', age:89}, {id:333}] ;
var ret2 = objArr.find((v) => {
return v.id == 233;
});
for (variable in object) {...}
for…in语句以任意顺序遍历一个对象的可枚举属性。对于每个不同的属性,语句都会被执行。
注意 for in 是用于对象
1 因为JavaScript中数组比较特殊,所以也可以使用for in。想想对象的属性不应该是Number类型,
所以用for in 去遍历数组得到index 是string也就可以理解了,该背锅。
2 如果你在数组中定义了一个defect 属性,那for in也会将defect遍历到。
归根结底 这些都是for in被用于数组上才弄出来的问题。
samplecode:
let testArray = ['test1', 'test2', 'test3'];
for(let index in testArray){
console.log(typeof(index));
console.log(index+":"+testArray[index]);
}
testArray.defect = "this is for in defect"
for(let index in testArray){
console.log(index+":"+testArray[index]);
}
输出:
string
0:test1
string
1:test2
0:test1
1:test2
defect:this is for in defect
for (variable of iterable) {
//statements
}
for…of语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句
测试code:
let testArray = ['test1', 'test2'];
let teststring = "hello";
let testObject = {
test1:"hello",
test2:"world",
};
let testMap = new Map([["a", 1], ["b", 2], ["c", 3]]);
for (let value of testArray){
console.log(value);
}
for (let value of teststring){
console.log(value);
if(value === 'l')
break;
}
for (let value of testMap){
console.log(value);
}
输出
test1
test2
h
e
l
[ 'a', 1 ]
[ 'b', 2 ]
[ 'c', 3 ]
1 for-of 并不适用于处理原有的原生对象
2 for of 可以使用break, continue 和 return
https://www.cnblogs.com/xueshanshan/p/8487438.html
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/for...of