关于销毁对象。为什么它们没有定义?

时间:2019-08-29 15:10:58

标签: javascript

为什么test1test2在此代码中获得值undefined

let car={id:10,style:'go'};

let {test1,test2}=car;

console.log(test1,test2);

1 个答案:

答案 0 :(得分:3)

您的变量获得值undefined,因为您的对象没有名为test1test2的属性。与其他任何时候一样,您向对象索要它没有的属性,结果就是值undefined。如果要使用与变量名称不同的名称来获取属性的值,则必须明确:

let {id: test1, style: test2} = car;
//   ^^^        ^^^^^^

实时示例:

let car = {id:10,style:'go'};

let {id: test1, style: test2} = car;

console.log(test1, test2);

或者,当然,请使用简写形式,并使变量名称与属性名称匹配:

let {id, style} = car;

实时示例:

let car = {id:10,style:'go'};

let {id, style} = car;

console.log(id, style);

您可能会感到困惑,因为数组解构是位置性的,但是对象解构是基于名称的。变量的名称对数组的分解没有影响:

const array = [1, 2, 3];
const [one, two] = array;
console.log(one, two);

那是因为这两种破坏形式本质上是根本不同的。数组是元素的有序集合,因此数组文字和数组解构模式都使用位置符号。对象不是对象,因此对象文字和对象解构模式主要使用基于名称的表示法。 (尽管“自有”对象属性在ES2015 +中确实具有定义的顺序,但是从根本上讲,对象不是有序的信息集合,通常不是最佳做法是使用所定义的顺序。)


众所周知,您在问题中使用的表格实际上是速记表格,用于:

let {id: id} = car;
//   ^^  ^^--- target variable name
//     \------ source property name

这是因为同样,对象解构语法有意与对象文字语法相同,只是在赋值的另一侧。您可能已经习惯了这样的事情:从对象文字中的变量初始化对象属性:

let id = 42;
let obj = {id: id};
//         ^^  ^^--- source variable name
//           \------ target property name
console.log(obj.id); // 42

...并且可能知道ES2015为此引入了简写形式:

let id = 42;
let obj = {id};
console.log(obj.id); // 42

您在问题中使用的表格是简写形式,采用的是解构模式,而不是对象文字。