JS 對(duì)象屬性相關(guān)(檢查屬性、枚舉屬性等)
來源:易賢網(wǎng) 閱讀:715 次 日期:2015-04-08 14:12:02
溫馨提示:易賢網(wǎng)小編為您整理了“JS 對(duì)象屬性相關(guān)(檢查屬性、枚舉屬性等)”,方便廣大網(wǎng)友查閱!

1.刪除屬性

delete運(yùn)算符可以刪除對(duì)象的屬性

代碼如下:

delete person.age //即person不再有屬性age

delete person['age'] //或者這樣

delete只是斷開屬性和宿主對(duì)象的聯(lián)系,而不會(huì)去操作屬性中的屬性 看到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è)屬性的原型對(duì)象上刪除它,當(dāng)然,這會(huì)影響到所有繼承來自這個(gè)原型的對(duì)象)

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"){ //要繼承的對(duì)象 類型要符合

throw TypeError();

}

function f(){ }; //定義一個(gè)空的構(gòu)造函數(shù)

f.prototype = p; //原型指向要繼承的對(duì)象p

return new f(); //創(chuàng)建f對(duì)象,此對(duì)象繼承自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.檢測(cè)屬性

使用 “in"

in 運(yùn)算符希望它的左操作數(shù)是一個(gè)字符串或者可以轉(zhuǎn)換為字符串,希望它的右操作數(shù)是一個(gè)對(duì)象

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è)方法,但不是它自己的

只有檢測(cè)到是自由屬性并是可枚舉的屬性時(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è)對(duì)象都有與之相關(guān)的原型(prototype)、類(class)、可擴(kuò)展性(extensible)

要檢測(cè)一個(gè)對(duì)象是否是另一個(gè)對(duì)象的原型(或處于原型鏈中),可以使用isPrototypeOf()方法

var p = {x:1}; //p原型對(duì)象繼承自O(shè)bject.prototype

var o = Object.create(p); //o對(duì)象繼承自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è)對(duì)象,右操作數(shù)標(biāo)識(shí)對(duì)象的類。如果左側(cè)的對(duì)象是右側(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:

對(duì)象的類屬性是一個(gè)字符串,用以表示對(duì)象的類型信息

一般調(diào)用toString()方法后返回形如 [object class]的形式

比如

代碼如下:

var obj = {x:1,y:2};

console.log(obj.toString());//[object Object]

所以要想獲取對(duì)象的類,就可以通過返回的字符串中找出 “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()); //會(huì)報(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

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看腳本欄目
易賢網(wǎng)手機(jī)網(wǎng)站地址:JS 對(duì)象屬性相關(guān)(檢查屬性、枚舉屬性等)
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)