对象

149 阅读5分钟

1.概述

1.1生成方法

对象object是JavaScript语言的核心概念,也是最重要的数据类型。 什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。

var obj = {
  foo: 'Hello',
  bar: 'World'
};

上面代码,大括号定义一个对象,被赋值给变量obj,所以变量obj指向一个对象;对象内部包含两个键值对(两个“成员”)。

1.2键名

  • 对象的所有键名都是字符串(ES6引入Symbol值也可以作为键名),所以加不加引号都可以。
  • 如果键名是数值,会被自动转为字符串
  • 若键名不符合标识名条件,必须加上引号,否则报错
  • 对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型,如果一个属性的值为函数,通常将此属性称为“方法”
  • 若属性的值是一个对象,就形成了链式引用
  • 对象的属性之间用逗号分隔,最后一个属性后面可以加逗号也可以不加
  • 属性可以动态创建,不必在对象声明时就指定

1.3对象的引用

  • 如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址,修改其中一个变量,会影响到其他所有变量
  • 若取消某一个变量对于原对象的引用,不会影响到另一个变量
  • 引用仅局限于对象,如果两个变量指向同一个原始类型的值,那么变量都是值的拷贝,并不是指向同一个内存地址

1.4表达式还是语句?

对象采用大括号表示,导致一个问题:如果行首是一个大括号,那么它到底是表达式还是语句?

  • JavaScript引擎遇到这种情况,无法确定是对象还是代码块,一律解释为代码块
  • 若要解释为对象,最好在大括号前加上圆括号。圆括号里面只能是表达式,加上圆括号后解释为对象

2.属性的操作(增删改查)

2.1属性的读取

读取对象的属性有两种方法:

  • 点运算符:obj.p
  • 方括号运算符:obj['p'] (键名必须放在引号里,否则会被当做变量处理) 方括号运算符内部可以使用表达式;数字键可以不加引号,因为会自动转成字符串;数值键名不能使用点运算符(会被当成小数点,报错),只能使用方括号运算符。

2.2属性的赋值

点运算符和方括号运算符,不仅可以用来读取值,还可以用来赋值。JavaScript允许属性的“后绑定”,可以在任意时刻新增属性,没必要在定义对象的时候就定义好属性。

2.3属性的查看

查看一个对象本身的所有属性,可以使用Object.keys()方法。(返回包含给定对象自身可枚举属性名称的数组)

2.4属性的删除:delete命令

  • delete命令用于删除对象的属性,删除成功后返回true
  • 删除一个不存在的属性,delete不会报错,而且返回true,因此不能根据delete命令的结果来判断某个属性是否存在
  • 只有一种情况delete命令会返回false,那就是该属性存在且不能删除(configurable:false)
  • 另外,delete命令只能删除对象本身的属性,无法删除继承的属性(delete返回true,但是删除的属性依然存在)

2.5属性是否存在:in运算符

in运算符用于检查对象是否包含某个属性(检查的是键名,不是键值),如果包含就返回true,否则返回false。它的左边是一个字符串,表示属性名,右边是一个对象。

  • in运算符不能识别属性是自身的还是继承的
  • 判断是否为对象自身属性,可以使用对象的hasOwnProperty()方法判断

2.6属性的遍历:for...in循环

for...in循环用来遍历一个对象的全部属性。 for...in循环有两个使用注意点:

  • 它遍历的是对象所有可遍历的(enumerable)的属性,会跳过不可遍历的属性
  • 它不仅遍历对象自身的属性,还遍历继承的属性(若继承的属性“不可遍历”,则不会被for...in循环遍历到;若继承的属性是可遍历的,那么就会被for...in循环遍历到) 一般情况下,只想遍历对象自身的属性,所以使用for...in的时候,应该结合hasOwnProperty()方法,在循环内部判断某个属性是否为对象自身的属性。(hasOwnProperty()方法返回一个布尔值,用if语句判断,若判断语句为真,则返回自身属性)

3.with语句

with语句格式如下:

with (对象) {
  语句;
}

作用是操作同一个对象的多个属性,提供书写的方便。但是with语句有很大的弊病,就是绑定对象不明确,无法判断操作对象的变量是全局变量还是对象属性,不利于代码的除错和模块化,编译器也无法优化,拖慢运行速度。因此,不建议使用with语句,可以考虑用一个临时变量代替with。