js判断对象是否为空对象_js对象
生活随笔
收集整理的這篇文章主要介紹了
js判断对象是否为空对象_js对象
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
七種數(shù)據(jù)類型 number string bool symbol undefined null object
五個(gè)Falsy 值 undefined null 0 NaN ''
對象 object
第七種數(shù)據(jù)類型,唯一一種復(fù)雜類型
- 定義
- 無序的數(shù)據(jù)租戶
- 鍵值對的集合
- 寫法
- let obj = {'name':'frank','age':18}
- let obj = new Object({'name:'frank'})
- console.log({'name':'frank','age':18})
細(xì)節(jié)
- 鍵名是字符串,不是標(biāo)識(shí)符,可以包含任意字符 (沒有數(shù)字鍵名,沒有數(shù)字下標(biāo))
- 引號可以省略,省略之后就只能寫標(biāo)識(shí)符
- 就算引號省略了,鍵名也還是字符串(重要)
屬性名:每個(gè)key都是對象的屬性名(property)
屬性值:每個(gè)value都是對象的屬性值
奇怪的屬性名
- 所有的屬性名會(huì)自動(dòng)變成字符串
- 細(xì)節(jié)
- Object.key(obj)key得到obj的所有key
變量作屬性名
- 如何用變量做屬性名
- 之前都是用常量做屬性名
- let p1 ='name'
- let obj ={p1:'frank'}這樣寫,屬性名為'p1'
- let obj={[p1]:'frank'}這樣寫,屬性名為'name'
- 對比
- 不加[]的屬性名會(huì)自動(dòng)變成字符串
- 加了[]則會(huì)當(dāng)做變量求值
- 值如果不是字符串,則會(huì)自動(dòng)變成字符串
對象的隱藏屬性
- 隱藏屬性
- js中的每一個(gè)對象都有一個(gè)隱藏屬性
- 這個(gè)隱藏屬性儲(chǔ)存著其共有屬性組成的對象的地址
- 這個(gè)公有屬性組成的對象叫做原型
- 也就是說,隱藏屬性存儲(chǔ)著原型地址(公有屬性)
代碼示例
- var obj ={}
- obj.toString()// 居然不報(bào)錯(cuò)
- 因?yàn)閛bj的隱藏屬性對應(yīng)的對象上有toString()
對象的增刪改查
刪除屬性
- delete http://obj.xxx或 dele obj['xxx'] (刪除屬性名)
- 即可刪除obj的xxx屬性
- 請區(qū)分 屬性值為undefined 和 不含屬性名
- 不含屬性名
- 'xxx' in obj === false (注意要加單引號)
- 含有屬性名,但是值為 undefined
- 'xxx' in obj && obj.xxx === undefined
- 注意 obj.xxx === undefined
- 不能斷定 'xxx'是否為obj的屬性
- 類比
- 你有沒有衛(wèi)生紙
- A:你有沒有衛(wèi)生紙?//不含屬性名
- B:有,但是沒帶//含有屬性名,但是值為 undefined
查看所有的屬性(讀屬性)
- 查看自身所有屬性
- Object.keys(obj) Object.values(obj)只想知道值 Object.entries(obj) 知道key 和value
- 查看自身+共有屬性
- console.dir(obj)
- 或者自己依次用 Object.key 打印出obj.__proto__
- 判斷一個(gè)屬性是自身的還是共有的
- obj.hasOwnProperty('toString')
原型
- 每個(gè)對象都有原型
- 原型里存著對象的共有屬性
- 比如obj的原型就是一個(gè)對象
- obj.__proto__存著這個(gè)對象的地址
- 這個(gè)對象里有toString/constructor/valueOf等屬性
- 對象的原型也是對象
- 所以 對象的原型也有原型
- obj={}的原型即為所有對象的原型
- 這個(gè)原型包含所以對象的共有屬性,是對象的根
- 這個(gè)原型也有原型,null
查看屬性
- 兩種方法查看屬性
- 中括號語法:obj['key']
- 點(diǎn)語法:obj.key
- 坑新人語法:obj[key]//變量key值一般不為'key'
- 請優(yōu)先用中括號語法
- 點(diǎn)語法會(huì)誤導(dǎo)你,讓你以為key不是字符串
- 等確定不會(huì)弄混兩種語法,再改用點(diǎn)語法
重要
obj.name等價(jià)于 obj['name']
obj.name不等價(jià)于obj[name] 這里的[name]是變量, 而我們要的是name是字符串
真正等價(jià)的情況
let name = 'frank' obj[name]等價(jià)于obj['frank']
let list =['name','age','gender'] let person ={name:'frank',age:18,gender:'man'} for(let i =0;i<list.length;i++){ let name =list[i] console.log(person________) }填空 console.log(person[name])修改或增加屬性(寫屬性)
- 直接賦值
- 批量賦值
- Object.assign(obj,{age:18,gender:'man'})
修改或增加共有屬性
- 無法通過自身修改或增加共有屬性
- let obj={},obj2={}//共有toSring
- obj.toString='xxx'只會(huì)改obj自身屬性
- obj.toString 還是在原型上
- 我偏要修改或增加原型上的屬性
- obj.__proto__.toString='xxx'//不推薦用__proto
- Object.prototype.toString='xxx'
- 一般來說,不要修改原型,會(huì)引起很多問題
修改隱藏屬性
- 不推薦使用__proto__
- let obj ={name:'frank'}
- let obj2={name:'jack' }
- let common ={kind:'human'}
- obj.__proto__ =common
- obj.__proto__=commom
- 推薦使用 Object.create
- let obj =Object.create(common)
- obj.name = 'frank'
- let.name2 =Object.create(commom)
- obj2.name='jack'
- 規(guī)范大概的意思是.要改就一開始就該,別后來再改
5:'name' in obj和obj.hasOwnProperty('name') 的區(qū)別
前者可以查看是否有這個(gè)屬性,后者查看這個(gè)屬性是自身還是共有的
總結(jié)
- 刪
'name'in obj//false
obj.hasOwnProperty('name')//false
- 查
console.dir(obj)
obj['name']
obj.name//name是字符串
obj[name]//name是變量
- 改
批量改自身Object.assign(obj,{age:18,...})
改共有屬性:obj.__proto__['toString']='xxx'
改共有屬性:Object.prototype['toString']='xxx'
改原型:obj.__proto__=common
改原型:let obj=Object.create(common)
注:所有_proto__代碼都是強(qiáng)烈不推薦寫的
- 增
總結(jié)
以上是生活随笔為你收集整理的js判断对象是否为空对象_js对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【债券】可转换债券基本概念
- 下一篇: 测试管理 | 测试经理定义和实施测试度量