in 运算符
判断对象是否拥有某一属性
只要对象拥有该属性,就会返回true,否则false
var point = { x:1, y:1 }; alert( 'x' in point ); //true var arr = ['one', 'two']; alert( 'kang' in arr ); //false alert( '1' in arr ); //true alert( 'push' in arr ); //true var fn = function(){}; fn.prototype.site = 'cnblogs.com'; var obj = new fn(); alert( 'site' in obj ); //true
hasOwnProperty
判断对象是否具有某一属性。这个属性必须是自己具有的,即非继承的。
var o = {}; o.name = 'object'; alert( o.hasOwnProperty('kang') ); //false: 不存在 alert( o.hasOwnProperty('toString') ); //false: 'toString'方法继承自'Object' alert( o.hasOwnProperty('name') ); //true alert( Math.hasOwnProperty("kang") ); //false alert( Math.hasOwnProperty("cos") ); //true; alert( Math.hasOwnProperty("toString") ); //false: 'toString'方法继承自'Object' var base = function(){ this.name = 'Rain Man'; }; base.prototype.site = 'cnblogs.com'; var o = new base(); alert( o.hasOwnProperty('site') ); //false: 是继承的 alert( o.hasOwnProperty('name') ); //true
delete 运算符
删除对象的属性,删除后不能使用 for/in 枚举出删除的属性,使用hasOwnProperty()检测该属性返回false。
删除数组的元素,删除后数组的 length 不会改变,不可以使用 for/in 枚举出来删除的元素; shift()、pop()、splice()才会真正的删除数组中的元素
var point = { x:1, y:1 }; delete point.x; //{ y:1 } var arr = ['one', 'two']; delete arr[0]; //[undefined, 'two']
for/in
枚举对象的属性
对象的一些属性是不可以使用for/in来输出的,例如:内部的,用户自定义的可以,从构造函数prototype中继承的也可以枚举出
var arr = ['one', 'two']; arr.author = 'rainman'; //不会枚举出数组的push,pop等方法,因为这些方法都是内部的 for( var i in arr ) ist(arr[i]); //'one'、'two'、'rainman' var Blog = function(){}; Blog.prototype.site = 'cnblogs.com'; var oBlog = new Blog(); for( var i in oBlog ) ist(oBlog[i]); //'cnblogs.com' var RM = function(){}; RM.prototype = new Blog(); RM.prototype.url = 'http://rainman.cnblogs.com' var oRM = new RM(); for( var i in oRM ){ ist(i + ':'+ oRM[i]); //'url:http://rainman.cnblogs.com'、site:cnblogs.com }