JS 物件基本用法
阿新 • • 發佈:2020-06-29
物件是JS的複雜型別,也是7種資料型別之一,下面就來介紹物件的建立以及物件的增刪改查。
物件
定義
- 無序的資料集合
- 鍵值對的集合
寫法
let obj = {'name': 'hong','age':18}(更簡單)
let obj = new Object ({'name':'hong'})(更規範)
console.log({'name': 'hong','age':18})
複製程式碼
注意細節:
- 鍵名是字串,不是識別符號,可以包含任意字元(可以是空字串,也可以是空格字串)
- 引號可以省略,省略後只能寫識別符號
- 就算引號省略了,鍵名也還是字串
物件屬性
- 屬性名:每個key都是物件的屬性名
- 屬性值:每個value都是物件的屬性值
- 所有屬性名都會自動變成字串
Object.keys(obj)可以得到obj的所有key
變數作屬性名
之前都是用常量作屬性名
let p1 = 'name'
let obj = {p1:'hong'},這樣寫屬性名為p1
let obj = {[p1]:'hong'}這樣寫,屬性名為'name'
複製程式碼
對比
- 不加[]的屬性會自動變成字串
- 加了[]則會當成變數先求值
- 值如果不是字串,則會自動變成字串
物件的隱藏屬性
- JS中每一個物件都有一個隱藏屬性
- 這個儲存著其共有屬性組成的物件的地址
- 這個共有屬性組成的物件叫做原型
- 也就是說隱藏屬性儲存著原型的地址
var obj{}
obj.toString()//不報錯
//因為obj的隱藏屬性對應的物件上有toString
複製程式碼
物件的增刪改查操作
刪除屬性
-
delete obj.xxx或者delete obj.['xxx']即可刪除obj的xxx屬性
-
不含屬性名
'xxx' in obj===false
複製程式碼
- 含有屬性名,但是值為undefined ```
'xxx' in obj&&obj.xxx===undefined
複製程式碼
*注意 obj.xxx===undefined 不能判定'xxx'是否為obj的屬性
檢視所有屬性(讀屬性)
- 檢視自身所有屬性:
Object.keys(obj)
複製程式碼
- 檢視自身+共有屬性:
console.dir(obj)
或者自己依次用Object.keys
打印出
obj.__proto__
(不推薦)
- 判斷一個屬性是自身的還是共有的:
obj.hasOwnProperty('toString')
複製程式碼
檢視屬性
兩種方法檢視屬性
- 中括號語法:obj['key']
- 點語法:obj.key
- 注意obj[key]//變數key值一般不為'key'
PS:優先使用中括號語法,點語法會誤導你認為key不是字串
增加或修改屬性(寫屬性)
直接賦值
let obj = {name:'ben'}//name是字串
obj.name = 'ben'//name是字串
obj['name']='ben'
obj[name]='ben'//錯因為name的值不確定
obj['na'+'me']='ben'
let key = 'name';obj[key] = 'ben'
let key = 'name';obj.key = 'ben'//錯,因為obj.key等價於obj['key']
複製程式碼
批量賦值
Object.assign(obj,{age:18,gender:'femal'})
複製程式碼
修改或增加共有屬性
無法通過自身修改或增加共有屬性
let obj = {},obj2 ={}//共有toString
obj.toString = 'xxx'只會修改自身屬性
obj2,toString還是在原型上
複製程式碼
一般不要修改原型會產生問題,如果偏要修改Object.prototype.toString='xxx'
修改隱藏屬性
使用Object.create
let obj = Object.create(common)
obj.name = 'hong'
複製程式碼
規範如果要改就一開始改,不要後來再改
'name' in obj和obj.hasOwnProperty('name') 的區別
前者自身屬性和共有屬性都返回true,後者僅僅是自身屬性才返回true