◆

JavaScript Object 对象是什么及键值对详解

2023-02-02 01:370

什么是对象

简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。

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

上面代码中,大括号就定义了一个对象,它被赋值给变量 obj,所以变量 obj 就指向一个对象。该对象内部包含两个键值对(又称为两个“成员”), 第一个键值对是 foo: 'Hello',其中 foo 是“键名”(成员的名称),字符串 Hello 是“键值”(成员的值)。键名与键值之间用冒号分隔。 第二个键值对是 bar: 'World',bar 是键名,World 是键值。两个键值对之间用逗号分隔。

键名

对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以。上面的代码也可以写成下面这样。

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

如果键名是数值,会被自动转为字符串。

var obj = {
  1: 'a',
  3.2: 'b',
  1e2: true,
  1e-2: true,
  0.234: true,
  0xff: true,
};

console.log(obj);
// Object {
//   1: "a",
//   3.2: "b",
//   100: true,
//   0.01: true,
//   0.234: true,
//   255: true
// }

obj['100']; // true

如果键名不符合标识名的条件(比如第一个字符为数字,或者含有空格或运算符),且也不是数字,则必须加上引号,否则会报错

// 报错
var obj = {
  1p
:
'Hello World'
}
;

// 不报错
var obj = {
  '1p': 'Hello World',
  'h w': 'Hello World',
  'p+q': 'Hello World'
};

上面对象的三个键名,都不符合标识名的条件,所以必须加上引号。

对象的引用

如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。

var o1 = {};
var o2 = o1;

o1.a = 1;
o2.a; // 1

o2.b = 2;
o1.b; // 2

上面代码中,o1 和 o2 指向同一个对象,因此为其中任何一个变量添加属性,另一个变量都可以读写该属性。

此时,如果取消某一个变量对于原对象的引用,不会影响到另一个变量。

var o1 = {};
var o2 = o1;

o1 = 1;
o2; // {}

属性的读取

读取对象的属性,有两种方法,一种是使用点运算符,还有一种是使用方括号运算符。

如果使用方括号运算符,键名必须放在引号里面,否则会被当作变量处理

var obj = {
  p: 'Hello World',
};

obj.p; // "Hello World"
obj['p']; // "Hello World"

方括号运算符内部还可以使用表达式。

obj['hello' + ' world'];
obj[3 + 3];

数字键可以不加引号,因为会自动转成字符串。

var obj = {
  0.7: 'Hello World',
};

obj['0.7']; // "Hello World"
obj[0.7]; // "Hello World"

数值键名不能使用点运算符(因为会被当成小数点),只能使用方括号运算符。

var obj = {
  123: 'hello world',
};

obj;
0.123; // 报错
obj[123]; // "hello world"

delete 命令

delete 命令用于删除对象的属性,删除成功后返回 true

  • 删除一个不存在的属性,delete 不报错,而且返回 true。
var obj = { p: 1 };
Object.keys(obj); // ["p"]

delete obj.p; // true
obj.p; // undefined
Object.keys(obj); // []

只有一种情况,delete 命令会返回 false,那就是该属性存在,且不得删除。

var obj = Object.defineProperty({}, 'p', {
  value: 123,
  configurable: false,
});

obj.p; // 123
delete obj.p; // false

delete 命令只能删除对象本身的属性,无法删除继承的属性

toString 是对象 obj 继承的属性,虽然 delete 命令返回 true,但该属性并没有被删除,说明,即使 delete 返回 true,该属性依然可能读取到值。

var obj = {};
delete obj.toString; // true
obj.toString; // function toString() { [native code] }

in 运算符

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

var obj = { p: 1 };
'p' in obj; // true
'toString' in obj; // true

in 运算符会取得继承的属性

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEJavaScript Object 对象是什么及键值对详解加载中