es6的解构是什么意思

es6的解构是什么意思

浏览次数:1054次
信息来源: 银河系资源网
更新日期: 2022-05-13
文章简介

在es6中,解构指的是按照一定的模式从数组和对象中提取值,对变量进行赋值的行为;常见的有对象结构、数组解构和混合解构,是一种将数据结构分解成更小的部分的过程,从而达到简化提取信息的目的。本教程操作环境:w...

在es6中,解构指的是按照一定的模式从数组和对象中提取值,对变量进行赋值的行为;常见的有对象结构、数组解构和混合解构,是一种将数据结构分解成更小的部分的过程,从而达到简化提取信息的目的。

本教程操作环境:windows10系统、ECMAScript 6.0版、Dell G3电脑。

es6的解构是什么意思

destructuring:百度百科的意思是结构分解,ES6 中允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。

开发中比较常见的有对象解构、 数组解构、混合解构。这是一种将数据结构分解为更小的部分的过程,从而达到简化提取信息的目的。

对象解构

传统方法获取对象中的值

let node = {
    type: 'Identifier',
    name: 'foo'
}
console.log(node.type) // Identifier
console.log(node.foo) // foo

使用解构

let node = {
    type: 'Identifier',
    name: 'foo'
}
let { type, name } = node
console.log(type) // Identifier
console.log(name) // foo

如果指定的局部变量名称在对象中不存在,那么这个局部变量会被赋值为undefined

let { type, name, value } = node
console.log(type) // Identifier
console.log(name) // foo
console.log(value) // undefined

当指定的属性不存在时,可以给不存在的属性定义任意的默认值

let { type, name, value = true } = node
console.log(type) // Identifier
console.log(name) // foo
console.log(value) // true

指定新的变量名进行解构赋值

let arr = {
  six: '男',
  age: 19
}
let {six:newSix, age:newAge} = arr
console.log(six, age) // six is not defined
console.log(newSix, newAge) // 男 19

看上面是不是觉得很奇怪,传统对象赋值都是左边四属性,右边是值。但是在解构写法中右边是属性,左边是值,所以新的变量名在右边。

如果使用let、var、const对对象进行解构时,被解构对象的值不能不存在。

不使用var、let、const赋值时,需要将解构语句使用()进行包裹

({type,name} = node);//{}在js中作为代码块,单独使用加等号会报错会报错

嵌套对象解构

在对象嵌套对象中解构,我们会在第一层解构中继续使用花括号来深入下一层进行查找;我们先来看一个栗子:

let node = {
    type: "Identifier",
    name: "foo",
    loc: {
        start: {
            line: 1,
            column: 1
        },
        end: {
            line: 1,
            column: 4
        }
    }
}

上面是一个嵌套对象node,我们先解构第一层

let { loc, type, name } = node // {} Identifier foo

可以看到我们特意打乱了{}中属性的顺序,结果仍然正确输出,所以可以猜到具体的对应方式应该是根据名字来对应的,和顺序无关。

继续解构第二层

let { loc: { start }} = node;
console.log(start.line); // 1
console.log(start.column); // 4

此处我们也可以将start赋值给一个新的自定义的局部变量,假设我们赋值给newStart

let { loc: { start: newStart }} = node
console.log(newStart.line) // 1
console.log(newStart.column) // 4

总结如下:

所有冒号前的标识符都代表在对象中的检索位置,其右侧为被赋值的变量名;如果冒号后是花括号,则意味着要赋予的最终值嵌套在对象内部更深的层级中。

数组解构

数组解构使用的是数组字面量,且解构操作全部在数组内完成,并且数组解构不需要像对象字面量语法一样使用对象的命名属性。

let colors = [ 'red', 'green', 'blue' ]
let [ firstColor, secondColor ] = colors
console.log(firstColor) // 'red'
console.log(secondColor) // 'green'

数组解构语法中,我们主要是通过值在数组中的位置进行选取,且可以将其存储在任意变量中,未显示声明的元素会被直接忽略。

let [ , , thirdColor ] = colors
console.log(thirdColor) // 'blue'

数组解构之变量交换

传统ES5中互换值一般需要引入第三个临时变量作为中转,但如果使用数组解构赋值语法,就不需要在增加额外变量了。

// ES5中互换值:
 let a = 1, b = 2, tmp;
 tmp = a
 a = b
 b = tmp
 console.log(a, b) // 2, 1
 // ES6中互换值
 let a = 1, b = 2;
 [ a, b ] = [b, a]
 console.log(a, b) // 2, 1

嵌套数据解构

 let colors = [ 'red', [ 'green', 'lightgreen'], 'blue' ]
 let [ firstColor, [ secondColor, thirdColor ], fourthColor ] = colors
 console.log(firstColor) // red
console.log(secondColor) // green
console.log(thirdColor) // lightgreen
console.log(fourthColor) // blue

默认值

也可以在数组解构赋值表达式中为数组中的任意位置添加默认值,当指定位置的属性不存在或其值为undefined时使用默认值

let colors = [ 'red' ]
let [ firstColor, secondColor = 'green' ] = colors
console.log(firstColor) // red
console.log(secondColor) // green

不定元素

...为展开运算符我们应该都知道它的用途,操作数组时可以用来把数组展开成字符串。在数组解构中,可以通过...语法将数组中的其余元素赋值给一个特定的变量。

let colors = [ 'red', 'green', 'blue' ]
let [ firstColor, ...restColors ] = colors
console.log(firstColosr) // 'red'
console.log(restColors.length); // 2
console.log(restColors[0]); // "green"
console.log(restColors[1]); // "blue"

数组复制

在ES5中,开发者们经常使用concat()方法来克隆数组

var colors = [ "red", "green", "blue" ];
var clonedColors = colors.concat();
console.log(clonedColors); //"[red,green,blue]"

concat()方法的设计初衷是连接两个数组,如果调用时不传递参数就会返回当前函数的副本

在ES6中,可以通过不定元素的语法来实现相同的目标

let colors = [ "red", "green", "blue" ];
let [ ...clonedColors ] = colors;
console.log(clonedColors); //"[red,green,blue]"

在被解构的数组中,不定元素必须为最后一个条目,在后面继续添加逗号会导致程序抛出语法错误。

混合解构

let err = {
    errors: [
        {
            msg: 'this is a message'
        },
        {
            title: 'this is a title'
        }
    ]
}

上面的代码中,err对象中包含errors,errors又是一个数组又包含新的对象,提取对象中的msg。我们可以将上述栗子一步一步拆开进行解构:

let { errors } = err
let [ firstArr ] = errors
let { msg } = firstArr
console.log(msg) // 'this is a message'
也可以这样解构
let [ , { title }] = err.errors
console.log(title) // 'this is a title'
let [{ msg }] = err.errors
console.log(msg) // 'this is a message'

来看一个更复杂一点的,其实只要会找顺序,这个理解起来还是很简单的。

let node = {
    type: "Identifier",
    loc: {
      start: {
      line: 1,
      column: 1
       }
    },
    range: [0, 3]
};
let {
    loc: { start },
    range: [ startIndex ]
  } = node;
console.log(start.line); // 1
console.log(start.column); // 1
console.log(startIndex); // 0

实际使用- 参数解构

一般用在封装函数参数的情况,如下栗子:

// options 上的属性表示附加参数
function setCookie(name, value, options) {
       options = options || {};
       let secure = options.secure,
       path = options.path,
       domain = options.domain,
       expires = options.expires;
       // 设置 cookie 的代码
}
//可以改写为:对options进行解构并赋予默认值
function setCookie(name, value, { secure, path, domain, expires } = {}) {
// ...
}

【:javascript教程、web前端】

以上就是es6的解构是什么意思的详细内容

标签: 暂无标签
在css3中可实现缩放效果的是什么属性
« 上一篇
css3包含哪些模块
下一篇 »
  • jquery怎么在元素内部增加元素
    594710阅读
    方法:1、用“$(指定元素).prepend(新元素)”或“$(新元素).prependTo(指定元素)”,可在开头增加元素;2、用“$(指定元素).append(新元素)”或“$(新元素).appendTo(指定元素)”,在末尾增加元素。本教程操作环境:...
  • css怎么去除a标签鼠标样式
    296035阅读
    在css中,可用cursor属性去除a标签的鼠标样式,该属性用于定义鼠标指针在一个元素边界范围内所用的鼠标样式,属性值设置为none时,会去除元素的鼠标样式,设置为default时,显示默认箭头样式,语法为“a{cursor:none...
  • react的脚手架是什么意思
    39954阅读
    在react中,脚手架是快速生成项目工程化结构工具的意思;React脚手架能够快速开始一个React的项目,生成一个通用的目录结构,并配置所需环境,其中包含基础的依赖库,只需要利用“npm install”就能够安装,节省了项...
  • 浅析Bootstrap中列表组、分页和进度条组件的用法
    39545阅读
    Bootstrap中怎么实现列表组、分页和进度条?下面本篇文章给大家介绍一下Bootstrap中列表组、分页和进度条组件的用法,希望对大家有所帮助!列表组使用.list-group选择列表组添加.active到 a.list-group-item以指示当...
  • JavaScript有没有stl库
    10026阅读
    JavaScript没有stl库。stl库是标准模板库,是一个具有工业强度的高效的“C++”程序库,用于提供基本的语言本身的数据结构等扩展支持,stl库被容纳与“C++”标准程序库中,因此在JavaScript中没有stl库。本教程操作环...
  • es6的模块导出使用什么方法
    5519阅读
    es6的模块导出使用的方法:1、导出默认模块,一个模块文件只能有一个默认模块,语法为“export default 需要导出的成员”;2、导出普通模块,一个模块文件可以有多个普通模块,语法为“export 按需导出的成员”。本教...
  • css3新增长度单位的使用方法是什么
    4261阅读
    使用方法:1、em表示相对于当前对象内文本的字体大小;2、rem表示相对于根元素的字体大小;3、ch表示数字0的大小;4、vh表示百分比视口的高度;5、vw表示百分比视口的宽度;6、ex表示当前字体的小写x字母的的高度或者...
  • 在css3中可实现缩放效果的是什么属性
    4224阅读
    在css3中可实现缩放效果的是transform属性。transform属性可以和scaleX()函数实现水平方向的缩放效果、可以和scaleY()函数实现垂直方向的缩放效果、可和“scale(x,y)”函数实现水平方向和垂直方向同时缩放。本教程操...
  • 使用javascript:void(0)的原因是什么
    4171阅读
    使用“javascript:void(0)”的原因是:可以防止链接跳转到其他页面,保留链接的样式,并且不让链接执行实际操作。void关键字用于指定要计算一个表达式但是不返回值,“void(0)”也就表示不进行任何操作。本教程操作环...
  • jquery怎么设置文本框只读
    4071阅读
    方法:1、利用“$(input元素)”语句获取文本框元素对象;2、利用attr()方法设置文本框只读,将readonly属性值设置为readonly即可,语法为“文本框元素对象.attr("readonly","readonly")”。本教程操作环境:windows1...

如本文对您有帮助,随意赞赏一下!