js判断对象是否为空对象_JS 对象基本用法

e7fabc406fba1571a2f0a4421bd4e985.png

对象 object

定义

  • 无序的数据集合

  • 键值对的集合

写法


let obj = { 'name': 'Li', 'age': 18 }

let obj = new Object({ 'name': 'Li'})

细节

  • 键名是字符串,不是标识符,可以包含任意字符

  • 引号可省略,省略之后就只能写标识符

  • 就算引号省略了,键名也还是字符串(重要)

属性名和属性值

  • 每个key都是对象的属性名(property)
  • 每个value都是对象的属性值

属性名自动会变成字符串的情况

let obj = {

  1: 'a',
  3.2: 'b',
  
le2: true,

  le-2: true,
  
.234: true,
  
OxFF: true
}

打出的结果是

Object.keys(obj)
=> ["1","3.2", "0.01","100","0.234","255"]

细节


Object.keys(obj)可以得到 obj 的所有 key

变量作属性名

如何用变量做属性名
,之前都是用常量做属性名


  • let p1 ='name'

  • let obj = {p1:'frank'}这样写,属性名为'p1'

  • let obj = { [p1]:'frank'}这样写,属性名为'name'

  • 对比
,不加[]的属性名会自动变成字符串
,加了 []则会当做变量求值
,值如果不是字符串,则会自动变成字符串

对象的隐藏属性


  • JS中每一个对象都有一个隐藏属性

  • 这个隐藏属性储存着其共有属性组成的对象的地址

  • 这个共有属性组成的对象叫做原型
,也就是说,隐藏属性储存着原型的地址


代码示例

  • varobj = {}

  • obj.toString() 居然不报错
,因为obj的隐藏属性对应的对象上有toString()

删除属性

  • delete http://obj.xxx或 delete obj[ xxx ]
 即可删除 obj 的 xxx属性
  • 请区分「属性值为undefined」和「不含属性名」

  • 不含属性名
 'xxx' in obj === false

  • 含有属性名,但是值为undefined
: 'xxx' in obj && http://obj.xxx === undefined

  • 注意 http://obj.xxx === undefined
,不能断定‘xxx’是否为obj的属性

查看所有属性(读属性)


  • 查看自身所有属性
 Object.keys (obj)

  • 查看所有的值 Object.values (obj)
  • 查看所有的键跟值 Object.entries (obj)
  • 查看自身+共有属性
 console.dir(obj)

  • 判断一个属性是自身的还是共有的 obj.hasOwnProperty('toString')

查看属性


两种方法查看属性


  • 中括号语法: obj['key']

  • 点语法: obj.key

  • 坑新人语法:obj[key] 变量key值一般不为'key'


修改或增加属性(写属性)


  • 直接赋值 
let obj = {name: 'frank'} //name是字符串
  • obj.name = 'frank' //name 是字符串
  • 
obj['name'] = 'frank'

  • obj ['na' + 'me'] = 'frank'
  • 
let key = 'name'; obj[key] = 'frank'

  • let key = 'name';
  • 批量赋值
Object.assign(obj, {age: 18, gender: 'man'})

修改或增加共有属性

无法通过自身修改或增加共有属性

  • let obj = {}, obj2 = {} // 共有 toString属性
  • obj.toString = 'xxx' 只会在改 obj 自身属性
  • obj2.toString 还是在原型上

修改或增加原型上的属性

  • obj._proto_.toString = 'xxx' // 不推荐用 _proto_
  • Object.prototype.toString= 'xxx'

一般来说,不要修改原型,会引起很多问题

修改隐藏属性

  • let obj = {name:'frank'}
  • 
let obj2 = {name: 'jack'}
  • 
let common = (kind: 'human'}
  • 
obj.__proto__ = common

  • obj2.__proto__ = common

但是不推荐使用__proto__

推荐使用 Object.create

  • let obj = Object.create(common)
  • obj.name = 'frank'

  • let obj2 = Object.create(common)
  • obj2.name = 'jack'

规范大概的意思是,要改就一开始就改,别后来再改

小提问:'name' in obj和obj.hasOwnProperty('name')的区别

  • 'name' in obj 不会区分‘name’是自身的属性还是共有的属性
  • obj.hasOwnProperty('name')可以查看‘name’是否为自身属性

本文资料来源:饥人谷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值