05-ES6语法:解构赋值

news2024/11/18 1:23:44

本文我们介绍ES6中解构赋值。ES6的解构赋值语法是一种JS表达式。解构赋值语法是一种JS表达式,通过解构赋值,可以将属性/值从对象/数组中取出,赋值给其他变量。

下面我们具体来看看解构赋值是什么?以及是如何使用的?

下面是简单的屏幕分享,不爱看文字的同道中人可以看视频。-_-

一、获取对象属性值

在JS中如何去获取对象的属性值呢?我们还是先看ES6之前的代码是如何实现的。无非是通过点(.)语法或者下标([])的方式来获取对象的属性值,代码分别如下。

通过点语法(.)获取对象的属性值。

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk"
}
console.info(user.userName);
console.info(user.blog);

控制台输出的内容如下图所示:

通过下标([])方式获取对象属性值的代码如下:

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk"
}
console.info(user["userName"]);
console.info(user["blog"]);

可以看到,下标中的字符串,实际上就是属性的名称。这种语法更适合于我们不清楚具体的属性名,或者属性名是动态的情况下。如果属性名本身已经很明确了,还是点语法更简洁些。

当然了,如果与ES6语法比较起来,上面两种玩法都还是显的就没有那么简洁了。接下来,我们看看ES6是如何来获取对象的属性值的?

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk"
}
const {userName, blog} = user;
console.info(userName);
console.info(blog);

上述代码演示了如何通过ES6语法的解构赋值来快速地获取属性值。示例中创建与对象属性名同名的变量,并将对象中同名的属性值分配给新创建的同名变量,大大地减少了许多重复的代码。

至此,我们大概演示了解构赋值最基本的用法:获取对象的属性值。是不是让代码变地更加的简洁,更加的优雅了。

二、获取嵌套对象的属性值

前面我们所看到的示例代码都只是从一个简单的对象中获取属性值,那如果属性值本身就是一个对象,而这个对象的属性值要如何获取呢?解构赋值能做到吗?如何编写代码呢?

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
    details: {
        nickName: "光脚丫思考",
        address: "中国北京",
        signature: "勿以善小而不为,勿以恶小而为之"
    }
}
const { userName, blog, details: { signature } } = user;
console.info(userName);
console.info(blog);
console.info(signature);

输出的结果如下图所示:

上面的示例还是比较简单了些,如果是更深入的对象嵌套怎么办呢?上面的方法还能有效果吗?我们试一试。

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
    details: {
        nickName: "光脚丫思考",
        address: {
            domicileAddress: "户籍地",
            abodePlace: "居住地"
        },
        signature: "勿以善小而不为,勿以恶小而为之"
    }
}
const { userName, blog, details: { signature, address: { domicileAddress, abodePlace } } } = user;
console.info(userName);
console.info(blog);
console.info(signature);
console.info(domicileAddress);
console.info(abodePlace);

输出结果如下图所示:

可以看到,深层次的嵌套的对象也是可以通过解构赋值来获取属性值的,再深层次的也是可以正常获取的,有兴趣小伙伴们可以自己动手尝试下。

三、设置默认值

如果我们预期某个属性是会包含属性值的,但是由于某种原因最后没有包含属性值,比如某些状态值为空的情况下,解构赋值是否可以设置一个默认值呢?答案是肯定的。示例如下:

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
    status: "online"
}
const { userName, blog, status } = user;
console.info(userName);
console.info(blog);
console.info(status);

如上的代码所示,按照我们的预期,正常情况下status会返回一个值,表示当前用户的登录状态,代码输出结果如下:

输出的内容一切如常。但是,在某种特殊或意外的情况下,比如后端写接口的大侠忘记返回这个状态的值了,除了让后端的大侠正确的补充上这个状态值以外,我们还可以给它设置一个默认值,比如默认值离线状态offline。代码如下:

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
    status: undefined
}
const { userName, blog, status = "offline" } = user;
console.info(userName);
console.info(blog);
console.info(status);

请留意user.status属性值是undefined了,我们假定后端返回的结果出现了这样的情况,但是在我们解构赋值的代码中增加了一个offline的默认值,控制台上的输出结果如下:

可以看到,在没有获取到相应属性值的情况下,使用了解构赋值中的默认值。

另外一种情况就是直接就没有这个属性,缺少这个属性,设置默认值的办法同样好使,示例代码如下:

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
}
const { userName, blog, status = "offline" } = user;
console.info(userName);
console.info(blog);
console.info(status);

请注意上面的user已经没有包含status属性了,输出的结果仍然包含了解构赋值中设定的默认值。

漂亮!无论是返回的属性值为undefined,还是直接把这个属性值干没了,解构赋值设置的默认值都很好使,具体的使用场景大家自行挖掘和体会。

在使用默认值的时候,应该注意区分undefined和null,只要undefined的时候才会使用设置的默认值,null是不会使用默认值的。如下代码所示:

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
    address: undefined,
    signature: null,
}
const { userName, blog, address = "中国北京", signature = "默认签名信息" } = user;
console.info(`userName=${userName}`);
console.info(`blog=${blog}`);
console.info(`address=${address}`);
console.info(`signature=${signature}`);

请留意address属性值为undefined,而signature则为null,输出的结果如下图所示:

可以看到address使用的是设置的默认值,而signature的值则继续保留为null了。

四、使用别名

另外一个使用解构赋值必须得面临的一个问题:变量命名冲突的问题,该如何解决呢?

前面的那些示例代码中,解构赋值中的变量名和对象中的属性名是完全一致的,如果已经定义了同名的变量该怎么办呢?岂不是会发生命名冲突的情况。此时,使用别名就能很好的解决这个问题了。示例代码如下:

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
}
const { userName: name, blog: url } = user;
console.info(name);
console.info(url);

在上面的代码中,我们将user.userName的属性值赋值给了name变量,将user.blog的属性值赋值给了url变量。通过别名的方式,就不需要强制要求解构赋值中的变量名和对象中的属性名

完全一致了,这就大大地增加了灵活性,也能很好的解决命名冲突的问题。

五、定义新变量

解构赋值还可以基于对象的属性值创建新的变量,还是先来看一个示例:

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
}
const { userName, blog, message = `我是${userName},我的博客地址是:${blog}` } = user;
console.info(userName);
console.info(blog);
console.info(message);

请留意上面的代码,解构赋值中的message变量并非user对象的某个属性名称,而是由变量userName和blog拼接到一起的字符串变量。

这里使用到了ES6的字符串的方式拼接的字符串,如果还不太了解这个技术的,可以移步到我的另外一篇博文《03-ES6语法:模板字面量(Template Literals)》。

上述代码的输出结果如下图所示:

需要特别强调一点的是,新定义的变量message中使用到的userName和blog并非user中的属性名,而是解构赋值中定义的userName和blog,这2个变量接收了user对象中同名的属性值。

因此,如果我们把解构赋值中的userName和blog移除掉的话,代码就废掉了。

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
}
const { message = `我是${userName},我的博客地址是:${blog}` } = user;
console.info(message);

上述代码在控制台中直接报错了,错误如下:

如果使用别名的方式就能更加说明这一点了。

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
}
const { userName: name, blog: url, message = `我是${name},我的博客地址是:${url}` } = user;
console.info(name);
console.info(url);
console.info(message);

上述的代码中,新定义的变量message中拼接的变量名称就是别名,而并非user对象中的属性名,表明它所使用的是解构赋值中定义的变量名,而并非对象中的属性名。

六、动态名称属性

在实际的开发过程中,我们通常会通过接口API来获取数据,而这些数据不仅仅内容是动态的,甚至对象的属性键名也是动态的,再或者我们一开始连属性的名称都可能不知道。这样的属性值要如何获取呢?如果不使用解构赋值,可以通过下标[]的方式来获取属性值,那解构赋值又是如何做到的呢?请看示例。

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
};
function getValue(data, key) {
    const { [key]: value } = data;
    return value;
}
let userName = getValue(user, "userName");
let blog = getValue(user, "blog");
console.info(userName);
console.info(blog);

重点放到getValue(data,key) 函数上,其中最为重要的代码如下:

const { [key]: value } = data;

可以看到,解构赋值代码也是通过下标[]的方式来获取对象的属性值的,下标中key的内容就是属性的名称。

有了这项技术,基本上属性的名称可以成为动态的,可以通过参数来传递,无论是明确的属性名,还是后续动态传递过来的属性名,都能轻松的从特定对象中获取该属性的属性值。

七、函数中的解构赋值

1、解构赋值传参

使用对象解构赋值将属性值作为参数传递给函数。

const user = {
    userName: "光脚丫思考",
    blog: "https://blog.csdn.net/gjysk",
};
function display({userName, blog}) {
    let message = `大家好,我是${userName},我的博客地址是:${blog}`;
    console.info(message);
}
display(user);

请特别留意函数的参数定义,使用的就是解构赋值的语法,而在调用的时候,直接传递对象就行。输出的结果如下图所示:

2、解构赋值返回结果

如果函数返回一个对象,可以将属性值直接解构为变量,如下代码所示:

function getUSer() {
    const user = {
        userName: "光脚丫思考",
        blog: "https://blog.csdn.net/gjysk",
    };
    return user;
}
const { userName, blog } = getUSer();
let message = `大家好,我是${userName},我的博客地址是:${blog}`;
console.info(message);

其实这种使用方法也不难理解,本质上来说仍然是从对象中解构赋值,因为,函数返回的就是一个对象,这和我们在函数外面创建的对象没什么不同。

上述代码的输出结果如下图所示:

八、循环中的解构赋值

接下来我们再看看在循环中如何使用解构赋值。示例代码如下:

let users = [
    {
        userName: "光脚丫思考1",
        blog: "https://blog.csdn.net/gjysk",
    },
    {
        userName: "光脚丫思考2",
        blog: "https://blog.csdn.net/gjysk",
    },
    {
        userName: "光脚丫思考3",
        blog: "https://blog.csdn.net/gjysk",
    },
];
for (user of users) {
    const { userName, blog } = user;
    let message = `大家好,我是${userName},我的博客地址是:${blog}`;
    console.info(message);
}

上面的代码中,我们在for循环的内部使用了解构赋值语法,成功的从每个user对象中获取到了userName和blog的数据。输出结果如下所示:

也算是最基本的玩法了,下面的方式则更加的简洁一些。

for ({ userName, blog } of users) {
    let message = `大家好,我是${userName},我的博客地址是:${blog}`;
    console.info(message);
}

在for循环的{}中不包含解构赋值的代码,而是直接放到了()中,输出的结果和前面的代码是一样的。

九、数组解构

先来看一个简单的数组解构赋值的代码,如下:

let [a, b] = [1, 2];
console.info(a);
console.info(b);

上面代码在控制台的输出结果如下图所示:

就像上面的示例一样,数组解构赋值的过程中,只要把每个解构的部分一一对应起来,就可以层层解构赋值。比如下面的代码:

let [a, [b], d] = [1, [2, 3], 4];
console.info(a);
console.info(b);
console.info(d);

请留意[b]这个语句,它对应的是实际数组中的[2,3],因此这个语法解析的便是[2,3]中的元素,因此获得的应该是2这个数值,如下图所示:

我们把上述的代码稍微做点改变,输出的结果就会大不一样。代码如下:

let [a, b, d] = [1, [2, 3], 4];
console.info(a);
console.info(b);
console.info(d);

输出的结果则如下图所示:

可以看到这次的变量b输出的就是[2,3]这个数组了。

十、字符串解构

字符串本身也是一个对象,可以作为对象进行解构赋值。比如下面的代码:

let { length } = 'Welcome you!';
console.info(length);

上述代码实际上解构赋值的是字符串的length属性。

字符串可以当成一个数组解构赋值。如下代码:

let [a, b, c] = "Welcome you!";
console.info(a);
console.info(b);
console.info(c);

输出的结果如下图所示:

 十一、解构规则

ES6的解构赋值遵循一个规则:要左右两边的模式相同,就可以进行合法赋值。如下面的示例代码:

let [a, b, c] = [1, 2, 3];
let [d, [[e], f]] = [1, [[2], 3]];

如果解构不成功,变量值等于undefined,比如下面的代码:

let [a, b] = [1];
console.info(a);
console.info(b);

上述代码输出的结果如下图所示:

十二、其他解构

通过解构赋值,我们可以很容易的把对象的方法赋值给变量。比如下面的代码:

const { log } = console;
log('Welcome you!');

上面的代码中,我们将console.log()函数解构赋值给了log变量,然后就可以直接通过log变量来调用console.log()了。

定义别名的语法在这种情况下同样的适用。代码如下:

const { log:mylog } = console;
mylog('Welcome you!');

上面的代码也能成功被执行,并且在控制台输出对应的内容,如下图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Bootstrap——制作个人简历网页、工具类【边框(添加、删除、颜色、圆角)、清除浮动、颜色(文本、链接、背景)、display属性、浮动、定位、文本对齐】

制作个人简历网页 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><meta name"viewport"content"widthdevice-width,initial-scale1,minimum-scale1,maximum-scale1,u…

移动端H5网页开发必备知识

简介 工欲善其事必先利其器&#xff0c;今天这篇文章主要讲解移动端H5开发必备的一些基础知识以及移动端适配和布局方案。如果已经看过这篇文章了或者已经掌握了移动端基础的话可以看笔者写的 移动端H5网页开发常见问题汇总 移动端开发必备知识-Hybrid App 像素 像素即一个…

在Vue中获取DOM元素的实际宽高

最近使用 D3.js 开发可视化图表&#xff0c;因为移动端做了 rem 适配&#xff0c;所以需要动态计算获取图表容器的宽高&#xff0c;其中涉及到一些原生DOM API的使用&#xff0c;避免遗忘这里总结一下。 一、获取元素 在 Vue 中可以使用 ref 来获取一个真实的 DOM 元素。 为了…

【Vue】Vue 项目前端响应式布局及框架搭建

文章目录Vue 项目前端响应式布局及框架搭建一、项目基本结构二、项目分辨率响应式创建1、flexible.js2、引用 flexible 插件3、修改 flexible 默认配置4、cssrem 插件 (px -> rem)三、项目页面框架搭建1、设置背景图2、设置标题文字3、页面主体部分&#xff08;1&#xff09…

Request请求转发getRequestDispatcher

文章目录一、getRequestDispatcher理解二、RequestDispatcher.forward()方法与HttpServletResponse.sendRedirect()方法的区别三、实现步骤1.编写index.jsp登录页面2.编写跳转页面success.jsp页面3.编写LoginServlet.java类四、运行示例一、getRequestDispatcher理解 request.g…

Vue项目使用百度地图api

目录 1.百度开发者认证 2.创建应用 3.引用百度地图API文件 4.展示地图 1.百度开发者认证 进入百度地图开放平台 官网&#xff0c;&#xff08;认证需要身份证号码&#xff0c;人脸识别&#xff0c;手机百度APP&#xff0c;邮箱地址&#xff09; 注册登录完成&#xff0c;…

vue中devTools插件安装教程

vue-devTools 为了更方便的在开发过程中对 Vue 程序进行调试&#xff0c;除了传统的浏览器自带的 debug 工具以外&#xff0c;我们还可以通过一些专门为 Vue 提供的扩展插件来进行调试 vue-devTools插件&#xff1a;点击下载 插件安装教程&#xff1a;https://chrome.zzzmh.cn…

js深拷贝方法

一、ES6中扩展运算符 ES6中的扩展运算符&#xff08;如果只是一层数组或者对象就是深拷贝&#xff0c;多层就是浅拷贝&#xff09; var obj {name : "海绵宝宝",age: 18,sayHello (){console.log("比奇堡早上好");}}var newObj {...obj}console.log(&q…

Vue中的跨域解决方案

前言 跨域是因为浏览器存在对不同源页面数据接收的限制。这种限制就是浏览器的同源策略。 同源策略是浏览器的安全机制&#xff0c;跨域的原理就是通过各种方式避开浏览器的安全机制 使用 在项目开发时&#xff0c;对跨域的概念仅限于了解&#xff0c;所以没有注重过程&#xf…

Vue全新一代状态管理库 Pinia【一篇通】

文章目录前言1. Pinia 是什么&#xff1f;1.1 为什么取名叫 Pinia?1.2. 为什么要使用 Pinia ?2. 安装 Pinia2.1.创建 Store2.1.1. Option 类型 Store2.1.2 Setup 函数类型 Store2.1.3 模板中使用3. State 的使用事项&#xff08;Option Store &#xff09;3.1 读取 State3.2 …

命令行 cnpm install 报错: Install fail Error: Unsupported URL Type: npm:vue-loader@^15.9.7

是不是在 进行 cnpm install 报了同款错误呢&#xff01; G:\Git\owl-read-admin>cnpm install Install fail! Error: Unsupported URL Type: npm:vue-loader^15.9.7 Error: Unsupported URL Type: npm:vue-loader^15.9.7at parseUrl (C:\Users\Lenovo\AppData\Roaming\np…

@DateTimeFormat注解

DateTimeFormat注解 前言 前言在使用DateTimeFormat进行格式化注解时&#xff0c;总是不能匹配前端传入的。格式总是报错 我这里使用的是pattern进行解析的的但是前端是给我传入的ISO类型的导致不能匹配所以总是报错。后来我们进行查看源码得到了答案。 源码解析 看下源码解析…

vue实现在线预览office文件

最近在做电子档案&#xff0c;后端提供了文件的华为云的oss链接。已经实现了点击下载文件的功能。但是呢&#xff0c;他们又希望常规的文件&#xff0c;可以直接点击预览&#xff0c;不需要下载。 按道理说&#xff0c;做文件的在线预览&#xff0c;买个第三方服务什么的&…

前端工程师都在用的 VSCode 常用插件

文章目录前言一、VSCode常用的插件1.Chinese (Simplified) (必备)2.Auto Rename Tag3.One Dark Pro 颜色主题4.格式化代码&#xff08;vscode系统自带&#xff09;5.open in browser 浏览器预览页面6. Live Server 实时预览&#xff08;推荐&#xff09;7. vscode-icons 设置文…

Vue用户管理(增删改查)功能详情

1、最终实现效果&#xff1a; Users.vue: <template><div><!--面包屑导航区域--><el-breadcrumb separator-class"el-icon-arrow-right"><el-breadcrumb-item :to"{ path: /home }">首页</el-breadcrumb-item><el…

Ant Design Vue文件上传详解

ant design 基于vue的文件上传 (XSLX文件篇) Upload 上传 template <a-uploadname"multipartFile":multiple"false":action"action"methods"post"change"uploadFile":file-list"fileList":disabled"di…

Emmet语法总结

1 Emmet简介 Emmet是一个Web开发工具&#xff0c;用于加快HTML和CSS代码的编写速度。使用Emmet能够通过简短的表达式生成HTML或CSS代码片段。另外&#xff0c;截至2022年&#xff0c;主流的编辑器工具如Visual Studio Code、WebStorm都已经集成了Emmet工具&#xff0c;无需手动…

Element-Plus el-col、el-row快速布局

文章目录前言一、el-colspanpush & pull响应式offset二、el-rowgutterjustifyalign总结前言 拖拉了一晚, 总结了一些Layout布局工具的使用方法. 一、el-col 本来打算先说row的… 写完看了一遍感觉还是换过来的好(捂脸). el-col是el-row的子元素. 在el-row添加 style&qu…

学会在Vue项目中插入高德地图JS API与地图的相关设置,看这一篇就够了~(保姆级精简教学)

高德地图API官网&#xff1a;高德开放平台 | 高德地图API。由于博主是基于前端 Vue 框架进行开发的&#xff0c;所以针对地图 JavaScript API 结合 Vue 展开介绍。 目录 一、案例效果 二、开发准备 1. 注册高德开放平台账号 2. 创建应用添加 key 值 三、项目中使用地图组件…

Echart地图组件的使用

1、基本应用&#xff08;中国地图世界地图&#xff09; ​ echarts中想要使用地图首先需要准备地图对应的js文件&#xff0c;js文件可以到github上克隆下来&#xff0c;地址为&#xff1a; https://github.com/Luna829/incubator-echarts &#xff0c;地图的js文件存放在 map/…