in运算符是javascript语言中比较特殊的一个,可以单独使用作为判断运算符,也常被用于for…in循环中遍历对象属性
一、判断
语法
如果objectName指向的对象中含有prop这个属性或者键值,in运算符会返回true。
原型链
in运算符会在整个原型链上查询给定的prop属性
对象与字面量
in运算符在对待某些特定类型(String,Number)的对象和字面量时显得不尽相同
究其原因,在MDN找到这样一段关于String对象和字面量转换的介绍,似乎可以解释这个原因:
试着这样理解:因为in是运算符而非一个方法(method),所以无法让string字面量自动转换成String对象,又因为in运算符待查询方不是对象而是一个字符串(按老道Douglas的说法,只是object-like的类型),所以报类型错误。
二、遍历
很常用到的for…in循环语句,此语句中的in需要遵循另外一套语法规范:
与单独使用in作为运算符不同,for…in循环语句只遍历用户自定义的属性,包括原型链上的自定义属性,而不会遍历内置(build-in)的属性,如toString。
对象
String对象,经过测试Firefox,Chrome,Opera,Safari浏览器都是给出了注释中的结果,只有IE浏览器只给出’more’和’world’
字面量
遍历数组字面量的键值和属性
遍历string字面量,虽说单独在string字面量前面使用in运算符会报类型错误,不过下面的代码却能够正常运行,此时IE浏览器是毫无声息
综上
ECMA虽然有这方面的规范,但浏览器之间还是存在着差异,鉴于此,并不推荐用for…in去遍历字符串,也不推荐拿去遍历数组(如例子所示,为数组加上自定义属性,遍历就会被搞乱)
在遍历对象方面,我们还可以使用对象的内置方法hasOwnProperty()排除原型链上的属性,进一步加快遍历速度,提升性能