目錄
任務描述
相關知識
屬性的檢測
屬性的枚舉
編程要求
任務描述
本關任務:給定一個屬性的名字,請先判斷它屬于哪一個對象,然后返回該對象的所有自有屬性名連接成的字符串。 ? 如:school
對象有三個自有屬性name,location,studentNum
,如果給定name
,你需要返回字符串namelocationstudentNum
。
相關知識
在 JavaScript 編程實踐中,如果我們調用別人的接口,常常需要了解實體是否具有某個屬性。
屬性的檢測
屬性的檢測指檢查對象是否有某個屬性或者方法,需要使用運算符in
,in
的左側是屬性或者方法名,右側是檢查對象,對象有該屬性或者方法則返回true
,否則返回false
,如下:
var school = {name:"SJTU",location:"ShangHai",studentNum:40000,display:function() {console.log(this.name);}
};
// 檢測屬性
console.log("name" in school); // 輸出true
console.log("sales" in school); // 輸出false
// 檢測方法
console.log("display" in school); // 輸出true
console.log("print" in school); // 輸出false
?
這里的屬性名是字符串,必須用雙引號包含在內。
還可以用hasOwnProperty()
檢測對象是否具有某個自有屬性或方法。括號內的參數是屬性或者方法的名字。
所謂自有屬性或者方法,是指對象自己定義的屬性或者方法,而不是從原型鏈上繼承來的。
var school = {name:"SJTU",location:"ShangHai",studentNum:40000,display:function() {console.log(this.name);}
};
console.log(school.hasOwnProperty("studentNum")); // true
console.log(school.hasOwnProperty("hasOwnProperty")); // false
因為hasOwnProperty
方法繼承自object
對象,不是自有方法,所以返回false
。
屬性的枚舉
定義:屬性的枚舉指按順序逐個的列出屬性的名字。如下面的例子:
var person = {name:"Ye",gender:"Gril",age:23,salary:23000,height:1.78
}
根據前面的知識,我們知道對象person
有五個屬性,所謂枚舉,就是依次列出這五個屬性的名字,即:name、gender、age、salary、height
,至于它們排列的順序,在不同的瀏覽器中的結果不同,這里不討論。 ? 在繼續下面的知識點之前,首先要知道一個概念:可枚舉性(enumerable
),這是對象的屬性的一個性質,用戶自己定義的屬性默認為可枚舉,系統內置的對象的屬性默認為不可枚舉。
枚舉屬性有三種方法:
for...in...
循環;
可以枚舉所有可枚舉的屬性,包括繼承的屬性。如下:
// 首先定義一個school對象,它從原型鏈上繼承的屬性都是不可枚舉的,而下面自定義的四個屬性或者方法都是可枚舉的
var school = {name:"SJTU",location:"ShangHai",studentNum:40000,display:function() {console.log(this.name);}
};
// 枚舉school的屬性
// 下面的圓括號中的att表示對象的屬性,school表示對象
for(var att in school) {// 依次輸出name,location,studentNum,displayconsole.log(att);
}
圓括號里面的表達式中,att
表示對象的屬性,school
表示該對象,這個循環將依次遍歷對象的所有可枚舉屬性,每次輸出一個屬性的值。
Object.getOwnPropertyNames()
;
括號中有一個參數,是要枚舉的對象。該表達式將返回對象的所有自有屬性的名字,不區分是否可枚舉,結果以字符串數組的形式呈現,如下:
// 定義一個school對象
var school = {name:"SJTU",location:"ShangHai",studentNum:40000,display:function() {console.log(this.name);}
};
// 為school對象增加一個不可枚舉的屬性range
Object.defineProperty(school, "range", {value: 4, // 設置range屬性的值enumerable: false // 設置range屬性為不可枚舉
});
// 輸出["name","location","studentNum","display","range"]
console.log(Object.getOwnPropertyNames(school));
如果用上面的for...in...
循環,range
屬性是不能夠枚舉到的。
Object.keys()
; ? 括號中有一個參數,是要枚舉的對象。該表達式返回可枚舉的自有屬性,以字符串數組的形式。所以這里對屬性的要求更加嚴格,既要求是自有屬性,又要求可枚舉。 ?
var school = {name:"SJTU",location:"ShangHai",studentNum:40000,display:function() {console.log(this.name);}
};
// 為school對象增加一個不可枚舉的屬性range
Object.defineProperty(school, "range", {value: 4, // 設置range屬性的值enumerable: false // 設置range屬性為不可枚舉
});
// 輸出["name","location","studentNum","display"]
console.log(Object.keys(school));
?
總結一下上面三個方法對屬性是否自有,是否可枚舉的要求:
方法名 | 是否要求可枚舉 | 是否要求自有 |
for...in... | 是 | 否 |
Object.getOwnPropertyNames() | 否 | 是 |
Object.keys() | 是 | 是 |
編程要求
本關的編程任務是補全右側代碼片段中 Begin 至 End 中間的代碼,具體要求如下:
-
有兩個可選的對象
orange
和car
,判斷給定的屬性名a
屬于哪一個對象; -
返回該對象的所有自有屬性名組成的字符串,例如:如果判斷為
car
,則返回brandpricemodel
; -
給定的兩個對象的自有屬性都是可枚舉的;
var orange = {weight:"200g",color:"orange",taste:"sour"
};
var car = {brand:"Jaguar",price:"$80000",model:"XFL"
}
function mainJs(a){//請在此處編寫代碼/*********begin*********/var r = "";if (a in orange) {for (var s in orange) {r += s;}}else {for (var s in car) {r += s;}}return r;/*********end*********/
}