对象——对象的属性一些操作(第二层)

一、

属性访问错误和设置错误

属性访问错误:

                          查询一个不存在的属性并不会报错,如果在对象o自身的属性或继承的属性均未找到属性x,属性访问表达式o.x返回undefined。

                          如果对象不存在,那么查询不存在对象的属性就会报错。null和undefined值都没有属性。因此会报错。

设置错误:

                   null和undefined设置属性也会报类型的错误

                   有一些属性是只读的,不能重新赋值,失败但不会报错。在ECMAScript5的严格模式中已经修复。

                   在这些场景下给对象o设置属性p会失败:

                                                                                     o中的属性p是只读的:不能给只读属性重新赋值(defineProperty()方法中有一个例外,可以对可配置的只读属性重新赋值)。

                                                                                     o中属性p是继承属性,且它是只读的:不能通过同名自有属性覆盖只读的继承属性。

                                                                                     o中不存在自有属性p:o没有使用setter方法继承属性p,并且o的可扩展性是false。


二、

删除属性

delete 运算符可以删除对象的属性。delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性。例如,delete book.author;

delete运算符只能删除自有属性,不能删除继承属性。

delete删除成功或没有任何副作用(比如删除不存在的属性时),它返回true。如果delete后不是一个属性访问表达式,delete同样返回true。

delete不能删除那些可配置性为false属性(尽管可以删除不可扩展对象的可配置属性)。

在严格模式中,删除一个不可配置属性会报一个类型的错误。在非严格模式中,会返回false:

delete Object.prototype;                 //不能删除,属性是不可配置
var x = 1;                               //声明一个全局变量
delete this.x;                           //不能删除这个属性,通过变量声明和函数声明创建的全局对象的属性,这个内置对象的属性是不可配置。会返回false
function(){};                            //声明一个全局函数
delete this.f;                           //也不能删除全局函数


三、

检测属性:判断某个属性是否存在于某个对象中:


1、in运算符:如果对象的自有属性或继承属性中包含这个属性则返回true。

var o = { x = 1};                         
"x" in o;                                 //<span style="font-family: Arial, Helvetica, sans-serif;">true:"x"是o的属性</span>
"y" in o;                                 //false
"toString" in o;                          //true:o继承toString属性

2、hasOwnPreperty():检测给定的名字是否是对象的自有属性,对于继承属性它将返回false。

var o  = { x :1 }
o.hasOwnProperty("x");                    //true:o有一个自有属性x
o.hasOwnProperty("y");                    //false
o.hasOwnProperty("toString");             //false:toString是继承属性


3、propertyIsEnumerable():检测到是自有属性且这个属性的可枚举性为true时它才返回true。

Object.prototype.propertyIsEnumerable("toString");           //false:不可枚举



4、!==:判断一个属性是否是undefined。

var o = { x:undefined };                  //属性被显示赋值undefined
o.x !== undefined                         //false:属性存在,但值为undefined
o.y !== undefined                         //false:属性不存在
"x" in o                                  //true:属性存在
"y" in o                                  //false:属性不存在
delete o.x                                //删除了属性x
"x" in o                                  //false:属性不再存在


枚举属性:遍历对象的属性。for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自有属性和继承属性),把属性名称赋值给循环变量。

for (p in o) {                               //跳过继承属性
    if (!o.hasOwnProperty(p))
    continue;
} 
for (p in o) {                               //跳过方法
    if (typeof o[p] === "function")
    continue;
}
*Object.keys():它返回一个数组,这个数组由对象中可枚举的自有属性的名称组成。
  Object.getOwnPropertyNames()::它返回对象的所有自有属性的名称,而不仅仅是可枚举的属性。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值