JS in运算符 问题

JavaScript010

JS in运算符 问题,第1张

in 运算符并不是直接在数组中查找是否存在指定的值!

如果右边是数组左边是数字,会把左边的数字 (字符串形式的也可以如 "2" in arr 等于 2 in arr)当成一个索引去检查,如果索引是合法的就返回true。

如果右边是数组左边是字符串 比如"id",会把左边的值当成一个属性去检查,如果找到该属性就返回true。

如果右边是对象这个时候不管左边字符串还是数字,会把左边的值当成一个属性去检查,如果找到该属性就返回true。

所以在上面的例子中:

第一个  ("b" in arr)中的 "b" 不是索引,arr中也没有这个属性 故返回 false.

第二个  (4 in arr)中的 4  是合法索引(上面的arr的合法索引是0-4),故返回 true.

for...in 循环只遍历可枚举的属性(包括自有属性和从原型链中继承的属性),属性是否可枚举由属性的enumerable值决定,内置方法全部都是不可枚举的

js代码中使用obj.prop = value/function(){} 方式添加的属性都是可枚举属性,若要添加不可枚举属性,可用如下方式:

var kxy = new Person()

Object.defineProperty(kxy, "sex", {value: "female",enumerable: false})

有两种方法可以查看内置对象的属性:

第一种利用getOwnPropertyNames,该函数返回所有自有属性(不包括继承的),不管是否可枚举

var props = Object.getOwnPropertyNames(String.prototype)

for(var i=0i<props.lengthi++){

console.log(props[i])

}

第二种最简单:

console.log(String.prototype)

console.log(Array.prototype)

控制台显示的就是内置对象的所有属性了(String对象继承的属性都是从String.prototype来的)