【JS從入門到精通】05-物件
目錄筆記來源:尚矽谷最新版JavaScript基礎全套教程完整版(140集實戰教學,JS從入門到精通)_嗶哩嗶哩_bilibili
物件
JS中資料型別
- String 字串
- Number數值
- Boolean 布林值
- Null空值
- Undefined 未定義
以上這五種型別屬於基本資料型別,以後我們看到的值只要不是上邊的5種,全都是物件
1、Object 物件
基本資料型別都是單一的值"hello" 123 true
在JS中來表示一個人的資訊(name gender age):
var name = "孫悟空";
var gender = "男";
var age = 18;
如果使用基本資料型別的資料,我們所建立的變數都是獨立,不能成為一個整體。
物件屬於一種複合的資料型別,在物件中可以儲存多個不同資料型別的屬性。
2、物件的分類
2.1、內建物件
由ES標準中定義的物件,在任何的ES的實現中都可以使用
常見內建物件有以下,都可以直接通過new呼叫建構函式建立物件例項:
- Object、Function、Array、String、Number、Boolean、Date、RegExp
- Error(EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError)
// Math
Math.sqrt(2);
// String
String(2);
// Number
Number("2");
2.2、宿主物件
由JS的執行環境提供的物件,目前來講主要指由瀏覽器提供的物件
比如 BOM DOM
// console
console.log("hello");
// document
document.write("hello");
JavaScript實現包括三部分:
組成 | 作用 | 地位 | 例子 |
---|---|---|---|
ES(ECMAScript) | 描述JS語法和基本物件 | 核心 | |
DOM(Document Object Model 文件物件模型) | HTML和XML的應用程式介面,處理網頁內容的方法和介面 | W3C標準 | document |
BOM(Browser Object Model 瀏覽器物件模型) | 描述與瀏覽器進行互動的方法和介面,處理瀏覽器視窗和框架 | 瀏覽器廠商對DOM的實現 | window |
DOM
BOM
DOM 和 BOM 的關係
2.3、自定義物件
由開發人員自己建立的物件
使用new
關鍵字呼叫的函式,是建構函式constructor
,建構函式是專門用來建立物件的
函式使用typeof
檢查一個物件時,會返回object
在物件中儲存的值稱為屬性
- 新增或修改物件屬性的語法:
物件.屬性名=屬性值;
- 讀取物件屬性的語法:
物件.屬性名
- 刪除物件屬性的語法:
delete 物件.屬性名;
var obj = new Object();
// 向obj中新增一個name屬性
obj.name = "孫悟空";
// 向obj中新增一個gender屬性
obj.gender = "男";
// 向obj中新增一個age屬性
obj.age = "18";
// 列印obj
console.log(typeof obj); // object
console.log(obj); // {"age":"18","gender":"男","name":"孫悟空"}
console.log(obj.name); // 孫悟空
屬性名
物件的屬性名不強制要求遵守識別符號的規範,什麼亂七八糟的名字都可以使用,但是我們使用是還是儘量按照識別符號的規範去做
如果要使用特殊的屬性名,不能採用.
的方式來操作,而需要使用另一種語法:物件["屬性名"]=屬性值
,讀取時也需要採用這種方式
obj["name"] = "齊天大聖";
console.log(obj["name"]); // 齊天大聖
使用[]
這種形式去操作屬性,更加的靈活,在[]
中可以直接傳遞一個變數,這樣變數值是哪個就會讀取哪個屬性
var n = "nihao";
obj[n] = "你好";
console.log(obj[n]); // 你好
回顧:.
、[]
、new
這幾個運算子的優先順序是最高的
屬性值
JS物件的屬性值,可以是任意的資料型別,包括物件
var obj2 = new Object();
obj2.name = "豬八戒";
obj.bro = obj2;
console.log(obj.bro.name); // 豬八戒
in
運算子
通過該運算子可以檢查一個物件中是否含有指定的屬性
如果有則返回true
,沒有則返回false
語法:"屬性名" in 物件
console.log("test" in obj); // false
console.log("name" in obj); // true
3、基本資料型別和引用資料型別
基本資料型別 String Number Boolean Null Undefined
引用資料型別 Object
基本資料型別
- JS中的變數都是儲存到棧記憶體中的,基本資料型別的值直接在棧記憶體中儲存
- 值與值之間是獨立存在,修改一個變數不會影響其他的變數
var a = 1;
var b = a;
console.log("a=" + a + ", b=" + b); // a=1, b=1
b = 2;
console.log("a=" + a + ", b=" + b); // a=1, b=2
引用資料型別
- 物件是儲存到堆記憶體中的
- 每建立一個新的物件,就會在堆記憶體中開闢出一個新的空間,而變數儲存的是物件的記憶體地址(物件的引用)
- 如果兩個變數儲存的是同一個物件引用,當一個通過一個變數修改屬性時,另一個也會受到影響
var obj3 = obj;
obj3.name = "鬥戰勝佛";
console.log(obj.name); // 鬥戰勝佛
console.log(obj3.name); // 鬥戰勝佛
比較
- 當比較兩個基本資料型別的值時,就是比較值。
- 而比較兩個引用資料型別時,它是比較的物件的記憶體地址,如果兩個物件是一摸一樣的,但是地址不同,它也會返回
false
var o1 = new Object();
var o2 = new Object();
o1["name"] = "周瑜";
o2["name"] = "周瑜";
console.log(o1 == o2); // false
4、物件字面量
使用物件字面量,可以在建立物件時,直接指定物件屬性的語法:{屬性名: 屬性值, 屬性名: 屬性值...}
物件字面量的屬性名可以加引號也可以不加(建議不加),如果要使用一些特殊的名字,則必須加引號
屬性名和屬性值是一組一組的名值對結構,名和值之間使用:
連線,多個名值對之間使用,
隔開
如果一個屬性之後沒有其他的屬性了,就不要寫,
了
var obj = {
name: "孫悟空",
age: 1000,
gender: "男",
bor:{
name: "豬八戒"
}
}
console.log(obj); // {"age":1000,"bor":{"name":"豬八戒"},"gender":"男","name":"孫悟空"}
5、方法
物件的屬性值可以是任何的資料型別,也可以是個函式(下一節知識)
函式也可以稱為物件的屬性,如果一個函式作為一個物件的屬性儲存,那麼我們稱這個函式是這個物件的方法
呼叫函式就說呼叫物件的方法,但是它只是名稱上的區別沒有其他的區別
var obj2 = {
name: "豬八戒",
age: 18,
sayName: function() {
console.log(obj2.name);
}
};
obj2.sayName(); // 豬八戒
6、列舉物件中的屬性
使用for...in
語句語法:
for(var 變數 in 物件) {
語句...
}
for...in
語句物件中有幾個屬性,迴圈體就會執行幾次
每次執行時,會將物件中的一個屬性的名字賦值給變數
var obj = {
name: "孫悟空",
age: 1000,
gender: "男",
address: "花果山"
};
for(var key in obj){
console.log(key + "=" + obj.key);
// name=undefined
// age=undefined
// gender=undefined
// address=undefined
console.log(key + "=" + obj[key]);
// name=孫悟空
// age=1000
// gender=男
// address=花果山
}