JS 对象 基本用法

217 阅读3分钟

JS 对象是无序的数据集合,是键值对的集合。

一、声明对象

声明对象的语法有两种。

  • let/var 对象名 = {'键名':值 ,'键名':值}
  • let/var 对象名 = new Object{'键名':值 ,'键名':值}
  • 变量作属性名 —— [变量名] (中括号包住变量名)
  • 除了字符串,symbol也能做属性名。
let obj = {'name':'bai',age:18}
let obj2 = new Object{'name':'bai'}
let obj3 = {1e2:true}
//Object.keys(obj3)——>100 科学计数法或十六进制等会求值后成为键名

键名是字符串,可以包含任何字符。键名的引号可以省略,但是引号省略后键名只能写标识符或者数字。(就算引号省略,键名也是字符串

二、删除对象的属性

(以let obj = {'name':'bai',age:18}为例,以 xxx 指代属性名)

  • delete obj.xxx 或者 delete obj['xxx'] —— 删除属性
  • obj.xxx = undefined —— 只删除属性值
  • 'xxx' in obj —— 返回false,则xxx不是obj的属性;返回true,则xxx是obj的属性。 obj.xxx === undefined 有可能是xxx属性的属性值是undefined,也可能是没有xxx属性。

三、查看对象的属性

1、查看所有的属性

(以let obj2 = {'name':'bai',age:18}为例,对象名为 obj2)

  • Object.keys(obj2) —— 查看所有属性
  • Object.values(obj2) —— 查看所有的属性值
  • Object.entries(obj2) —— 查看所有的 key 和 value
  • console.dir(obj2) —— 查看 自身+共有属性
  • obj2.__proto__ —— 查看共有属性(不推荐)
  • obj2.hasOwnProperty('xxx') —— 判断 xxx 属性是否是自身属性:返回true,则是obj2的自身属性;false 则不是其自身属性。例如obj2.hasOwnProperty('toString')返回false

'name' in obj obj.hasOwnProperty('name') 的区别?

'name' in obj —— 查看该属性(name)是否在此对象(obj)里,不区分是自身属性还是共有属性

obj.hasOwnProperty('name')——查看该属性(name)是否为此对象(obj)的自身属性

2、原型

JS 中每一个对象都有一个隐藏属性,这个隐藏属性储存着其共有属性组成的对象的地址。这个共有属性组成的对象叫做原型。

每个对象都有原型,这个原型包含所有对象的共有属性,是对象的根

对象的原型也是对象,所以对象的原型也有原型,是 null。

3、查看某属性

(以let obj2 = {'name':'bai',age:18}为例,对象名为 obj2)

  • 中括号语法:对象名['属性名']。例如obj2['name']
  • 点括号语法:对象名.属性名。例如 obj2.name

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

1、赋值

  • 直接赋值
  • 批量赋值:Object.assign(对象名,{'属性名':值}) 例如Object.assign(obj,{age:18,gender:'man'})

2、修改或增加共有属性

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

例如

let obj={},obj2{}
obj.toString='xxx' 
//只是在obj的自身属性上加上了 toString 属性,不是改变了原型
//obj2.toString 还是在原型上

修改或增加原型上的属性——修改了共有属性

方法有以下两种,以对象名 obj ,修改toString 属性为例

  • obj.__proto__.toString = 'xxx' //不推荐用__proto__
  • Object.prototype.toString = 'xxx' 一般来说,不要修改共有属性

3、改原型

方法有两种

  • obj.__proto__ = common(不推荐__proto__)
  • Object.create —— 在一开始就以某个对象为原型。 在开始创建时加上属性需要:Object.create(作为原型的对象名,{属性值:{value:值}}),也可以 直接赋值 或 批量赋值

例如

__proto__方法:
let obj={name:'bai'}
let obj2 = {age:18}
let common = {kind:'human'}
obj.__proto__ = common 
//保存了原型,但是在原有的原型链上增加了 common 的节点
//并且 obj2 的原型没有改变
Object.create方法:
let common = {kind:'human'}
let obj2 = Object.create(common,{age:{value:18}})