javascript中in运算符详解

转载 2015年11月19日 17:30:54
in运算符是javascript语言中比较特殊的一个,可以单独使用作为判断运算符,也常被用于for...in循环中遍历对象属性
一、判断
语法
prop in objectName
如果objectName指向的对象中含有prop这个属性或者键值,in运算符会返回true。
复制代码 代码如下:

var arr = ['one','two','three','four'];
arr.five = '5';
0 in arr;//true
'one' in arr; //false,只可判断数组的键值
'five' in arr;//true,'five'是arr对象的属性
'length' in arr;//true

原型链
in运算符会在整个原型链上查询给定的prop属性
复制代码 代码如下:

Object.prototype.sayHello = 'hello,world';
var foo = new Object();
'sayHello' in foo;//true;
'toString' in foo;//true;
'hasOwnProperty' in foo;//true;

对象与字面量
in运算符在对待某些特定类型(String,Number)的对象和字面量时显得不尽相同
复制代码 代码如下:

var sayHelloObj = new String('hello,world');
var sayHello = 'hello,world';
var numObj = new Number(1);
var num = 1;

'toString' in sayHelloObj; //true
'toString' in sayHello; //类型错误

'toString' in numObj;//true
'toString' in num;//类型错误

究其原因,在MDN找到这样一段关于String对象和字面量转换的介绍,似乎可以解释这个原因:


Because JavaScript automatically converts between string primitives and String objects, you can call any of the methods of the String object on a string primitive. JavaScript automatically converts the string primitive to a temporary String object, calls the method, then discards the temporary String object. For example, you can use the String.length property on a string primitive created from a string literal
试着这样理解:因为in是运算符而非一个方法(method),所以无法让string字面量自动转换成String对象,又因为in运算符待查询方不是对象而是一个字符串(按老道Douglas的说法,只是object-like的类型),所以报类型错误。

二、遍历

很常用到的for...in循环语句,此语句中的in需要遵循另外一套语法规范:

for (variable in object)
statement
与单独使用in作为运算符不同,for...in循环语句只遍历用户自定义的属性,包括原型链上的自定义属性,而不会遍历内置(build-in)的属性,如toString。

对象
复制代码 代码如下:

function Bird(){
this.wings = 2;
this.feet = 4;
this.flyable = true;
}
var chicken = new Bird();
chicken.flyable = false;
for(var p in chicken){
alert('chicken.' + p + '=' + chicken[p]);
}

String对象,经过测试Firefox,Chrome,Opera,Safari浏览器都是给出了注释中的结果,只有IE浏览器只给出'more'和'world'
复制代码 代码如下:

var str = new String('hello');
str.more = 'world';
for(var p in str){
alert(p);//'more',0,1,2,3,4
alert(str[p]);//'world','h','e','l','l','o'
}

字面量
遍历数组字面量的键值和属性
复制代码 代码如下:

var arr = ['one','two','three','four'];
arr.five = 'five';
for(var p in arr){
alert(arr[p]);//'one','two','three','four','five'
}

遍历string字面量,虽说单独在string字面量前面使用in运算符会报类型错误,不过下面的代码却能够正常运行,此时IE浏览器是毫无声息
复制代码 代码如下:

var str = 'hello';
str.more = 'world';
for(var p in str){
alert(p);//0,1,2,3,4
alert(str[p]);//'h','e','l','l','o'
}

综上
ECMA虽然有这方面的规范,但浏览器之间还是存在着差异,鉴于此,并不推荐用for...in去遍历字符串,也不推荐拿去遍历数组(如例子所示,为数组加上自定义属性,遍历就会被搞乱)

在遍历对象方面,我们还可以使用对象的内置方法hasOwnProperty()排除原型链上的属性,进一步加快遍历速度,提升性能
复制代码 代码如下:

function each( object, callback, args ){
var prop;
for( prop in object ){
if( object.hasOwnProperty( i ) ){
callback.apply( prop, args );
}
}

IN运算符的使用

6.3  IN运算符 在查询中,有时只要满足多个条件中的一个条件即可,如查询地址在北京、上海或者重庆的学生信息,这时候可以使用IN运算符。 6.3.1  IN运算符的使用 ...
  • yixian918
  • yixian918
  • 2014年04月21日 15:16
  • 575

运算符 in

运算符 in
  • zsr1860
  • zsr1860
  • 2017年12月18日 14:14
  • 71

javascript中得in运算符

1、For...In 声明用于对数组或者对象的属性进行循环/迭代操作。     对于数组 ,迭代出来的是数组元 素,对于对象 ,迭代出来的是对象的属性; var x va...
  • alex8046
  • alex8046
  • 2014年10月29日 14:23
  • 583

2018/2/11 in运算符

in运算符in运算符也是一个二元运算符,但是对运算符左右两个操作数的要求比较严格。in运算符要求第1个(左边的)操作数必须是字符串类型或可以转换为字符串类型的其他类型,而第2个(右边的)操作数必须是数...
  • sinat_38589469
  • sinat_38589469
  • 2018年02月11日 21:41
  • 12

SQL循序渐进(15)IN 和 BETWEEN 条件运算符

  • zgqtxwd
  • zgqtxwd
  • 2008年04月29日 21:21
  • 118

JavaScript特殊运算符

在JavaScript中有一些运算符,不直接产生运算效果,而是用于影响运算效果,这一类运算符的操作对象通常是“表达式”,而非“表达式的值”。另外的一些运算符不直接针对变量的值运算,而是针对变量运算。详...
  • sysuzjz
  • sysuzjz
  • 2016年02月18日 17:09
  • 862

JavaScript中的typeof运算符

首先,typeof是一个一元运算符(就像++,--,!,- 等一元运算符),不是一个函数,也不是一个语句。这个辨析很必要,初学者往往以为它是一个函数,因为它经常被以typeof(abc)类似的形式使用...
  • cuixiping
  • cuixiping
  • 2009年07月11日 23:10
  • 5322

javascript中in运算符详解

in运算符是javascript语言中比较特殊的一个,可以单独使用作为判断运算符,也常被用于for...in循环中遍历对象属性 一、判断 语法 prop in objectName ...
  • sq1652827791
  • sq1652827791
  • 2015年11月19日 17:30
  • 202

-in 与 -notin 操作符的应用

placeholder...
  • itanders
  • itanders
  • 2013年06月10日 21:30
  • 943

javaScript中in运算符详解

初看下面一段in的代码,往往很多人会得出错误的结果: var arr = [0,1,2,3,5]; var result = (5 in arr); var result1 = (4 in arr)...
  • longshaoye180
  • longshaoye180
  • 2014年01月21日 18:31
  • 420
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:javascript中in运算符详解
举报原因:
原因补充:

(最多只允许输入30个字)