for/in可以将在循环体中遍历对象中可枚举的属性(包括继承和自有属性),对象继承的内置方法不可枚举。
var p ={name:"jack",age:23,sex:"boy"}
var o = {sex:"girl",hobby:"html"}
1.将p可枚举的属性复制到o中,并且覆盖o中相同的属性—————————-
function extend(o,p){
for(prop in p){
o[prop] = p[prop]
}
return o; //{{sex: "boy", hobby: "html", name: "jack", age: 23}}
}
2.将p可枚举的属性复制到o中,并且o中相同的属性不会被覆盖————————————————
function merge(o,p){
for(prop in p){
if(o.hasOwnProperty[prop]) continue;
o[prop] = p[prop]
}
return o; //{sex: "boy", hobby: "html", age: 23}
}
3.o中的属性p中没有同名属性,则从o中删除—————————— 删除同名的—————————
function restrict(o,p){
for(prop in o){
//!(prop in p) && delete o[prop];
//if(!(prop in p)) delete o[prop]
!p[prop] && delete o[prop]
}
return o;
}
4.返回一个新对象,且同时具有o/p的属性,有相同的取p中的属性——————
function extend(o,p){
for(prop in p){
delete o[prop]
}
return o; //{hobby:"html"}
}
5.返回一个新对象,且具有同时存在o/p中的属性—————————————————–
var a = (function(o,p){
return extend(extend({},o),p)
}(o,p))
{sex: "boy", hobby: "html", name: "jack", age: 23}
6.返回一个数组,这个数组中包含o中可枚举的自有属性的名字———————————————
var a =(function(o){
if(typeof o !== "object") throw TypeError();
var res = [];
for(prop in o){
(o.hasOwnProperty(prop) ) && res.push(prop)
}
return res;
}(o) )
补充
Object.keys() //返回的可枚举的自有属性
Obejct.getOwnProtertyNames() // 返回的*属性
Object.keys(a) //["name","age","sex"]
Obejct.getOwnProtertyNames(a) //["name","age","sex"]