对象

对象是一种离散的数据类型,就像每个原始类型都是一种数据类型一样,但有一个关键的区别:与原始类型不同,对象是可变的。对象可以包含与标识符(如变量)关联的数据,但无论它包含什么数据,它都保持其 object 数据类型。

除了原始类型之外,所有 JavaScript 值都是对象,尽管由于原型继承,即使是原始字面量也表现出类似对象的行为,因此通常说 JavaScript 实际上是由对象组成的。

对象字面量是一对花括号,其中包含零个或多个称为“属性”的键值对,可以包含任何 JavaScript 值。

{
    "myProperty" : true
}

属性可以是任何符号字符串。与将标识符分配给变量时一样,用作属性键的字符串应该具有可预测性和描述性

let carAttributes = {
    "color" : "red"
};

carAttributes
> Object { color: "red" }

属性键需要单引号 (') 或双引号 (") 字符串字面量,而不是 模板字面量

let carAttributes = {
    `keyString` : false
};
> Uncaught SyntaxError: expected property name, got template literal

属性值可以是任何数据类型。对象的属性本身可以包含具有自身属性的对象

let myObject = {
    'key' : {
        'subkey' : true,
        'othersubkey' : false
    }
};

myObject;
> Object { key: Object { subkey: true, othersubkey: false } }

当属性的值是一个函数时,该属性称为“方法”。

const myObject = {
    "myProperty" : true,
    myMethod() {
        console.log( "This is a method." );
    }
}

myObject.myProperty;
> true

myObject.myMethod();
> "This is a method."

您还可以使用 new 关键字创建对象

let myObject = new Object();

在前面的示例中,新创建的对象字面量已分配给变量。这不是必需的,因为像任何其他数据类型一样,您可以在任何需要对象的地方使用对象而无需标识符。但是,在任何可能与块语句混淆的上下文中,对象字面量都需要括号,因为两者共享花括号语法 ({})。初始化变量永远不需要这样做。

{ "value" : 2 }
> Uncaught SyntaxError: unexpected token: ':'

({ "value" : 2 })
> Object { value: 2 }

let valObj = { "value" : 2 };

valObj;
> Object { value: 2 }

与原始类型不同,使用 new Object() 创建对象和创建对象字面量的结果没有有意义的区别,因为在这两种情况下,结果都将是一个对象,其属性继承自 Object 原型。但是,两种语法之间存在一个实际的区别。

new 关键字必须定义一个空对象,该对象稍后会填充数据

let myObject = new Object();

myObject.booleanValue = true;
myObject.stringValue = "My string.";

对象字面量可以在创建时填充数据

let myObject = {
    'booleanValue' : true,
    'stringValue' : "My string."
};

尽管它几乎没有实际用途,但 new Object() 可用于将原始数据值转换为其各自类型的对象,例如通过将 new 关键字与其构造函数函数一起使用返回的对象。例如,以下内容在功能上等同于 new Number( 10 )

let myObject = new Object( 10 );

myObject;
> Number { 10 }

nullundefined 值会导致一个空对象,在功能上与调用不带参数的 new Object() 相同。

将对象字面量作为参数传递给 new Object() 会传递对象字面量而不更改它

let myObject = new Object( { myValue : 10 } );

myObject;
> Object { myValue: 10 }

与对原始值使用构造函数一样,对对象使用构造函数几乎没有任何优于使用对象字面量表示法的好处。即使在创建稍后填充值的空对象时,为了简单起见,开发人员也倾向于使用对象字面量表示法。

检查您的理解情况

您可以使用哪些类型的表示法来设置对象的属性?

点表示法
方括号表示法
句点表示法
行表示法

以下哪项是获取 myProp 值的正确语法

myObj["myProp"];
myObj{"myProp"};
myObj("myProp");