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

时间: 2024-08-29 23:48:30

深入javascript: in 和 delete 运算符的相关文章

深入理解javascript 中的 delete(转)

在这篇文章中作者从<JavaScript面向对象编程指南>一书中关于 delete 的错误讲起,详细讲述了关于 delete 操作的实现, 局限以及在不同浏览器和插件(这里指 firebug)中的表现. 下面翻译其中的主要部分. ...书中声称 “函数就像一个普通的变量那样——可以拷贝到不同变量,甚至被删除” 并附上了下面的代码片段作为说明: >>> var sum = function(a, b) {return a+b;}; >>> var add =

重载类的new和delete运算符成员函数

重载类的new和delete运算符成员函数1. 调用new时,先分配内存,后调用构造函数.调用构造函数的行为由编译器控制.2. 调用delete时,先调用析构函数,后释放内存.调用析构函数的行为由编译器控制.重载这两个运算符函数的目的是为了控制内存的分配与释放.如果需要对某个类型频繁地创建和销毁大量的对象,new和delete运算过程可能会耗费过多的时间,并且会产生过多的内存碎片.这两个运算符函数的原型:void * operator new(size_t sz);void operator d

C++对象模型——new 和 delete 运算符(第六章)

6.2    new 和 delete 运算符 运算符 new 的使用,看起来似乎是个单一运算,像这样: int *pi = new int(5); 但事实上它是由以下两个步骤完成: 1.通过适当的 new 运算符函数实体,配置所需的内存: // 调用函数库中的new运算符 int *pi = __new(sizeof(int)); 2.给配置得来的对象设立初值: *pi = 5; 更进一步地,初始化操作应该在内存配置成功(经由 new 运算符)后才执行: // new运算符的两个分离步骤 //

javascript学习笔记---ECMAScript运算符(位运算符)

位运算符是在数字底层(即表示数字的 32 个数位)进行操作的. 位运算 NOT 位运算 NOT 由否定号(~)表示,它是 ECMAScript 中为数不多的与二进制算术有关的运算符之一. 位运算 NOT 是三步的处理过程: 把运算数转换成 32 位数字 把二进制数转换成它的二进制反码 把二进制数转换成浮点数 例如: var iNum1 = 25; //25 等于 00000000000000000000000000011001 var iNum2 = ~iNum1; //转换为 11111111

javascript学习笔记---ECMAScript运算符(逻辑运算符)

Boolean 运算符非常重要,它使得程序语言得以正常运行. Boolean 运算符有三种:NOT.AND 和 OR. ToBoolean 操作 在学习各种逻辑运算符之前,让我们先了解一下 ECMAScript-262 v5 规范中描述的 ToBoolean 操作. 抽象操作 ToBoolean 将其参数按照下表中的规则转换为逻辑值: 参数类型 结果 Undefined false Null false Boolean 结果等于输入的参数(不转换) Number 如果参数为 +0, -0 或 N

Javascript中的delete

一.问题的提出 我们先来看看下面几段代码,要注意的是,以下代码不要在浏览器的开发者工具(如FireBug.Chrome Developer tool)中运行,原因后面会说明: 为什么我们可以删除对象的属性: 复制代码代码如下: var o = { x: 1 }; delete o.x; // true o.x; // undefined 但不以删除像这样声明的变量: 复制代码代码如下: var x = 1; delete x; // false x; // 1 也不能删除像这样定义的函数: 复制

javascript学习笔记---ECMAScript运算符(一元运算符)

一元运算符只有一个参数,即要操作的对象或值.它们是 ECMAScript 中最简单的运算符. delete delete 运算符删除对以前定义的对象属性或方法的引用.例如:  var o = new Object;        o.name = "David";        alert(o.name); //输出 "David"        delete o.name;        alert(o.name);//输出 "undefined&quo

C++学习32 重载new和delete运算符

内存管理运算符 new.new[].delete 和 delete[] 也可以进行重载,其重载形式既可以是类的成员函数,也可以是全局函数.一般情况下,内建的内存管理运算符就够用了,只有在需要自己管理内存时才会重载. 重载 new 有两种形式: //以类的成员函数的形式进行重载 void * 类名::operator new ( size_t size ){ //TODO: } 和 //以全局函数的形式进行重载 void * operator new ( size_t size ){ //TODO

用new和delete运算符进行动态分配和撤销存储空间

测试描述:临时开辟一个存储空间以存放一个结构体数据 #include <iostream> #include <string> using namespace std; struct Student { string name; int age; char sex; }; int main() { Student *p; //定义指向结构体类型Student的数据的指针变量p p=new Student; //用new运算符开辟一个存放Student型数据的空间,把地址赋给p p-

(转)JavaScript: in, hasOwnProperty, delete, for/in

in 运算符 判断对象是否拥有某一属性只要对象拥有该属性,就会返回true,否则false var point = { x:1, y:1 };alert( 'x' in point );  //true var arr = ['one', 'two'];alert( 'kang' in arr );  //falsealert( '1' in arr );  //truealert( 'push' in arr );  //true var fn = function(){};fn.protot