1.删除属性
delete只是断开属性和宿主对象的联系,而不会去操作属性中的属性 看到delete a.p之后b.x仍然为1
delete只能删除自有属性,不能删除继承属性(要删除继承属性必须从定义这个属性的原型对象上删除它,当然,这会影响到所有继承来自这个原型的对象)
var obj = {x:1};
var obj1 = inherit(obj);
obj1.y = 2;
console.log("x = "+obj1.x+" y = "+obj1.y); //x = 1 y = 2
delete obj1.x;
delete obj1.y;
console.log("x = "+obj1.x+" y = "+obj1.y); //x = 1 y = undefined
当然了,可配置的属性才能用到delete 比如
var x = 1;
delete this.x; //不能删除
this.y = 1;
delete y; //这样可以删除
function f(){ }
delete this.f; //不能删除
2.检测属性
使用 “in"
in 运算符希望它的左操作数是一个字符串或者可以转换为字符串,希望它的右操作数是一个对象
console.log("x" in obj); //true
console.log("y" in obj); //false
console.log("toString" in obj); //true 因为obj继承了这个方法
使用hasOwnProperty()或者propertyIsEnumerable() --- 后者是前者的增强 顾明思议
当然,也可以直接用 ”!=="运算符判断
3.枚举属性
拓展1:
每个对象都有与之相关的原型(prototype)、类(class)、可扩展性(extensible) 要检测一个对象是否是另一个对象的原型(或处于原型链中),可以使用isPrototypeOf()方法
console.log(Object.prototype.isPrototypeOf(o));//true
console.log(Object.prototype.isPrototypeOf(p));//true
当然,isPrototypeOf()方法和instanceof运算符非常类似 instanceof运算符希望它的左操作数是一个对象,右操作数标识对象的类。如果左侧的对象是右侧类的实例,则表达式返回true,否则返回false
console.log(d instanceof Date);//true
console.log(d instanceof Object);//true
console.log(d instanceof Number);//false
拓展2:
对象的类属性是一个字符串,用以表示对象的类型信息
一般调用toString()方法后返回形如 [object class]的形式
比如
所以要想获取对象的类,就可以通过返回的字符串中找出 “class"字段 使用 slice(8,-1) 比如
//注意,实际上是这些类型的变量调用toString()方法,而不是通过他们自身直接调用
//console.log(1.toString()); //会报错
var a = 1;
console.log(Number(1).toString()); //1
console.log(a.toString()); //1
console.log({x:1}.toString()); //[object Object]
console.log(classOf(1)); //Number
console.log(classOf("")); //String
console.log(classOf("str")); //String
console.log(classOf(null)); //Null
console.log(classOf(false)); //Boolean
console.log(classOf({})); //Object
console.log(classOf([])); //Array
console.log(classOf(new Date())); //Date
function f(){}
console.log(classOf(new f())); //Object