與JS相關的七種數據類型以及五個falsy值
- 七種數據類型 : number、string、bool、symbol、null、undefined、object
- 五個falsy值 : null、undefined、0、NaN、''(空字符串)
原型
- 每個對象都有原型
原型里存著對象的共有屬性,比如obj的原型就是一個對象,obj.proto存著這個對象的地址,這個對象里有toString/constructor/valueOf等屬性 - 對象的原型也是對象
obj={}的原型即為所有對象的原型,這個原型包含所有對象的共有屬性,是對象的根,這個原型也有原型,是null
1、聲明對象的兩種語法
對象 : Object
定義 : 兩種定義方式
- 無序的數據集合
- 鍵值對的集合
作用 : 構造函數創建一個對象包裝器。
- 如果該值為null或undefined,它將創建并返回一個空對象.
- 否則,它將返回一個類型與給定值相對應的對象.
- 如果該值已經是一個對象,它將返回該值.
寫法如下
let obj = {'name' : 'frank','age' : 18}
let obj = new Object({'name': 'frank'})
console.log({'name' : 'frank','age':18})
細節
- 鍵名是字符串,不是標識符,可以包含任意字符
- 引號可以省略,省略之后就只能寫標識符
- 就算引號省略了,鍵名也還是字符串
變量作屬性名
屬性值 : 每個value都是對象的屬性值
數姓名 : 每個key都是對象的數姓名(property)
擴展 : Object.keys(obj)可以得到obj的所有key
let p1 = 'name'
let obj = {p1 : 'frank'} //這樣寫的話,屬性名為p1
let obj = {[p1] : 'frank'} //這樣寫的話,屬性名為'name'
對比來看
- 不加[]的屬性名會自動變成字符串
- 加了[]則會被當做變量求值
- 值如果不是字符串,則會自動變成字符串
對象的隱藏屬性
- JS中每一個對象都有一個隱藏屬性
- 這個隱藏屬性儲存著其共有屬性組成的對象的地址
- 這個共有屬性組成的對象叫做原型
- 隱藏屬性儲存著原型的地址
var obj = {}
obj.toString()
沒有出現報錯的原因是因為obj的隱藏屬性對應的對象上有toString()
2、如何刪除對象的屬性
語法
delete obj.xxx
或
delete obj['xxx']
- 即可刪除obj的xxx屬性
注 : 請區分[屬性值為undefined]和[不含屬性名]
不含屬性名
'xxx' in obj === false
含有屬性名,但是值為undefined
'xxx' in obj && obj.xxx === undefined
注意
obj.xxx === undefined
不能斷定'xxx'是否為obj的屬性
3、如何查看對象的屬性
- 查看自身所有屬性
Object.keys(obj)
- 查看自身+共有屬性
console.dir(obj)
- 判斷一個屬性是自身的還是共有的
obj.hasOwnProperty('toString')
注意
obj.name 等價于 obj['name']
obj.name 不等價于 obj[name]
因為這里的name是字符串,而不是變量
let name = 'frank'
obj[name] 等價于 obj['frank']
而不是 obj['name']和obj.name
4、如何修改或增加對象的屬性
1、修改或增加屬性(寫屬性)
- 直接賦值
let obj = {name : 'frank'} //name是字符串
obj.name = 'frank' //name是字符串
obj['name'] = 'frank'
obj['na'+'me'] = 'frank'
//
let key = 'name';obj[key] = 'frank'
- 批量賦值
Object.assign(obj,{age: 18, gender : 'man'})
2、修改或增加共有屬性
- 無法通過自身修改或增加共有屬性
let obj = {}, obj2 = {} //共有toString
obj.toString = 'xxx' //只會在改obj自身屬性
obj2.toString //還是在原型上
3、修改隱藏屬性
let obj = Object.create(common)
obj.name = 'frank'
let obj2 = Object.create(common)
obj2.name = 'jack'
5、'name' in obj和obj.hasOwnProperty('name')的區別
- 'name' in obj : 查看name的屬性,但是并不能判斷出來是自身的還是共有的
- obj.hasOwnProperty('name') : 可以判斷出來是自身的還是共有的