for in的使用

346 阅读2分钟

for in的使用

关于for in这个的使用场景:

1.遍历数组,变量里面存储的是字符串类型的索引

2.遍历对象,变量里面存储的是对象的key值

3.遍历字符串,变量里面存储的是字符串类型的索引

4.遍历undefined,null,'',0,false(不会报错)

注意事项:

1.在遍历数组时,for in会遍历数组所有可枚举的属性(包括原型,可以通过hasOwnProperty进行判断)

2.在遍历对象时,for in会遍历对象所有可枚举的属性(包括原型,可以通过hasOwnProperty进行判断)

3.如何跳出for in循环,使用break和continue

代码示例:

var arr = [11,22,33]
for(var i in arr){
  console.log(typeof i,i) // string 0,string 1,string 2
}
​
var obj = {
  name:'zq',
  age:18
}
for(var i in obj){
  console.log(i) //name,age
}
var str = 'abc'
for(var i in str){ 
  console.log(i)// 0,1,2
}
​
var specObj1 = null;
for(var i in specObj1){ // 不会报错
  console.log(i)
}
​
var specObj2 = undefined;
for(var i in specObj2){ // 不会报错
  console.log(i)
}
​
var specObj3 = '';
for(var i in specObj3){ // 不会报错
  console.log(i)
}
var specObj4 = false;
for(var i in specObj4){ // 不会报错
  console.log(i)
}
​
var specObj5 = 0;
for(var i in specObj5){ // 不会报错
  console.log(i)
}
​
console.log('注意事项')
// 1.for in 会遍历数组原型上的可读属性
var array = ['z','q']
array.age = 18;
Array.prototype.a = 123;
console.log(array instanceof Array) // true ['z','q',age:18],这是个数组吗?
console.log(array) // ['z','q',age:18],这是个数组吗?true
console.log(Array.isArray(Array)) // false(这个网上说是不准确的)
console.log(Array.isArray(array)) // true
console.log(Object.prototype.toString.call(arr)); // [object Array]for(var i in array){
  console.log(i) // 0,1,age,a
  if(array.hasOwnProperty(i)){
    console.log(i) // 0,1,age
  }
}
// 2.for in 会遍历对象上的可读属性吗?会
var object = {
  name:'z',
  age:1
}
Object.prototype.sex = '女'
for(var k in object){
  console.log(k) // name,age,sex
  if(object.hasOwnProperty(k)){
    console.log(k) // name,age
  }
}
// hasOwnProperty不会检查原型链上的属性
console.log(Object.hasOwnProperty('hasOwnProperty')) // false
console.log(Object.prototype.hasOwnProperty('hasOwnProperty')) // true//3. for in 如何跳出循环?
var jump = [1,2,3]
for(var i in jump){
  if(i == 1){
    console.log(i);
    //return;// Illegal return statement (at
    // return true;// Illegal return statement (at
    //break; // ok跳出整个循环,// 执行,1
    continue;// 跳出本次循环
  }
  console.log('执行')
}
​
​