for in/ for of
for…in循环会遍历一个object所有的可枚举属性。
for…of会遍历具有iterator接口的数据结构。
for…in 遍历(当前对象及其原型上的)每一个属性名称,到对像的key或数组,字符串的下标
for…of遍历(当前对象上的)每一个属性值。
原生具备 Iterator 接口的数据结构如下:
Array
Map
Set
String
TypedArray
函数的arguments对象
NodeList对象
in
参考学习:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/in
指定的属性在指定的对象或其原型链中,则in 运算符返回true。
(prop in object)
prop:一个字符串类型或者 symbol 类型的属性名或者数组索引(非symbol类型将会强制转为字符串)。
如果你使用 delete 运算符删除了一个属性,则 in 运算符对所删除属性返回 false。
如果你只是将一个属性的值赋值为undefined,而没有删除它,则 in 运算仍然会返回true。
继承属性:
如果一个属性是从原型链上继承来的,in 运算符也会返回 true。
“toString” in {}; // 返回true
for in
for in的写法:
var wq = {
age:20,
name:"咸鱼",
sex:"男"
}
for(var attr in wq){//attr是属性,attr可以换成任意变量名
console.log(attr);// 输出的是 属性名:age name sex
console.log(wq[attr]);//属性相对应的值 20 咸鱼 男
}
forEach
forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。
array.forEach(function(currentValue, index, arr), thisValue)
currentValue 必需。
当前元素 index 可选。当前元素的索引值。
arr 可选。当前元素所属的数组对象。
for in也可以遍历数组,但是会存在以下几个问题。
1、index索引为字符串型数字,不能直接进行几何运算
2、遍历顺序有可能不是按照实际数组的内部顺序
3、使用for in会遍历数组所有的可枚举属性,包括原型。例如上栗的原型方法method和name属性
遍历普通数组的话,用for是最好的选择,但是如果是对象,就for in就好了。