JavaScript 基本数据类型-对象

JavaScript 基本数据类型-对象

对象是 JavaScript 的基本数据类型,对象可以看做是属性的无序集合。对象不仅仅是字符串到值的映射,除了保持自身的属性,JavaScript 对象还可从一个称谓原型的对象中继承属性。对象的方法通常是继承的属性。这种“原型式继承”是 JavaScript 的核心特征。

对象的常见方法:

  • 创建 create
  • 设置 set
  • 查找 query
  • 删除 delete
  • 检测 test
  • 枚举 enumerate

创建对象

对象字面量

创建对象最简单的方式就是使用对象字面量(直接量)

1
2
3
4
5
6
var empty = {}
var point = { x: 0, y: 0 }
var book = {
"min title": "JavaScript", //属性名字有空格、连接符(-),必须要用字符串表示
for: "all audiences" // for 是保留字,必须用引号
}

对象字面量是一个表达式,每次运算都会创建并初始化一个新的对象。这就意味着,如果在一个重复调用的函数的循环内使用了对象字面量,它将创建很多对象,并且每次创建的对象的属性值都有可能不同。

通过 new 创建对象

new 运算符创建并初始化一个对象。new 后跟随一个函数调用,这个函数被称为构造函数(constructor),构造函数用以初始化一个新创建的对象。

JavaScript 的原始类型都包含内置构造函数,

1
2
3
4
var o = new Object()
var a = new Arrya()
var d = new Date()
var r = new RegExp("js")

原型

每一个 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对 对象。