对象的组成和引用
对象是属性的无序集合,每个属性都是一个名值对,由属性名和属性值组成。
对象的组成
[1] 属性名:对象的所有属性名都是字符串,所以,加不加引号都可以,如果不是字符串也会自动转换成字符串。
var o = {
'p': 'Hello World' // 属性名是字符串,因此,我们可以把对象看成是从字符串到值的映射
};
var o = {
p: 'Hello World'
};
var o ={
1: 'a',
3.2: 'b',
1e2: true,
1e-2: true,
.234: true,
0xFF: true,
};
//Object {1: "a", 100: true, 255: true, 3.2: "b", 0.01: true, 0.234: true}
o;
需要注意的是,如果键名不符合标识符命名规则,则必须加上引号,否则会报错。
//Uncaught SyntaxError: Unexpected identifier
var o = {
1p: 123
}
var o = {
'1p': 123
}
[2] 属性值:属性值可以是任何类型的表达式,最终表达式的结果就是属性值的结果。
var o ={
a: 1+2
}
console.log(o.a);//3
如果属性值为函数,则通常把这个属性称为“方法”。
var o = {
p: function (x) {
return 2 * x;
}
};
o.p(1);//2
// 由于对象的方法就是函数,因此也有name属性。方法的name属性返回紧跟在function关键字后面的函数名。
// 如果是匿名函数,ES5环境会返回undefined,ES6环境会返回方法名。
var obj = {
m1: function f() {},
m2: function () {}
};
obj.m1.name // "f"
obj.m2.name //ES5: undefined
obj.m2.name //ES6: "m2"
对象的引用
原始类型和引用类型的区别:值传递 & 引用传递
如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,即指向同一个内存地址。
修改其中一个变量,会影响到其他所有变量。 var o1 = {}; var o2 = o1; o1.a = 1; console.log(o2.a); // 1 o2.b = 2; console.log(o1.b); // 2 如果取消某一个变量对于原对象的引用,不会影响到另一个变量。 var o1 = {}; var o2 = o1; o1 = 1; console.log(o2); // {}