JS in的用法

JS in的用法

1.1简介
JavaScript中的in 操作符是对Object(对象)操作的,并不是针对数组。
1.2用法
1.2.1简单用法
    in的右边必须是对象变量。
例:
var mycar = {make: "Honda", model: "Accord", year: 1998};
if("make" in mycar){
console.log('true');
}else{
console.log('false');
}
运行结果:true
1.2.2错误的用法
    若把in 用于数组的判断时,会产生错误。
例:
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
if("oak" in trees){
console.log('true');
}else{
console.log('false');
}
运行结果:false
   反过来,把trees数组看成一个对象,然后判断对象中的元素。
例:
if(0 in trees){
console.log('true');
}else{
console.log('false');
}
运行结果:true
console.log(trees.length);
运行结果是:trees数组对象的length属性值5。
if('length' in trees){
console.log('true');
}else{
console.log('false');
}
运行结果true,因为length是trees数组对象的属性。
1.2.3 用in来简化if语句多个“或”条件的情况
例:
if(foo == 'bar' || foo == 'foobar' || foo == 'foo'){
//...
}
简化为:
if(foo in { 'bar':'', 'foobar':'', 'foo':'' }){
//...
}
1.2.4对数组判断的正确方法
1、通过循环来解决
function in_array(searchString,array){
  for(var i=0;i<array.length;i++){
    if(searchString == array[i]){
return true;
      }
  return false;
}
if(in_array('oak',trees)){
console.log('true');
}else{
console.log('false');
}
2、把数组一一映射到对象的属性,再用in判断。
function oc(a){
  var o = {}; //相当于var o = new Object();
  for(var i=0;i<a.length;i++){
    o[a[i]]=''; //注意该写法,不能写成o.a[i]
  }
  return o;
}
if('oak' in oc(trees)){
console.log('true'); 
}else{
console.log('false');
}
运行结果:true
注意:obj.key和obj['key']可以互通,但在for(;;)和for(in)语句中,对象属性的写法是obj['key'],而不是obj.key。
1.3使用in 操作符的注意事项
1、区分要判断的是数组还是对象。
2、in 面向的必须是对象
例:
var color1 = new String("green");
"length" in color1 //返回值true
var color2 = "coral";
"length" in color2 // generates an error (color is not a String object)

    JavaScript字符串并不能直接就处理为字符串对象。FireFox 中会报“invalid 'in' operand color2”,IE 中会报“缺少对象”。
3、对象属性被删除(deleted)或未定义(undefined)的判断
    用delete删除对象的属性值:
例1:
var mycar = {make: "Honda", model: "Accord", year: 1998};
delete mycar.make;
"make" in mycar; //返回值false
例2:
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
delete trees[3];
3 in trees; //返回值false
    把对象属性值设置为undefined:
例1:
var mycar = {make: "Honda", model: "Accord", year: 1998};
mycar.make = undefined;
"make" in mycar; //返回值true
例2:
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
trees[3] = undefined;
3 in trees; //返回值true
1.4 与for的应用
1.4.1 简单用法
然数组可以转换为对象,对象也可以看成是“关联数组”。
例1-1:
var a = ["a","b","c"];
for(var n in a){ //亦可以是for(n in a)
   console.log(a[n]);
}
运行结果:
a
b
c
for(n in a){
console.log("false");
}
运行结果:false
for(n in a){
console.log("turn");
console.log(a[n]);
}
运行结果:
turn
a
turn
b
turn
c
例1-2:
var a = {"first":1,"second":2,"third":3};
for(n in a){
console.log(n+"=>"+a[n]);
}
运行结果:
first=>1
second=>2
third=>3
例2-1:
var oneArray=new Array();
oneArray["firstKey"]="firstValue";
oneArray["secondKey"]="secondValue";
for(key in oneArray){
  console.log(key+'=>'+oneArray[key]);
}
运行结果:
firstKey=>firstValue
secondKey=>secondValue
例2-2:
var oneObject={};
oneObject.firstKey="firstValue";
oneObject.secondKey="secondValue";
for(key in oneObject){
  console.log(key+'=>'+oneObject[key]);
}
运行结果:
firstKey=>firstValue
secondKey=>secondValue
1.4.2 判断一个对象是否可以进行for in穷举——propertyIsEnumerable属性
1、用法
propertyIsEnumerable属性的返回Boolean值,指出所指定的属性是否为一个对象的一部分以及该属性是否是可列举的。
2、语法:
object.propertyIsEnumerable(proName);
3、参数介绍
Object 必选项,一个对象。
proName 必选项,一个属性名称的字符串值。
如果 proName 存在于 object 中且可以使用一个 For…In 循环穷举,那么propertyIsEnumerable属性返回true。如果 object不具有所指定的属性或者所指定的属性不是可列举的,那么propertyIsEnumerable属性返回false。典型地,预定义的属性不是可列举的,而用户定义的属性总是可列举的。
注意:propertyIsEnumerable属性不考虑原型链中的对象。
例如:
function testIsEnumerable(){
  var a = new Array("apple", "banana", "cactus");
  return(a.propertyIsEnumerable(1));
}

猜你喜欢

转载自wsj123.iteye.com/blog/2293625