6.3 删除内容
delete运算符可以删除对象的属性。
delete运算符只能删除自有属性,不能删除继承属性。
delete表达式删除成功或没有任何副作用时,它返回true.
6.4 检测属性
用in\hasOwnProperty\propertyIsEnumberable\!==
in 对于对象的自有属性或继承属性中包含有这个属性的返回true.
hasOwnProperty方法用来检测 给定的名字是否是对象的自有属性
propertyIsEnumerable()是hasOwnProperty增强版,只检测到是自有属性且这个属性的可枚举性为true.
还可以用in 和 !==判断属性,但对象的值不能为undefined
6.5 枚举属性
for ( p in o )
{
if (!o.hasOwnProperty(p)) continue;
}
for ( p in o )
{
if ( typeof o[p] === "function" ) continue;
}
例6-2
/*
把p中的可枚举属性复制到o中,并返回o
如果o和p中含有同名属性,则覆盖o中的属性
这个函数并不处理getter和setter以及复制属性
*/
function extend(o,p){
for(prop in p)
{
o[prop]=p[prop]
}
return o;
}
/*将p中的可枚举属性复制到o中,并返回o
如果o和p中有同名的属性,o中的属性将不受影响
这个函数并不处理getter和setter以及复制属性
*/
function merge(o,p)
{
for (prop in p ){
if (o.hasOwnProperty(prop)) continue; //这里的书里写错了
o[prop]=p[prop]
}
return o;
}
/*如果o中属性在p中没有同名属性,则从o中删除 这个属性返回o*/
function restrict(o,p){
for(prop in o){
if(!(prop in p)) delete o[prop];
}
return o;
}
/*如果o中属性在p中有同名属性,则从o中删除 这个属性返回o*/
function subtract(o,p)
{
for(prop in p)
{
delete o[prop];
}
}
/*返回一个新对象,这个对象同时拥有o的属性和p属性如果o和p中有名属性,使用p中的属性值*/
function union(o,p){
retrun extend(extend({},o),p);
}
/*返回一个新对象,这个对象拥有同时在o和p中出现的属性很像求o和p的交集,但p中属性的值 被忽略*/
function intersection(o,p){ return restrict(extend(extend({},o),p);}
/*返回一个数组,这个数组包含的是o中可枚举的自有属性的名字*/
function keys(o){
if ( typeof o !== "object" ) throw TypeError();
var result=[];
for ( var prop in o ){
if(o.hasOwnProperty(prop)) result.push(prop);
}
return result;
}