1. 程式人生 > 前端設計 >JS 物件基本用法

JS 物件基本用法

物件是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