深入javascript: in 和 delete 运算符

一、in操作符
1.定义

如果指定的属性存在于指定的对象中,则in运算符会返回true.(如果一个属性是从原型链上继承来的,in运算符也会返回true)

2.数组操作

//数组
var arr = ["ben","Ben","benjamin","Benjamin"];

console.log(arr);
console.log(0 in arr); //true
console.log(2 in arr); //true
console.log(5 in arr); //false
console.log("ben" in arr); //false(必须使用索引号,而不是数组元素的值)

console.log("length" in []); //true
console.log(length in []); //false

console.log("length" in ["a"]); //true
console.log(length in ["a"]); //true

3.内置对象

//内置对象
console.log("PI" in Math);

4.自定义对象和包装对象

//自定义对象
var obj = {
    "name" : "张三",
    "age"  : "23"
}
console.log(name in obj);   //false
console.log("name" in obj); //true(使用引号)

//操作数:右操作数必须是一个对象值,也可以是一个包装String;对象,但不能是一个字符串原始值看下面实例:
console.log("length" in (new String("Benjamin"))); //true
//console.log("length" in "Benjamin"); //TypeError: invalid 'in' operand "Benjamin"

5.delete删除和undefined赋值

//delete操作+赋值undefined
delete obj.name;
console.log(obj);//Object {age: "23"} 
console.log("name" in obj); //false
delete arr[1];
console.log(arr);//["ben", 2: "benjamin", 3: "Benjamin"] 
console.log(arr.length);//4
//由上看到,在数组中使用delete删除数组元素时,并不会改变数组的长度,数组索引值和对应值保持不变

obj.name = undefined;
arr[0] = undefined;
console.log("name" in obj);//true
console.log(0 in arr);//true

//由上看出,如果你只是将一个属性的值赋值为undefined,而没有用delete删除它,则in运算仍然会返回true.

二、delete 操作符:
1.delete 不能删除一些对象的属性,这些对象包括:
全局变量(global的属性) :隐式声明可以被删除,显示声明的不能被删除,有DontDelete标记
内置对象:内置对象的内置属性不能被删除, 该属性有DontDelete标记
原型:不能删除一个对象从原型继承而来的属性,但可以从原型上直接删掉它。

2.delete操作符跨浏览器问题:
虽然ECMAScript规定了对象的遍历顺序是由对象定义时属性的书写顺序决定的.(ES5已经对遍历机制做了调整,重新规定:属性遍历的顺序是没有被规定的),大部分浏览器都依照这个规定,先添加的属性先被遍历(除了从原型上继承的属性)(Chrome和Opera已经遵循了ES5的新规定,具体请看). 但是, 在 Internet Explorer 中, 使用 delete 删除一个属性后, 奇怪的事情发生了,如果被删除的属性重新被添加,那么遍历时, 该属性的顺序会是上次删除前的那个位置,而不是出现在遍历的最后一个.

所以,如果你想让对象的遍历顺序兼容所有的浏览器,那么你可以使用两个数组来模拟(一个做为keys,一个做为 values), 或者建立一个由单一属性的对象组成的数组。

 

posted @ 2015-07-27 11:09  douglasvegas  阅读(320)  评论(0编辑  收藏  举报