ES6学习笔记2 变量的解构赋值

2. ES6 变量的解构赋值 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(以前,为变量赋值,只能直接指定值)。下面是一些使用嵌套数组进行解构的例子:如果等号的右边不是数组(或者严格地说,不是可遍历的结构),那么将会报错。对于 Set 结构,也可以使用数组的解构赋值 阅读详情

基本用法

ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值

let [a,b,c] = [1,2,3];
a    //1
b    //2
c    //3
let [a, [[b], c]] = [1, [[2], 3]];
a    //1
b    //2
c    //3
let [x, ,y] = [1,2,3];
x  //1
y  //3

如果对应变量解构不成功,则该变量的值将会为undefined

let [x,y] = [1];
x   //1
y   //undefined

如果=的右边不是可迭代的结构,就会报错。事实上,只要某种数据结构具有Iterator接口,就可以采用数组形式的解构赋值,例如Set结构,Generator函数

let [foo] = 1;     //报错
let [foo] = true;  //报错
let [foo] = null;  //报错
let [foo] = undefined;  //报错
let [x,y,z] = new Set(['a','b','c']);
x     //'a'
function* fibs(){
    let a = 0;
    let b = 1;
    while(true){
        yield a;
        [a,b] = [b,a+b]
    }
}

let [first,second,third,fourth,fifth,sixth] = fibs();
sixth    //5

默认值

解构赋值允许指定默认值,若对应的变量解构后值为undefined,则将采用默认值,,否则默认值不生效

let [x=1] = [];
x     //1

let [x,y=2] = [1];
x     //1
y     //2

如果默认值是一个表达式,则这个表达式是惰性求值的,即只有将其作为默认值赋值时才会求值

function f(){
    return 2;
}

let [x = f()] = [1];

上述代码中,因为x能取到值,因此函数f不会执行
默认值可以引用其他变量,但该变量必须已经声明

let [x=1, y=x] = [2]    //x=2,y=2
let [x=y, y=1] = []     //报错,因为y未声明就被先使用

对象的解构赋值

对象的解构与数组有一个重要不同,对象的属性没有次序,变量必须与属性名同名才能取到正确的值

let { foo, bar} = {foo:'aaa', bar:'bbb'};
foo   //'aaa'
bar   //'bbb'

如果变量名与属性名不一致,必须写成如下格式

let {foo:baz} = {foo:'aaa', bar:'bbb'};
baz   //'aaa'

实际上,对象的解构赋值是下面形式的简写

let { foo:foo, bar:bar} = {foo:'aaa', bar:'bbb'};

这表示对象的解构赋值的内部机制是先找到同名属性,然后再赋值给对应的变量。真正被赋值的是后者,而不是前者

let {foo:baz} = {foo:'aaa', bar:'bbb'};
baz   //'aaa'
foo   //报错,foo未定义

与数组一样,解构也可以用于嵌套结构的对象

let obj = {
    p: [
        'hello',
        {y:'world'}
    ]
};

let { p:[x, {y}] } = obj;
x     //'hello'
y     //'world'

对象的解构也可以指定默认值,默认值生效的条件与数组类似

var {x, y=5} = {x:1};
x    //1
y    //5

var {x:y=3} = {x:5};
y    //5

如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,将会报错,原因在于此时将对undefined取子属性

let {foo:{bar}} = {baz:'baz'};  //报错

如果要将一个已经声明的变量,用于解构赋值,应该小心

let x;
{x} = {x:1};  //报错

上述javascript会将{x}理解为一个代码块,只有不将大括号写在行首,才能避免此问题

let x;
({x} = {x:1});  //x=1

常见应用
获取Math对象的方法

let {log, sin, cos} = Math;

获取数组项

let arr = [1,2,3];
let {0:first, [arr.length - 1]:last} = arr;
first  //1
last   //3

字符串的解构赋值

字符串被转换为一个类似于数组的对象

const [a,b,c] = 'xyz';
a    //'x'
b    //'y'
c    //'z'
let {length:len} = 'xyz';
len  //3

数值和布尔值的解构赋值

如果等号右边是数值和布尔值,则会先转化为对象,再赋值

let {toString:s} = 123;
s  //'123'

let {toString:s} = true;
s  //'true'

此处数值和布尔值包装对象都有toString属性,因此他们都能取到值

函数参数的解构赋值

参数传入那一刻,自动被解构赋值

function add([x,y]){
    return x+y;
}

add([1,2]);  //3

可以使用默认值

function add([x=0,y=0]){
    return x+y;
}

add([]);  //0
add([1]);  //1
add([1,1]);  //2

圆括号问题

以下情况不能使用圆括号:

  • 变量声明语句
let [(a)] = [1];  //报错
  • 函数参数
function f([(z)]){
    return z;
}  //报错
  • 赋值语句的模式
([a]) = [5];   //报错

({p:a}) = {p:1};   //报错

圆括号只能使用在赋值语句的非模式部分

[(b)] = [3];    //正确

({p:(d)} = {});   //正确

上述第一行语句,模式是取数组第一个成员,与圆括号无关。第二个语句,模式是p,与圆括号无关。

用途

从函数返回多个值

function example(){
    return [1,2,3];
}
let [a,b,c] = example();

函数参数的定义

function f([x,y,z]){ ... }
f([1,2,3]);

提取JSON数据

let jsonData = {
    id:42,
    status:'ok',
    data:[1,2,3]
}

let {id,status,data} = jsonData;

函数默认参数值、遍历Map结构、输入模块指定方法等

多孔材料吸附性质模拟程序RASPA的离线和在线安装方法 RASPA-2.0是今年美国西北大学教授Randall Q. Snurr等人开发的针对于MC,MD,分子力学优化等用途的程序,相比于之前开发的MUSIC软件,RASPA的功能更加齐全,操作更加简便,可以在MC的吸附过程中考虑骨架的柔性,也可以想MUSIC一样先制作积分格点(music中的map)。 A、离线安装(centos为例): (1)、安装之前要检查一下是否装了automake, 阅读详情

相关推荐

Stata实战:DID平行趋势检验完整操作指南(附reghdfe+coefplot代码)

本文提供了一份使用Stata进行DID平行趋势检验的完整实战指南。文章详细讲解了从数据准备、生成相对时间变量,到利用reghdfe命令构建动态效应模型,以及使用coefplot命令进行结果可视化的全流程操作。核心在于通过检验政策前交互项的显著性,验证处理组与对照组是否满足平行趋势假设,为后续因果推断奠定可靠基础。

weixin_29231725的博客 1380

解构赋值用途与解构赋值圆括号问题

圆括号问题 对于编译器来说,一个式子到底是模式,还是表达式,没有办法从一开始就知道,必须解析到(或解析不到)等号才能知道。 由此带来的问题是,如果模式中出现圆括号怎么处理。ES6 的规则是,只要有可能导致解构的歧义,就不得使用圆括号。 但是,这条规则实际上不那么容易辨别,处理起来相当麻烦。因此,建议只要有可能,就不要在模式中放置圆括号。 不能使用圆括号的情况 以下三种解构赋值不得使用圆括号...

wfly blog 862

智能汽车竞赛摄像头处理(4)——摄像头循迹思路讲解

智能汽车竞赛摄像头处理(4)对摄像头循迹思路进行讲解。

weixin_62261692的博客 7058

JS解构赋值?看这一篇就够了!!!

解构赋值 从数组或者对象中提取值,按照对应位置,对变量赋值,对象也可以实现解构 let [a,b,c] = [1,2,3,4,5] // a=1,b=2,c=3 let [a,b,c] = [1,2] // a=1,b=2,c=undefined let [a,,b] = [1,2,3] // a=1 b=3 跳过其中的值 对象的解构赋值 let {name,age} = {name:11,age:22} console.log(name) // 11 console.log(age)

m0_47883103的博客 648

易语言游戏Call调用避坑指南:主线程绑定与反检测实战

本文详细解析了易语言游戏Call调用中的主线程绑定与反检测技术,帮助开发者避免游戏崩溃和断线问题。通过分析线程检测原理、提供易语言实现方案及高级反检测技巧,如动态线程绑定和上下文伪装,确保Call调用的稳定性和安全性。文章还包含常见问题排查和性能优化建议,适用于游戏辅助开发领域。

weixin_29323365的博客 459

ArcMap投影变换避坑指南:为什么你的坐标转换总出错?常见问题解析与解决方案

本文深入解析ArcMap中坐标转换与投影变换的核心区别与常见陷阱。针对坐标转换总出错的问题,从混淆“定义投影”与“投影变换”、栅格数据重采样选择、矢量数据地理变换参数设置等关键环节,提供清晰的避坑指南与实战解决方案,帮助用户确保空间数据的精确匹配。

weixin_29210727的博客 356

(二)es6 变量的解构赋值

1.数组的解构赋值 (1)模式匹配 只要等号两边的模式相同,左边的变量就会被赋予对应的值。下面是一些使用嵌套数组进行解构的例子 let [foo, [[bar], baz]] = [1, [[2], 3]]; foo // 1 bar // 2 baz // 3 let [ , , third] = ["foo", "bar", "baz"]; third // "baz" let [x, , y] = [1, 2, 3]; x // 1 y // 3 let [head, ...tail] = [1

wzwccc的博客 193

【低空经济】森林火情高精度监测与早期预警无人机巡护方案

在全球范围内,森林火灾已成为一个严重的生态和社会问题。它不仅对自然生态系统造成了毁灭性的影响,还对人类的生命财产安全构成了极大的威胁。根据国际森林发展组织的统计,全球每年因森林火灾造成的经济损失高达数百亿美元,甚至在某些年份,火灾损失占到某些国家国民经济总量的相当一部分。因此,开展高效的森林火情监测与早期预警工作显得尤为重要。随着科技的发展,无人机作为新兴的监测工具,以其高效、灵活和经济的特点在森林火灾监测领域展现出了巨大的潜力。

2502_92579126的博客 1212

ES6个人笔记记录——数组解构

function* fibs(){ let a = 0; let b = 1; while(1){ yield a; [a,b] = [b, a + b]; } } let[first,second,third,fourth,fifth,sixth] = fibs(); console.log(sixth); let [a,b] = [3,4]; console.log(typ...

whmJack的博客 7万+

lammps案例:聚乙烯和石墨烯界面pull out模拟

大家好,我是小马老师。 本文介绍lammps模拟计算界面结合力的一个案例。 本案例参考论文《The interfacial mechanical properties of functionalized graphene- polymer nanocomposites》,对论文作者表示感谢。 模型共分2层,上层为聚乙烯模型,下次为单层石墨烯,模拟过程共分3部分:建模、弛豫、拉伸。 (1)建模 使用MS建立聚乙烯和石墨烯模型,具体方法可参考之前的推文,使用build layer方法建立聚乙烯和石墨烯组合模型,

lammps_jiayou的博客 3495

YOLOv12改进前必看 - YAML模型配置文件详细解读(再也不用担心通道数不匹配) 附网络结构图

YOLOv12的模型配置文件在中,里面包含yolov12的以及的不同大小的模型,本文将详细介绍一下YOLOv12模型文件中各参数的含义。

Limiiiing的博客 3276

3.变量的解构赋值(阮一峰ES6)

只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值。默认值生效的条件是,对象的属性值严格等于undefined。由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。当一个数组成员严格等于undefined,默认值才会生效。对象的属性没有次序,变量必须与属性同名,才能取到正确的值。上面的p只是中间人,如果想用p,怎么办。右边是数值和布尔值,则会先转为对象。对象的解构赋值可以取到继承的属性。解构也可以用于嵌套结构的对象。触发默认值时,才会执行f()变量名与属性名不一致。

我的博客简介 498

STM32 USB键盘实现指南

在STM32上实现键盘功能可以通过USB HID(人机接口设备)协议来实现,使STM32设备能被计算机识别为标准键盘。通过上述步骤,您可以在STM32上实现一个功能完整的USB键盘。关键点包括:正确配置USB HID设备实现键盘矩阵扫描处理按键事件并生成HID报告优化按键响应和消抖处理添加额外功能如宏键和LED反馈这个实现可以作为基础,进一步扩展为游戏键盘、宏键盘或特殊输入设备。

suny8的专栏 969

ES6学习笔记2:变量的解构赋值

目录 文章目录解构定义数组的解构赋值基本用法嵌套使用不完全解构设置默认值对象的解构赋值对象的解构赋值和数组解构赋值的区别基本用法嵌套使用复杂的嵌套设置默认值字符串的解构赋值数值和布尔值的解构赋值函数参数的解构赋值基本用法设置默认值圆括号的问题不能使用圆括号的情况变量声明语句函数参数赋值语句的模式可以使用圆括号的情况赋值语句的非模式部分,可以使用圆括号用途交换变量的值从函数返回多个值函数参数的定义提...

W先生 445

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ES6学习笔记2-变量的解构赋值

数组的解构赋值 let [a,b,c] = [1,2,3]; a //1 b //2 c //3 模式匹配,只要等号两侧模式相同,左边的变量就会被赋予对应的值。 解构不成功,变量的值等于undefined 解构可以嵌套; 右边不是可遍历的结构,将会报错; 只要某种数据结构具有Iterator结构,即可使用数组形式的解构赋值; 解构赋值允许使用默认值;若数组成员不严格等于(!===)undefi...

Leo的博客 261

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

2、变量的解构赋值 —ES6学习笔记

基本概念 本质上是一种匹配模式,只要等号两边的模式相同,那么左边的变量就可以被赋予对应的值。解构赋值主要分为: 1 数组的解构赋值 2 对象的解构赋值 3 基本类型的解构赋值举个例子,比如我们要声明let a = 1; let b = 2; let c = 3;现在有了解构赋值以后,我们完全可以这样写let [a,b,c] = [1,2,3]; console.log(a,b,c); //

xyphf的博客 391

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ES6学习笔记1-2——新的声明方式和变量的解构赋值

学习资料来源 文章开头感谢技术胖的知识分享! 一、新的声明方式 1、let局部声明: 同var用于声明变量,但是只在声明的区块内起作用,无法变量提升,可以用于防止数据污染。 2、const局部声明: 用于声明常量变量,声明后不可修改;只在区块内起作用,无法变量提升,声明时须赋初值。 二、变量的解构赋值 1、数组的结构赋值 let a = 1; let b = 2; let c = 3; 等同于 let [a,b,c] = [1,2,3]; 注: 1)、等号左侧的数组与等号右侧的赋值形式须统一: le

weixin_46677736的博客 151

ES6 变量的解构赋值

而对象的属性没有次序,变量必须与属性同名,才能取到正确的值,否则解构失败就是。ES6 允许按照一定模式,从数组和对象中快速提取成员,对变量进行赋值,这被称为解构赋值。其本质是,只要等号两边的模式相同,左边的变量就会被赋予对应的值。在 ES6 中,允许从数组中提取值,按照对应位置对变量赋值。const F4 = ['小沈阳', '刘能', '赵四', '宋小宝'];list: ["贾玲", "沈腾", "···"],data: { list }, // 可以解构下一级数据。// 对应的值为null。

奋斗的小前端 1702

【ES6】变量的解构赋值

【ES6】变量的解构赋值 ES6,全称为ECMAScript6。ES6与js的关系是:前者是后者的规格,后者是前者的实现。换句话说,ES是js的国际化版本,js是ES的子集。 一、什么叫解构赋值?         ES6允许按照一定的模式,从数组或者对象中提取值,对变量进行赋值,这被称为解构(Destructuri...

十一月廿七风雨大作 7324

【ES6】解构赋值

文章目录一、解构赋值二、解构数组1. 变量赋值2. 交换变量3. 默认值4. 不完全解构5. 解构数组嵌套6. 与`...`运算符结合使用三、解构对象1. 获取成员2. 对象赋值3. 默认值4. 解构嵌套对象四、解构函数1. 函数的参数2. 函数返回值四、其他解构1. 字符串3. 其他数据类型 一、解构赋值 解构赋值:主要用来从数组和对象中提取值,对变量进行赋值。 []:是专门解构数组使用的 {}:是专门解构对象使用的 二、解构数组 1. 变量赋值 ES6之前的写法: var a1 = 1,b1 =

qq_45677671的博客 6724

浅谈ES6变量解构,即解构赋值

解构赋值语法是一种 JS表达式。ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。通过解构赋值, 可以将属性/值从对象/数组中取出,赋值给其他变量。        在ES6解构赋值出现之前,我们需要为变量赋值的时候,只能直接指定值。      &n...

huangfuyk.的博客 3836

ES6新特性:变量的解构赋值

介绍了ES6新特性之变量的解构赋值,包括数组的解构赋值和对象的解构赋值。

孙悟空 3010

3.es6之变量的解构赋值

ES6解构:es6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称之为解构1.数组的解构赋值var [a,b,c] = [1,2,3]; console.log(a);//1 console.log(b);//2 console.log(c);//3 //本质上这种写法属于‘模式匹配‘,只要等号两边的模式相同,左边的变量就会被赋予对应的值 let [foo,[bar]] = ["111

qq_36846234的博客 8418

ES6---变量的解构赋值

你好,我是小白Coding日志,一个热爱技术的程序员。在这里,我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客,一起在技术的世界里探索前行吧!看这篇文章前先问一个问题:为什么要使用变量解构赋值?它一般在什么场景下使用?

技小白的博客 891

ES6 变量的解构赋值详解

文章目录变量的解构赋值1.0 数组的解构赋值1. 基本用法2. 解构赋值默认值2.0 对象的解构赋值上面代码中,`foo`是匹配的模式,`baz`才是变量。真正被赋值的是变量`baz`,而不是模式`foo`2.1 对象的嵌套解构3.0 字符串的解构赋值4.0 函数参数的解构赋值5.0 解构赋值的用途1. 交换变量的值2. 从函数返回多个值3.函数参数的定义4. 输入模块的指定方法Summary4. 输入模块的指定方法Summary 变量的解构赋值 1.0 数组的解构赋值 1. 基本用法 ES 6 允许

yangyang_A的博客 920

ES6之变量的解构赋值

ES6之变量的解构赋值数组的解构赋值基本用法默认值对象的解构赋值 数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 以前,为变量赋值,只能直接指定值。 var a = 1; var b = 2; var c = 3; ES6允许写成下面这样。 var [a, b, c] = [1, 2, 3]; 上面代码表示,...

TSORA-C的博客 1260
上一篇: ES6学习笔记1 let 和 const
下一篇: ES6学习笔记3 字符串的扩展
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值