javascript - 关于解构对象。为什么它们未定义?
问题描述
为什么要获取此代码中的test1
值?test2
undefined
let car={id:10,style:'go'};
let {test1,test2}=car;
console.log(test1,test2);
解决方案
您的变量获得值undefined
是因为您的对象没有称为test1
and的属性test2
。与其他任何时候你向一个对象询问它没有的属性一样,结果就是 value 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
您在问题中使用的形式是简写形式,采用解构模式而不是对象文字。
推荐阅读
- weblogic12c - Weblogic 12c - 托管服务器由于无法访问管理服务器而失败
- sql - 为具有多个重复项的多个列创建组
- html - 我需要在图像旁边放置文本,并将它们从上到下堆叠
- java - 如何将多个sql脚本执行到具有相同版本的flyway中
- c++ - 将字节数组传递给 C++ 中的 WMI 提供程序类
- excel - 如果下面行中的单元格包含日期,如何插入公式?
- html - 如何在 HTML5 中为 HTML 输入提及特定长度(5 或 10)
- excel - 工作簿子例程不能从 VB6 中直接按名称调用
- javascript - React 拒绝加载图像,因为它违反了以下内容安全策略指令:“default-src 'none'”
- sql - 加速 Oracle 查询