JS 對象屬性相關(guān)(檢查屬性、枚舉屬性等)
1.刪除屬性
delete運(yùn)算符可以刪除對象的屬性
delete person.age //即person不再有屬性age
delete person['age'] //或者這樣
delete只是斷開屬性和宿主對象的聯(lián)系,而不會去操作屬性中的屬性 看到delete a.p之后b.x仍然為1
var a = {p:{x:1}}; var b = a.p; console.log(a.p.x); //1 delete a.p; console.log(a.p.x); //TypeError a.p is undefined console.log(a.p); //undefined console.log(b.x); //1
delete只能刪除自有屬性,不能刪除繼承屬性(要?jiǎng)h除繼承屬性必須從定義這個(gè)屬性的原型對象上刪除它,當(dāng)然,這會影響到所有繼承來自這個(gè)原型的對象)
function inherit(p){ if(p == null){ // 不能從null中繼承 throw TypeError(); } if(Object.create){ //如果有這個(gè)方法就直接使用 return Object.create(p); } var t = typeof p; if(t !== "object" || t !== "function"){ //要繼承的對象 類型要符合 throw TypeError(); } function f(){ }; //定義一個(gè)空的構(gòu)造函數(shù) f.prototype = p; //原型指向要繼承的對象p return new f(); //創(chuàng)建f對象,此對象繼承自p } 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
當(dāng)然了,可配置的屬性才能用到delete
比如
delete Object.prototype; // 不能刪除 不可配置 var x = 1; delete this.x; //不能刪除 this.y = 1; delete y; //這樣可以刪除 function f(){ } delete this.f; //不能刪除
2.檢測屬性
使用 “in"
in 運(yùn)算符希望它的左操作數(shù)是一個(gè)字符串或者可以轉(zhuǎn)換為字符串,希望它的右操作數(shù)是一個(gè)對象
var data = [5,6,7]; console.log("0" in data); //有下標(biāo)0 console.log(1 in data); //1可以轉(zhuǎn)換成"1" console.log("4" in data); //下標(biāo)只有 1 2 3 var obj = {x:1}; console.log("x" in obj); //true console.log("y" in obj); //false console.log("toString" in obj); //true 因?yàn)閛bj繼承了這個(gè)方法
使用hasOwnProperty()或者propertyIsEnumerable() --- 后者是前者的增強(qiáng)
顧明思議
var obj = {x:1}; console.log(obj.hasOwnProperty("x")); //true console.log(obj.hasOwnProperty("y")); //false console.log(obj.hasOwnProperty("toString")); //false 因?yàn)閛bj繼承了這個(gè)方法,但不是它自己的
只有檢測到是自由屬性并是可枚舉的屬性時(shí),后者才返回true
var obj = {x:1}; console.log(obj.propertyIsEnumerable("x")); //true console.log(obj.propertyIsEnumerable("y")); //false console.log(obj.propertyIsEnumerable("toString")); //false 因?yàn)閛bj繼承了這個(gè)方法,但不是它自己的 console.log(Object.prototype.propertyIsEnumerable("toString")); //false 因?yàn)樽钤嫉牡?toString就是不可枚舉的
當(dāng)然,也可以直接用 ”!=="運(yùn)算符判斷
var obj = {x:1}; console.log(obj.x !== undefined);//true console.log(obj.y !== undefined);//false console.log(obj.toString !== undefined); //true
3.枚舉屬性
var obj = {x:1,y:2}; for(p in obj){ console.log(p);//x y console.log(obj.p);// undefined undefined console.log(obj[p]);//1 2 }
拓展1:
每個(gè)對象都有與之相關(guān)的原型(prototype)、類(class)、可擴(kuò)展性(extensible)
要檢測一個(gè)對象是否是另一個(gè)對象的原型(或處于原型鏈中),可以使用isPrototypeOf()方法
var p = {x:1}; //p原型對象繼承自O(shè)bject.prototype var o = Object.create(p); //o對象繼承自p console.log(p.isPrototypeOf(o));//true console.log(Object.prototype.isPrototypeOf(o));//true console.log(Object.prototype.isPrototypeOf(p));//true
當(dāng)然,isPrototypeOf()方法和instanceof運(yùn)算符非常類似
instanceof運(yùn)算符希望它的左操作數(shù)是一個(gè)對象,右操作數(shù)標(biāo)識對象的類。如果左側(cè)的對象是右側(cè)類的實(shí)例,則表達(dá)式返回true,否則返回false
var p = {x:1}; console.log(p instanceof Object);//true var d = new Date(); console.log(d instanceof Date);//true console.log(d instanceof Object);//true console.log(d instanceof Number);//false
拓展2:
對象的類屬性是一個(gè)字符串,用以表示對象的類型信息
一般調(diào)用toString()方法后返回形如 [object class]的形式
比如
var obj = {x:1,y:2};
console.log(obj.toString());//[object Object]
所以要想獲取對象的類,就可以通過返回的字符串中找出 “class"字段 使用 slice(8,-1)
比如
function classOf(obj){ // 找出類名 if(obj === null){ return "Null"; } if(obj === undefined){ return "Undefined"; } return Object.prototype.toString.call(obj).slice(8,-1); } console.log(classOf(1)); //Number //注意,實(shí)際上是這些類型的變量調(diào)用toString()方法,而不是通過他們自身直接調(diào)用 //console.log(1.toString()); //會報(bào)錯(cuò) 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
相關(guān)文章
在js文件中引入(調(diào)用)另一個(gè)js文件的三種方法
這篇文章主要介紹了在js文件中引入(調(diào)用)另一個(gè)js文件的三種方法,幫助大家更好的理解和學(xué)習(xí)JavaScript,感興趣的朋友可以了解下2020-09-09滾動(dòng)條的監(jiān)聽與內(nèi)容隨著滾動(dòng)條動(dòng)態(tài)加載的實(shí)現(xiàn)
下面小編就為大家?guī)硪黄獫L動(dòng)條的監(jiān)聽與內(nèi)容隨著滾動(dòng)條動(dòng)態(tài)加載的實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02原生js實(shí)現(xiàn)密碼強(qiáng)度驗(yàn)證功能
這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)密碼強(qiáng)度驗(yàn)證功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03統(tǒng)一接口:為FireFox添加IE的方法和屬性的js代碼
統(tǒng)一接口:為FireFox添加IE的方法和屬性的js代碼...2007-03-03JavaScript監(jiān)聽文本框回車事件并過濾文本框空格的方法
這篇文章主要介紹了JavaScript監(jiān)聽文本框回車事件并過濾文本框空格的方法,涉及javascript操作文本框獲取、清空及刪除空格的技巧,需要的朋友可以參考下2015-04-04Bootstrap每天必學(xué)之標(biāo)簽頁(Tab)插件
Bootstrap每天必學(xué)之標(biāo)簽頁(Tab)插件,通過這個(gè)插件您可以把內(nèi)容放置在標(biāo)簽頁或者是膠囊式標(biāo)簽頁甚至是下拉菜單標(biāo)簽頁中,感興趣的小伙伴們可以參考一下2016-04-04用javascript取得傳遞參數(shù)的個(gè)數(shù)的代碼
用javascript取得傳遞參數(shù)的個(gè)數(shù)的代碼...2007-10-10js實(shí)現(xiàn)的萬能flv網(wǎng)頁播放器代碼
這篇文章主要介紹了js實(shí)現(xiàn)的萬能flv網(wǎng)頁播放器代碼,以簡單示例形式分析了JavaScript使用swfobject.js實(shí)現(xiàn)在線播放flv視頻的相關(guān)技巧,需要的朋友可以參考下2016-04-04