概述
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属性是自身属性还是共有属性(这个操作不会查找到原型链内的属性)