对象
JavaScript 中的对象,Object,可以简单理解成“名称 - 值”对(而不是键值对:现在,ES 2015 的映射表(Map),比对象更接近键值对),不难联想 JavaScript 中的对象与下面这些概念类似:
- Python 中的字典(Dictionary)
- Perl 和 Ruby 中的散列/哈希(Hash)
- C/C 中的散列表(Hash table)
- Java 中的散列映射表(HashMap)
- PHP 中的关联数组(Associative array)
这样的数据结构设计合理,能应付各类复杂需求,所以被各类编程语言广泛采用。正因为 JavaScript 中的一切(除了核心类型,core object)都是对象,所以 JavaScript 程序必然与大量的散列表查找操作有着千丝万缕的联系,而散列表擅长的正是高速查找。
“名称”部分是一个 JavaScript 字符串,“值”部分可以是任何 JavaScript 的数据类型——包括对象。这使用户可以根据具体需求,创建出相当复杂的数据结构。
有两种简单方法可以创建一个空对象:
代码语言:javascript复制var obj = new Object();
和:
代码语言:javascript复制var obj = {};
这两种方法在语义上是相同的。第二种更方便的方法叫作“对象字面量(object literal)”法。这种也是 JSON 格式的核心语法,一般我们优先选择第二种方法。
“对象字面量”也可以用来在对象实例中定义一个对象:
代码语言:javascript复制var obj = {
name: "Carrot",
_for: "Max",//'for' 是保留字之一,使用'_for'代替
details: {
color: "orange",
size: 12
}
}
对象的属性可以通过链式(chain)表示方法进行访问:
代码语言:javascript复制obj.details.color; // orange
obj["details"]["size"]; // 12
下面的例子创建了一个对象原型,Person
,和这个原型的实例,You
。
function Person(name, age) {
this.name = name;
this.age = age;
}
// 定义一个对象
var You = new Person('You', 24);
// 我们创建了一个新的 Person,名称是 "You"
// ("You" 是第一个参数,24 是第二个参数..)
完成创建后,对象属性可以通过如下两种方式进行赋值和访问:
代码语言:javascript复制// 点表示法 (dot notation)
obj.name = 'Simon';
var name = obj.name;
和:
代码语言:javascript复制// 括号表示法 (bracket notation)
obj['name'] = 'Simon';
var name = obj['name'];
// can use a variable to define a key
var user = prompt('what is your key?')
obj[user] = prompt('what is its value?')
这两种方法在语义上也是相同的。第二种方法的优点在于属性的名称被看作一个字符串,这就意味着它可以在运行时被计算,缺点在于这样的代码有可能无法在后期被解释器优化。它也可以被用来访问某些以预留关键字作为名称的属性的值:
代码语言:javascript复制obj.for = 'Simon'; // 语法错误,因为 for 是一个预留关键字
obj["for"] = 'Simon'; // 工作正常