深入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), 或者建立一个由单一属性的对象组成的数组。