本文详解JavaScript中in关键字与for-in循环的用法。for-in适用于对象枚举,不建议用于数组。in操作符用于检测属性是否存在,包括原型链继承属性。需注意delete与undefined赋值对in检测结果的影响,以及原型属性遍历的潜在问题。
for-in循环与对象枚举
for-in循环主要应用于非数组对象的遍历,这种遍历方式通常被称为“枚举”。
虽然对数组使用for-in也能迭代出元素,但官方并不推荐这种做法。原因在于for-in无法保证遍历顺序,且若Array原型上定义了额外属性,这些属性也会被遍历出来,因此
建议数组遍历采用标准for循环,而对象遍历则使用for-in循环。
当用于对象时,for-in循环迭代输出的是对象的属性名。
var obj = {
"key1":"value1",
"key2":"value2",
"key3":"value3"
};
function EnumaKey(){
for(var key in obj ){
alert(key);
}
}
function EnumaVal(){
for(var key in obj ){
alert(obj[key]);
}
}
in关键字的属性检测机制
在JavaScript中,in关键字还具有其他重要功能。
具体定义如下:
in操作符用于判断指定属性是否属于某个对象。该属性既可以是对象自身的直接属性,也可以是经由prototype原型链继承而来的属性。
var Fn = function () { this.age = 1; };
Fn.prototype.name = 'jim';
// Fn.prototype.age = undefined;
var f = new Fn();
// hasOwnProperty
// 如何判断属性是被继承的???
console.log( 'age' in f && !f.hasOwnProperty( 'age' ) );
// age 可能存在原型链上, 也可能不存在
// 如果属性值就是 null 或 undefined, 那么此时 f.age 就无法判断了
在检查一般对象属性时,必须使用字符串形式指定属性名称。
例如:
var mycar = {make: "Honda", model: "Accord", year: 1998};
"make" in mycar // returns true
"model" in mycar // returns true
若使用delete操作符删除了某属性,再次使用in进行检查时将返回false,示例如下:
var mycar = {make: "Honda", model: "Accord", year: 1998};
delete mycar.make;
"make" in mycar; // returns false
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
delete trees[3];
3 in trees; // returns false
若仅将属性值赋为undefined而未使用delete操作符,使用in检查时仍会返回true。
var mycar = {make: "Honda", model: "Accord", year: 1998};
mycar.make = undefined;
"make" in mycar; // returns true
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
trees[3] = undefined;
3 in trees; // returns true
以上介绍了JavaScript中in关键字的主要使用方法,希望能帮助读者理解。如有任何疑问,欢迎留言交流,小编将及时回复。感谢大家对本站的支持!