# 第三章 物件
- javaScript 資料型別 1. 基礎資料型別 Number String Boolean Undefined Null Symbol(es6新增,表示獨一無二的值) 值不可變 資料存盤在堆疊(stack)區,占據空間小,大小固定,被頻繁使用 2. 參考資料型別 Object Function Array 值是可變的 同時保存在堆疊記憶體和堆記憶體,占據空間大,大小不固定,存盤在堆記憶體,指向該參考資料型別的變數指標儲存在堆疊記憶體
- 檢驗資料型別 1. typeof (1) 回傳一個表示資料型別的字串 number boolean string symbol object undefined function (2) 不能判斷array 和 null (3) 缺點 除 function 以外的物件都會被識別成 object 解決方法 使用 instanceof 進行判斷 2. instanceof (1) 檢測建構式的 prototype 屬性是否出現在某個實體物件的原型鏈上,即判斷 A 是否是 B 的實體,若是,回傳 true,否則回傳 false A (object) instanceof B (constructor) (2) 缺點 - 是否處于原型鏈上的判斷方法不嚴謹 - 無法判斷字面量方式創建的基本資料型別 - 無法檢測 null 和 undefined 3. constructor (1) 與 instanceof 相似,但檢測 object 與 instanceof 不一樣 (2) 可以處理基本資料型別的檢驗 (3) 缺點 - 無法檢驗 null 和 undefined - 不穩定 在把類的原型進行重寫程序中,可以會出現把之前的 constructor 給覆寫了,使得檢驗結果不準確 4. object.prototype.toString.call() 最標準最常用(MDN)
- 物件 陣列、函式、正則運算式都是物件 屬性的容器 屬性 key: value 無類別(class-free) 用于收集和管理資料 可以包含其他物件 允許繼承另一物件的屬性 可減少物件初始化的時間和記憶體消耗
- 3.1 物件字面量 1. 定義 {} 中包含 0 或 多個 鍵值對(名/值) 2. 屬性名 識別符號且不是保留字可不用引號括住屬性名 var stooge = { "first-name": 'Jerome', // 必須用引號括住 "last-name": 'Howard' } 3. 物件可嵌套 var flight = { airline: "Oceanic", number: 815, departure: { IATA: "SYD", time: "2020-10-13 14:55", city: "Sydney" } arrival: { IATA: "LAX", time: "2020-10-14 10:42", city: "Los Angeles" } }
- 3.2 檢索 1. 檢索物件中包含的值的方式 有引號的用 ["屬性名"] 檢索,沒有的則用 "." 檢索 stooge["first-name"] flight.departure.IATA 2. 檢索不存在的成員元素的值,回傳undefined 檢索undefined值會導致 typeError 例外 通過 && 運算子避免錯誤 flight.equipment // undefined flight.equipment.model // throw "TypeError" flight.equipment && flight.equipment.model // undefined 3. || 運算子填充默認值 var status = flight.status || "unknown" var middle = stooge["middle-name"] || "(none)"
- 3.3 更新 物件中的值通過賦值陳述句更新 若屬性名存在 屬性值被替換 若屬性名不存在 屬性被擴展
- 3.4 參考 物件通過參考傳遞,但不會被拷貝
- 3.5 原型 每個物件都連接一個原型物件,并可從中繼承屬性 物件字面量創建的物件都連接到 object.prototype (javaScript 標準的物件) object.beget() 創建一個使用原物件作為其原型的新物件 原型連接更新時不起作用,檢索值時才被使用
- 3.6 反射 處理不需要的屬性的方法: 1. 程式檢查并剔除函式值 (反射的目標是資料) 2. object.hasOwnProperty() 物件擁有都有的屬性,回傳 boolean 該方法不會檢查原型鏈 flight.hasOwnProperty('number') // true flight.hasOwnProperty('constructor') // false
- 3.7 列舉 for in 陳述句 用來遍歷一個物件中的所有屬性名
- 3.8 洗掉 (1) delete 運算子 洗掉物件的屬性,不會觸及原型鏈中物件 (2) 洗掉物件的屬性 可能浮現原型鏈的屬性 another_stooge.nickname // 'Moe' // 洗掉 another_stooge 的 nickname 屬性,暴露出原型的 nickname 屬性 delete another_stooge.nickname another_stooge.nickname // 'Curly'
- 3.9 減少全域變數污染 javaScript 易保存定義的所有應用資源的全域變數 全域變數 削弱程式的靈活性 1. 只創建唯一一個全域變數,并定義該變數為當前應用容器,把其他全域變數追加在該命名空間下 var MYAPP = {} MYAPP.stooge = { "first-name": 'Jerome', "last-name": 'Howard' } MYAPP.flight = { airline: "Oceanic", number: 815, departure: { IATA: "SYD", time: "2020-10-13 14:55", city: "Sydney" } arrival: { IATA: "LAX", time: "2020-10-14 10:42", city: "Los Angeles" } } 2. 使用閉包將資訊隱藏起來 ## 本章難點(解答見其他文章) 1. javaScript 的資料型別和資料型別檢驗 2. 原型與原型鏈 3. 減少全域變數污染方法 4. 閉包
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/172555.html
標籤:其他
上一篇:2020年9月程式員工資統計,平均14459元!你給程式員拖后腿了嗎?https://jq.qq.com/?_wv=1027&k=JMPndqoM
