返回顶部
首页 > 资讯 > 精选 >es6解构支不支持字符串
  • 189
分享到

es6解构支不支持字符串

2023-07-04 11:07:51 189人浏览 薄情痞子
摘要

今天小编给大家分享一下es6解构支不支持字符串的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。es6解构支持字符串。ES6允许

今天小编给大家分享一下es6解构支不支持字符串的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

es6解构支持字符串。ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构;通过解构赋值可以将属性值从对象/数组中取出赋值给其他变量。字符串也可以解构赋值,字符串会被转换成了一个类似数组的对象;类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。

es6的解构是什么意思

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

解构赋值语法是一种 javascript 表达式,通过解构赋值可以将属性值从对象/数组中取出赋值给其他变量

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构

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

1. 基本数据类型解构

1-1 字符串解构赋值

字符串也可以解构赋值,字符串会被转换成了一个类似数组的对象

类似数组的对象都有一个length 属性,因此还可以对这个属性解构赋值

// 会将字符串转换成一个类数组对象let [a, b, c, d ,e] = 'hello';console.log(a, b, c, d ,e); // h e l l o// 类数组对象lenth 属性解构let {length : num} = 'hello';console.log(num); // 5

1-2 数值、布尔值解构赋值

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

解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象

数值和布尔值的包装对象都有 toString 属性,变量都能取到值

let {toString: s} = 123;s === Number.prototype.toString // truelet {toString: s} = true;s === Boolean.prototype.toString // true

由于 undefinednull 无法转为对象,所以对它们进行解构赋值,都会报错

let { prop: x } = undefined; // TypeErrorlet { prop: y } = null; // TypeError

2. 数组解构

2-1 基本用法

  • 数组可以变量声明并赋值时解构,也可以在变量先声明后赋值时解构

// 数组可以在变量声明并赋值时解构let arr = ['jsx', 'ljj', 'zdj', 'ddc']let [one, two, three, four] = arr;console.log(one, two, three, four);// jsx ljj zdj ddc// 也可以在变量先声明后赋值解构let name1, name2, name3, name4;[name1, name2, name3, name4] = ['jsx', 'ljj', 'zdj', 'ddc'];console.log(name1, name2, name3, name4);// jsx ljj zdj ddc

2-2 完全解构

  • 只要等号两边的模式相同,左边的变量就会被赋予对应的值

let [one, two, three] = ['html', 'CSS', 'js'];console.log(one, two, three); // html css jslet [str1, [str2], str3] = ['jsx', ['ljj'], 'ddc']console.log(str1, str2, str3); // jsx ljj ddc

  • 数组中不想要的元素也可以使用逗号 , 来忽略

let [, , name] = ['haha', 'xixi', 'jsx'];console.log(name); // jsxlet [, xixi , ] = ['haha', 'xixi', 'jsx'];console.log(xixi); // xixi

  • 当解构一个数组时,可以使用扩展语法 ...,将数组剩余部分赋值给一个变量

let [num, ...numN] = [1, 2, 3, 4];console.log(num); // 1console.log(numN); //  [2, 3, 4]

  • 交换变量值,在一个解构表达式中可以交换两个变量的值

let name1 = 'jsx';let name2 = 'ljj';let name3 = 'ddc';[name1, name2, name3] = [name3, name1, name2];console.log(name1, name2, name3); // ddc jsx ljj

  • 等号右侧可以是任何可迭代对象(具备 Iterator 接口对象或数组)

let [a, b, c] = 'jsx';console.log(a, b, c); // j s xlet [one1, two1, three1] = new Set([1, 2, 3]);console.log(one1, two1, three1); // 1 2 3

2-3 不完全解构

  • 当等号左边的变量只匹配一部分的等号右边的数组,右边的数组多余元素会被忽略

let [one, two] = [1, 2, 3];console.log(one, two); // 1 2let [a, [b], c] = [1, [2, 3], 4]console.log(a, b, c); // 1 2 4

  • 当等号左边的变量数量多于等号右边的数组元素,解构赋值左边多余的变量则为 undefined

let [str1, str2] = ['jsx'];console.log(str1, str2); // jsx undefined

  • 扩展语法 ... 变量解构时匹配不到元素值时返回 [] 空数组

let [str3, ...str4] = ['jsx'];console.log(str3, str4); // jsx []

  • 如果等号的右边不是数组,也不是可迭代对象,那么解构赋值将会报错

let [foo1] = 1;let [foo2] = false;let [foo3] = NaN;let [foo4] = undefined;let [foo5] = null;let [foo6] = {};console.log(foo1, foo2, foo3, foo4, foo5, foo6); // is not iterable

2-4 默认值

  • 数组解构时可以在表达式左边的数组中为任意对象预设默认值

let [name1 = 'jsx', name2 = 'ljj'] = [];console.log(name1, name2); // jsx ljj

  • ES6 内部使用严格相等运算符 === 判断一个位置是否有值,当一个数组缺少的值时,元素严格等于undefined,默认值才会生效

let [num = 123] = [undefined];console.log(num); // 123// null !== undefined meanslet [num1 = 123] = [null];// null严格相等undefined所有默认值无效console.log(num1); // null

  • 如果默认值是一个函数声明,函数声明是惰性求值的,只有在右边没有匹配值时才会执行

function func() {    return 123}let [num2 = func()] = [undefined];console.log(num2)

  • 默认值可以引用解构赋值的其他变量,但该变量必须已经声明

let [str1 = 'jsx', str2 = str1] = [];console.log(str1, str2); // jsx jsx// str4未声明let [str3 = str4, str4 = 'ljj'] = []; // Uncaught ReferenceError

3. 对象解构

3-1 基本用法

  • 基本语法

let {var1, var2} = {var1:…, var2:…}

  • 对象解构赋值与先声明后独立进行解构赋值

let { name, age } = { name: 'jsx', age: 22 };console.log(name, age); // jsx 22// 先声明后独立解构赋值let a, b;// 赋值语句需要通过()包围 因为{}是一个块级而不是字面量({a, b} = {a: 1, b: 2});console.log(a, b); // 1 2

3-2 属性变量同名

  • 对象的属性没有次序,左边的变量必须与对象属性同名,才能取到正确的值

let {name, age} = {name: 'jsx', age: 22};console.log(name, age); // jsx 22

  • 当变量没有对应的同名对象属性时,会导致1取不到值返回 undefined

// 如果解构失败,变量的值等于undefinedlet {a, b} = {a: 'jsx', c: 'ljj'};console.log(a, b); // jsx undefined

3-3 属性变量不同名

  • 当变量名与对象属性名不一致时,可以使用冒号 : 来设置,将对象属性值赋值给 : 冒号后的变量

let {user: name, age: num} = {user: 'jsx', age: 22}console.log(name, num); // jsx 22

  • foo:baz 此时冒号前面 foo 则是匹配模式匹配对象属性,baz 则是匹配属性的值

let {foo:baz} = {name: 'jsx'};console.log(foo); // ncaught ReferenceErroconsole.log(baz); // undefined

  • 先找到同名属性,然后再赋给对应的变量,真正被赋值的是后者,而不是前者

let {name: str, age: num1} = {user: 'jsx', age: 22};console.log(str, num1); // undefined 22

  • 数组对象嵌套解构赋值

let obj = { lesson: ['html', { class: 'css' }] }let { lesson: [x, { class: y }] } = obj;// console.log(x, y); // html csslet { lesson } = obj;console.log(lesson); //  ['html', {…}]let obj1 = {};let arr1 = [];({ foo: obj1.prop, bar: arr1[0] } = { foo: 123, bar: true });console.log(obj1) // {prop:123}console.log(arr1) // [true]

  • 对象的解构赋值可以取到对象继承的属性

let obj2 = {};let obj3 = { user: 'ljj' };Object.setPrototypeOf(obj2, obj3);let { user } = obj2;console.log(user); // ljj

  • 可以使用扩展语法 ... 将对象剩余的属性与值赋值给一个变量

let options = {    title: "Menu",    height: 200,    width: 100};// title = 名为 title 的属性// rest = 存有剩余属性的对象let { title, ...rest } = options;// 现在 title="Menu", rest={height: 200, width: 100}console.log(rest.height);  // 200console.log(rest.width);   // 100

3-4 默认值

  • 对象的解构也可以指定默认值,默认值生效的条件是对象的属性值严格等于undefined

let {name = 'jsx'} = {};console.log(name); // jsx let {name1 = 'jsx'} = {name1: 'ljj'};// 默认值失效 console.log(name1); // ljj// 当对象属性值为undefined时有效let {name2 = 'jsx'} = {name2: undefined};console.log(name2); // jsxlet {x: y = 3} = {x: 5};console.log(y); // 5let {x1 = 3} = {x1: null};console.log(x1); // null

  • 当指定的对象属性不存在时,直接在变量后添加默认值

  • 当指定的对象属性存在,而属性值不存在或者为 undefined 时,先匹配属性再在变量值后添加一个等号 = 和相应的默认值即可

let {user: xm = 'jsx'} = {};console.log(xm); // jsx

4. 嵌套解构

如果一个对象或数组嵌套了其他的对象和数组,我们可以在等号左侧使用更复杂的模式(pattern)来提取更深层的数据

// 数组嵌套let [name, [name1, [name2]]] = ['jsx', ['ljj', ['ddc']]];console.log(name, name1, name2); // jsx ljj ddc// 对象解构let obj = {title: '对象解构',info: {target: '对象',difficulty: {level: 1}}}let {title,info,info: {target,difficulty,difficulty: {level}}} = obj;console.log(title, info, target, difficulty, level);// 对象解构// {target: '对象', difficulty: {…}}// 对象// {level: 1}// 1// 对象数组嵌套let objarr = {message: '对象数组嵌套',lesson: ['html', 'css', 'js'],news: {main: '新消息'}}let {message,lesson,lesson: [item1, item2, item3],news,news: {main}} = objArr;console.log(message, lesson, item1, item2, item3, news, main)// 对象数组嵌套//  ['html', 'css', 'js']// html css js// {main: '新消息'}// 新消息

es6解构支不支持字符串

5. 函数参数解构

一个函数可以有很多参数,其中大部分的参数都是可选的

  • 把所有参数当作一个数组来传递,然后函数马上把这个数组解构成多个变量

function arrFn([name, age]) {    console.log(name, age)}arrFn(['jsx', 22]); // jsx 22

  • 把所有参数当作一个对象来传递,然后函数马上把这个对象解构成多个变量

let obj = {title: "My menu",items: ["Item1", "Item2"]}function objFn({title,items: [item1, item2]}) {console.log(title); // My menuconsole.log(item1, item2); // Item1 Item2}objFn(obj);

  • 可以使用带有嵌套对象和冒号映射的更加复杂的解构

// 语法function({  incomingProperty: varName = defaultValue  ...})let obj1 = {message: '嵌套带冒号',info: {name: 'jsx',lesson: ['html', 'css'],grilfriend: {xm: 'ljj'}}}function complexFn({message,info: {name,lesson: [list1, list2],grilfriend: {xm}}}) {console.log(message); // 嵌套带冒号console.log(list1, list2); // html cssconsole.log(xm); // ljj}complexFn(obj1);

  • 可以通过指定空对象 {} 为整个参数对象设置默认值

function nullFn({info = 'jsx',width = 100,height = 200} = {}) {console.log(info); // jsxconsole.log(width); // 100console.log(height); // 200}nullFn();

6. 圆括号问题

不可以使用圆括号的情况:

  • 变量声明语句,不得使用圆括号

  • 函数参数也属于变量声明,因此不能带有圆括号

  • 赋值语句的模式,将整个模式放在圆括号之中,导致报错

// 声明语句时不能使用圆括号包裹变量let [(num)] = [1];console.log(a); // Uncaught SyntaxErrorlet {(name: str)} = {name: 'jsx'};console.log(str); // Uncaught SyntaxError// 函数参数内也不可以function fn([(a)]) {     console.log(a);}fn(1);  // 赋值语句内不可使用圆括号包裹let a, b;([a, b]) = [1, 2];console.log(a, b) // Uncaught SyntaxError

可以使用圆括号的情况:

  • 赋值语句的非模式部分,可以使用圆括号

let num;[(num)] = [123];console.log(num); // 123let str;({name: str} = {name: 'jsx'});console.log(str); // jsx

7. 解构赋值使用场景

  • 交换变量的值

let name1 = 'jsx';let name2 = 'ljj';[name1, name2] = [name2, name1];console.log(name1, name2); // ljj, jsx

  • 从函数返回多个值

function returnFn() {return {name: 'jsx',age: 22}}let {name,age} = returnFn();console.log(name, age); // jsx 22

  • 函数参数的定义

 function argumentFn([list1, list2]) { console.log(list1); // jsx console.log(list2); // ljj } argumentFn(['jsx', 'ljj']) function argumentFn1({obj}) { console.log(obj); // jsx } argumentFn1({obj: 'jsx'})

let jsonData = {id: 42,status: "OK",data: [867, 5309]};let {id,status,data: number} = jsonData;console.log(id, status, number); // 42 'OK' (2) [867, 5309]

  • 函数参数的默认值

function func({ title = '默认值' } = {}) {    console.log(title)}func(); // 默认值

  • 遍历 Map 结构

const map = new Map();map.set('first', 'hello');map.set('second', 'world');for (let [key, value] of map) {console.log(key + " is " + value);// first is hello// second is world}

  • .entries() 方法进行循环操作

let user = {name: "John",age: 30};for (let [key, value] of Object.entries(user)) {console.log(`${key}: ${value}`);// name: John// age: 30}

  • 输入模块的指定方法

<script type="module">    import {sayHi, sayHello} from './index.js';    sayHi(); // say hi    sayHello(); // say hello</script>
// index.jsexport function sayHi() {    console.log('say hi')}export function sayHello() {    console.log('say hello')}

以上就是“es6解构支不支持字符串”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: es6解构支不支持字符串

本文链接: https://lsjlt.com/news/344424.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • es6解构支不支持字符串
    今天小编给大家分享一下es6解构支不支持字符串的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。es6解构支持字符串。ES6允许...
    99+
    2023-07-04
  • es6支不支持import
    这篇文章主要介绍了es6支不支持import的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇es6支不支持import文章都会有所收获,下面我们一起来看看吧。es6支持import。import语句用于导入由另一...
    99+
    2023-07-05
  • webpack支不支持es6
    这篇文章主要介绍了webpack支不支持es6的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇webpack支不支持es6文章都会有所收获,下面我们一起来看看吧。webpack支持es6。webpack 2支持原...
    99+
    2023-07-05
  • webstorm不支持es6如何解决
    这篇文章主要介绍“webstorm不支持es6如何解决”,在日常操作中,相信很多人在webstorm不支持es6如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”webs...
    99+
    2024-04-02
  • vscode不支持es6语法如何解决
    这篇文章主要讲解了“vscode不支持es6语法如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vscode不支持es6语法如何解决”吧! ...
    99+
    2024-04-02
  • PHP的数组支持字符串下标吗
    PHP的数组支持字符串下标;PHP数组的下标也即索引值可以是一个字符串,也可以是一个数字,下标为字符串的数组为关联数组,是一种具有特殊索引方式的数组,而下标为数字的数组是索引数组,其下标值必须为整数。本文操作环境:Windows10系统、P...
    99+
    2022-08-08
    php
  • idea中es6语法不支持如何解决
    这篇文章主要介绍“idea中es6语法不支持如何解决”,在日常操作中,相信很多人在idea中es6语法不支持如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”idea中e...
    99+
    2024-04-02
  • MySQL中支持哪些数学和字符串函数
    MySQL中支持许多数学和字符串函数,以下是一些常用的函数示例: 数学函数: ABS(x) - 返回x的绝对值 ROUND(x, ...
    99+
    2024-03-06
    MySQL
  • MySQL 4.1+对多字符的支持
    MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次:服务器(serv...
    99+
    2024-04-02
  • mysql5.6 解析JSON字符串方式(支持复杂的嵌套格式)
    目录mysql5.6 解析jsON字符串支持复杂的嵌套格式mysql5.6及以下解析json方法先说一下问题的背景下面是对应的代码 mysql5.6 解析JSON字符串 支持复杂的嵌套格式 废话不多说,先上代码...
    99+
    2022-07-05
    mysqlJSON字符串 mysql5.6解析JSON字符串 解析JSON字符串
  • mysql5.6解析JSON字符串方式(支持复杂的嵌套格式)
    目录mysql5.6 解析JSON字符串支持复杂的嵌套格式mysql5.6及以下解析json方法先说一下问题的背景下面是对应的代码 mysql5.6 解析JSON字符串 支...
    99+
    2024-04-02
  • golang如何使用MarshalText支持非字符串作为key的map
    小编给大家分享一下golang如何使用MarshalText支持非字符串作为key的map,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用 MarshalText支持非字符串作为key的...
    99+
    2024-04-02
  • PHP 求解两字符串所有公共子序列及最长公共子序列 支持多字节字符串
    function public_sequence(string $str1, string $str2): array{ $data = [[-1, -1, '', 0, '']]; // 子序列容器【横坐标 纵坐标 当前子序列 长度...
    99+
    2023-09-01
    php 开发语言
  • MySQL 4.1 字符集支持的原理(转)
    MySQL 4.1 字符集支持的原理(转)[@more@]下面要写的是一篇非常无聊的东西,充斥了大量各式各样的编码、转换、客户端、服务器端、连接……呃,我自己都不愿意去看它,但想一想,写下来还是有点意义的,...
    99+
    2024-04-02
  • JavaScript支持的注释字符有哪些
    本篇内容介绍了“JavaScript支持的注释字符有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • 不支持windows11如何解决
    这篇文章主要介绍了不支持windows11如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇不支持windows11如何解决文章都会有所收获,下面我们一起来看看吧。解决方法:注册表方法: 在进行镜像安装时,...
    99+
    2023-07-01
  • CSS哪些选择符在IE6不支持
    本篇内容主要讲解“CSS哪些选择符在IE6不支持”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS哪些选择符在IE6不支持”吧!IE6不支持的CSS选择符本文...
    99+
    2024-04-02
  • Java中支持的字符编码有哪些
    这期内容当中小编将会给大家带来有关Java中支持的字符编码有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 概述在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB23...
    99+
    2023-05-31
    java 字符编码 ava
  • 怎么查看MySQL中支持的字符集
    要查看MySQL中支持的字符集,可以执行以下SQL语句: SHOW CHARACTER SET; 这条语句将列出MySQL中所有支...
    99+
    2024-04-09
    mysql
  • AMD1600不支持win11如何解决
    这篇“AMD1600不支持win11如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“AMD1600不支持win11如何...
    99+
    2023-07-01
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作