对象的组成和引用

对象是属性的无序集合,每个属性都是一个名值对,由属性名和属性值组成。


对象的组成

[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);  // {}