JS对象基本用法

123 阅读3分钟

提要:

  1. 声明对象
  2. 删除对象的属性
  3. 查看对象的属性
  4. 修改或增加对象的属性

一. 声明对象

对象是键值对的集合。

1. 语法

包含属性名(键名)和属性值(键值)。

1)正规写法:let obj = new Object ({'name':'LLLLxto','age':9})

2)简便写法:let obj = {'name':'LLLLxto','age':9}

3)另外还可以:console.log ({'name':'LLLLxto','age':9})

2. 关于属性名

1)属性名是字符串,不是其他类型,可以包含任意字符。如:

let obj={
    '':'a'
    1:'b'
    2.3:'c'
    .456:'d'
    1e-2:true
    0xFF:true
} 

注意:ES6中,symbol类型也能作属性名。
2)键名引号可以省略(不含特殊字符时)。
3)就算不加引号,键名也还是字符串。
4)用变量的值作属性名,用中括号 [] 括起来。如:

let a='xxx'
let obj={
    [a]:123
}
obj        //返回{xxx:123}

小结:不加 [] 的属性名,会自动变成字符串;加了 [] 的属性名会被当作变量,先求其值,再变成字符串。

二. 删除对象的属性

1. 语法:

1)删除属性名:delete obj.namedelete obj['name']

2)仅删除属性值:obj.name = undefined

2. 验证

1)是否删除成功:'name' in obj,返回 false 说明属性已不存在

2)属性存在但值是否为空:'name' in obj && obj.name === undefined

注:不能只写obj.name === undefined来判定,因为不能断定'name'为obj的属性名。如:

let obj={
    name:undefined
}
let obj2={}
obj.name === undefined   //返回true
obj2.name === undefined  //也返回true,但事实上,'name'不是obj2的属性名

三. 查看对象的属性

1. 查看所有属性

1)查看所有自身属性名:Object.keys(obj)

2)查看所有自身属性值:Object.values(obj)

3)查看所有自身属性名和属性值:Object.entries(obj)

4)查看所有自身属性和共有属性(以目录形式):console.dir(obj)

5)如何判断自身属性/共有属性:obj.hasOwnProperty('name'),返回 true 说明是自身属性。

hasOwnProperty 只能判断是否为自身属性,可结合 in 操作符判断是否为继承属性(共有属性)。
对比:'name' in obj不区分自身属性和共有属性

2. 查看个别属性

1)obj['name']

2)obj.name

  • 两种方式等价,注意name是字符串。
  • 错误方式:obj[name],此时name是变量,并不确定变量的值。

四. 修改或增加对象的属性

修改/增加,语法基本相同,已有则改,没有则增。

1. 修改或增加自身属性

1)直接赋值

let obj = {name:'LLLLxto'}
obj.name = 'LLLLxto'
obj['name'] = 'LLLLxto'
错误方式:obj[name] = 'LLLLxto'

let key = 'name'
obj[key] = 'LLLLxto'

错误方式:

let key = 'name'
obj.key = 'LLLLxto'

关键在于理解属性名是字符串,以及变量作属性名要加 [] ,并先对 [] 内求值,再变为字符串。

2)批量赋值

Object.assign(obj,{name:'LLLLxto',age:9})

2. 修改或增加共有属性 (不推荐这样做)

JS设置,无法通过自身修改或增加共有属性。如果一定要修改或增加原型的属性(即共有属性),则:

1)修改或增加原型属性

obj.__proto__.toString = 'xxx' (用__proto__表示共有属性的方式均不推荐)
window.Object.prototype.toString = 'xxx'

2)修改或增加原型(本质为修改或增加对象)

obj.__proto__ = 'xxx' (用__proto__表示共有属性的方式均不推荐)
② 增加原型,形成原型链

let common = {age:9}
let obj = Object.create(common)
obj.name = 'LLLLxto'

推荐此方式,这意味着,若要改原型一开始就要改,不要后来再改。
注意:创建对象、添加属性两句可合写为

let obj = Object.create(common,{
    name:{value:'LLLLxto'}
})

而不是

let obj = Object.create(common,{
    name:'LLLLxto'}
)                                  //报错

也不是

let obj = Object.create({name:'LLLLxto'})  //属性name增加在了原型里,而不是obj的自身属性