JavaScript 基本数据类型-对象
对象是 JavaScript
的基本数据类型,对象可以看做是属性的无序集合。对象不仅仅是字符串到值的映射,除了保持自身的属性,JavaScript
对象还可从一个称谓原型的对象中继承属性。对象的方法通常是继承的属性。这种“原型式继承”是 JavaScript
的核心特征。
对象的常见方法:
- 创建
create
- 设置
set
- 查找
query
- 删除
delete
- 检测
test
- 枚举
enumerate
创建对象
对象字面量
创建对象最简单的方式就是使用对象字面量(直接量)
1 | var empty = {} |
对象字面量是一个表达式,每次运算都会创建并初始化一个新的对象。这就意味着,如果在一个重复调用的函数的循环内使用了对象字面量,它将创建很多对象,并且每次创建的对象的属性值都有可能不同。
通过 new 创建对象
new 运算符创建并初始化一个对象。new 后跟随一个函数调用,这个函数被称为构造函数(constructor),构造函数用以初始化一个新创建的对象。
JavaScript 的原始类型都包含内置构造函数,
1 | var o = new Object() |
原型
每一个 JavaScript
对象(null
除外)都和另一个对象相关联。
所有通过对象字面量创建的对象,原型都指向 Object.prototype
(obj.__proto__ === Object.prototype
),通过 new
关键字创建的对象,其原型就是构造函数的 prototype
属性的值。
Object.create()
ES6
中新增的方法,它创建一个新对象,其中第一个采纳数是这个对象原型。 Object.create()
提供第二个参数,用以对对象的属性进行进一步描述。
创建一个空对象,(例如和 {}、new Object()
一样) ,需要传入 Object.prototype
1 | var o3 = Object.create(Object.prototype) |
使用该方法,可以使得任意对象得以被继承,这是一个强大的特性。
属性的查询和设置
查询
可以通过 .
或者方括号 [](必须是一个计算结果为字符串的表达式)
运算符来获取属性的值。
属性访问错误
查询一个不存在属性并不会报错,会返回 undefined,但是如果对象不存在,那么使用查询这个不存对象的属性就会报错,null 和 undefined 都没有属性值,查询时均会报错。
利用 &&
运算符的短路行为,可以解决这个问题。
1 | var len = book && book.subtitle && book.subtitle.length |
删除属性
delete
运算符可以删除对象属性,但是只能删除自身属性,不能删除继承属性。(要删除继承属性,必须要定义这个属性的原型对象上删除它,但这回影响到所有继承这个原型的对象)。
delete
不能删除可配置属性为 false
的属性。
检测属性
in
运算符,如果对象自有属性或继承属性中包含这个属性则返回true
javascript var o = {x: 1} 'x' in o // true 'toString' in o
hasOwnProperty()
, 用来检测给定的名字是否是对象自有的属性,继承属性将返回false
javascript o.hasOwnProperty('x') true o.hasOwnProperty('toString') false
propertyIsEnumerable()
,是hasOwnProperty()
的增强版,检测自有属性并且该属性是可枚举的 - 通过代码增加的属性都是可枚举的,除非手动修改属性的可枚举性使用
!==
判断 - 判断属性是否为undefined
,可用于自有属性和继承属性 - 当属性值位undefined
时,则这种方法失效
序列化对象
对象序列化是指将对象的状态转换成字符串,使用 JSON.stringify()
和 JSON.parse()
进行序列化和还原 JavaScript对
对象。