JS对象基本用法

149 阅读4分钟

概述

JavaScript 中共有七种数据类型,分别是字符串(String)、数字(Number)、布尔(Boolean)、空(Null)、空(Undefined)、符号(Symbol)和对象(Object),其中除却对象(Object)之外的其余六种对象都属于简单类型,而对象(Object)属于唯一一种复杂类型

定义以及用法

  • 它是无序的数据集合(里面内容没有顺序)
  • 它是键值对的集合(一个键和一个值组成一个对)例:let obj = {'name' : 'frank' , 'age' : 18}(这里面name是一个键,frank是一个值,两个组成一个对。后面age和18同理)
  • 键名是字符串而不是标识符,可以包含任意字符
  • 引号可以省略,省略后依然是字符串,但是省略引号则只能写标识符,这点很重要

声明对象的两种方法

  • let obj = { 'name': 'frank', 'age': 18 }(这是简单写法,obj是对象名)
  • let obj = new Object({'name': 'frank'})(这是正规写法)

变量做属性名

之前都是用常量做属性名,怎样用变量做属性名

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

对比:

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

对象(Object)的增删改查

增加、修改

对象的增加和修改可以理解为写属性

直接赋值

  • let.obj = {name : 'frank' }其中name是字符串
  • obj.name = 'frank'
  • obj ['name'] = 'frank'
  • obj['na'+'me'] = 'frank'
  • let key = 'name'; obj[key] = 'frank'

以上几种方法都可以用作直接赋值

批量赋值

  • Object.assign(obj, {age: 18, gender: 'man'})

批量赋值用在需要赋值的属性和字符串较多时使用,这种赋值方式是ES6版本新出的一种赋值方式

查看属性

查看单个属性

  • 中括号语法:obj['key']
  • 点语法:obj.key 两种语法用途一样,但是更推荐新手使用中括号语法,因为点语法会误导你,让你以为 key 不是字符串。等确定不会弄混两种语法,再改用点语法

查看所有属性

  • 查看自身所有属性:Object.keys(obj)
  • 查看自身属性+共有属性:console.dir(obj)
  • 判断一个属性是自身的还是共有的:obj.hasOwnProperty('toString')如果是自身的会返回ture,不是自身的会返回fast

删除属性

  • delete obj.xxx可以删除这个xxx属性
  • 使用'xxx' in obj可以查看是否删除成功,如果成功会返回false(这个方法有个问题:没有办法去区分这个属性是自身的还是原型上共有的)
  • 解决办法:obj.hasOwnProperty('name')如果返回false则不是自身的属性或者是原型上共有的属性

注意!

属性值为undefined和不含属性值是完全不同的两种概念

  • 'xxx' in obj === false的意思是obj不含属性名
  • 'xxx' in obj && obj.xxx === undefined的意思是含有属性名,但是值为 undefined

隐藏对象、共有属性的增删改查

修改或增加共有属性

共有属性是每个对象都存在的,通常来讲并不推荐修改

  • obj.toString = 'xxx' 会修改自身的toString属性,但是不会影响到共有属性,修改自身属性后,就不能使用共有toString属性了,因为自身已经添加了一个新的 toString属性
  • obj.proto.toString = 'xxx'是真的可以修改共有属性的,但是千万别用,会有性能问题
  • Object.prototype.toString = 'xxx'

修改或删除隐藏对象

修改隐藏对象和修改共有属性是有区别的,共有属性在隐藏对象之中

  • (不推荐)obj.proto = null删除隐藏对象,这样会让这个对象非常纯净,任何与外界的联系都没有
  • (不推荐)obj2.proto = common将隐藏对象重新设置成新的对象,需要注意的是这个新设置的对象中还存在一个隐藏对象。这种原型后面还有另一个原型叫做原型链

但是!

非常不推荐使用obj.proto =这种语法,因为隐藏属性最好一开始就改完,别后来再改,使用下面的方法更合适

  • let aaa = {name:'xxx' age : '18'}首先声明一个对象
  • let bbb = Object.create(aaa)让aaa对象成为bbb的隐藏属性(要注意的是,bbb属性本身没有内容,如需赋值则需要自行赋值)

JS对象知识中需要牢记的一点

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

  • 'name' in obj用来判断obj对象是否含有name属性
  • obj.hasOwnProperty('name')用来判断name属性是自身属性还是共有属性(这个操作不会查找到原型链内的属性)