对象字面量

参考(http://blog.csdn.net/qq_34267645/article/details/50993379)
对象字面量是一种可以方便地按指定的规格创建新对象的表述法。属性名可以是标识符或字符串。这些名字被当作字面量名而不是变量名来对待,所以对象的属性名在编译时才能知道。属性的值就是表达式。

对象字面量提供了一种非常方便的创建新对象的表示法。一个对象字面量就是包围在一对花括号中的零或多个”名/值“对。对象字面量可以出现在任何允许表达式出现的地方。

1
2
3
4
5
var  empty_object = {};
var stooge = {
"first-name" : "Jerome",
"last-name" : "Howard"
}

属性名可以是包括空字符串在内的所有字符串。在对象字面量中,如果属性名是一个合法的Javascript标识符且不是保留字,则并不强制要求你用引号括住。所以上面的代码中”first-name“必须用”“括起来,而first_name就不用(因为中间是下划线)。逗号用来分割多个“名/值”对。

属性的值可以从包括另一个对象字面量在内的任意字表达式获得。对象可以是嵌套的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var flight = {
airline : "Oceanic",
number : 815,
departure : {
TATA : "SYD",
time : "2004-09-22 14:55"
city : "Sydeny"
},
arrival : {
TATA : "LAX",
time : "2004-09-22 14:55",
city : "Los Angeles"
}
}

要检索对象里面包含的值,可以采用在[]后缀括住一个字符串表达式的方式。如果字符串表达式是一个字符串字面量,而且是一个合法的Javascript标识符且不是保留字,那么也可以用 . 表示法。

1
2
3
4
5
stooge ["first-name"]
//"Jerome"

flight.departure.TATA
//"SYD"

如果检索一个不存在的成员属性的值,将返回undefined。||运算符可以用来填充默认值:

1
var middle = stooge["middle-name"] || ["none"];  //若不存在middle-name属性,将返回none

尝试从undefined的成员属性中取值将会导致TypeError异常。这时可以通过&&运算符来避免错误。(原文中例子写得不是很清楚)

1
2
3
4
var flight = {}
flight.equipment //undefined
var test = flight.equipment.model // throw TypeError
var test = flight.equipment && flight.equipment.model //所以在使用flight.equipment.model 先进行非空判断

对象通过引用来传递。它们永远不会被复制:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var stooge = {
"first-name" : "Jerome",
"last-name" : "Howard"
}
var x = stoogle
stooge['first-name'] = 'Greet'
x['first-name'] //'Greet'

//还有个例子很危险
var a = b = c = {}
a['test'] = 123
b.test //123 因为他们指向同一个空对象
var test = a.test
a.test = 2222
test //123 似乎只有对象之间是用引用来传递