ES6关于解构的详细探讨,以及可能会出现的错误

ES6关于解构的详细探讨,以及可能会出现的错误

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

js 复制代码
let {toString: s} = 123;
s === Number.prototype.toString // true

let {toString: s} = true;
s === Boolean.prototype.toString // true
  • undefined和null无法转为对象,以下代码会报错
js 复制代码
let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError

2.字符串的解构赋值,字符串被转换成了一个类似数组的对象

  • 字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
js 复制代码
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
  • 注意是类似数组数组的。
js 复制代码
let {length : len} = 'hello';
len // 5

3.默认值生效的条件是,对象的属性值严格等于undefined。

js 复制代码
var {x = 3} = {x: undefined};
x // 3

var {x = 3} = {x: null};
x // null

上面代码中,属性x等于null,因为null与undefined不严格相等,所以是个有效的赋值,导致默认值3不会生效。

4.不能使用圆括号的情况

以下三种解构赋值不得使用圆括号。

  1. 变量声明语句
js 复制代码
// 全部报错
let [(a)] = [1];

let {x: (c)} = {};
let ({x: c}) = {};
let {(x: c)} = {};
let {(x): c} = {};

let { o: ({ p: p }) } = { o: { p: 2 } };

上面 6 个语句都会报错,因为它们都是变量声明语句,模式不能使用圆括号。

  1. 函数参数
    函数参数也属于变量声明,因此不能带有圆括号。
js 复制代码
// 报错
function f([(z)]) { return z; }
// 报错
function f([z,(x)]) { return x; }
  1. 赋值语句的模式
js 复制代码
// 全部报错
({ p: a }) = { p: 42 };
([a]) = [5];

上面代码将整个模式放在圆括号之中,导致报错。

js 复制代码
// 报错
[({ p: a }), { x: c }] = [{}, {}];

上面代码将一部分模式放在圆括号之中,导致报错。

5.解构原理

解构是ES6提供的语法糖,其实内在是针对可迭代对象的Iterator接口,通过遍历器按顺序获取对应的值进行赋值。而String、Array、Map、Set等原生数据结构都是可迭代对象,可以通过for of循环遍历它。

js 复制代码
如果创建一个数组
const arr=new Array();
console.log(arr [Symbol.iterator])//values() { [native code] }
创建创建一个对象
const obj=new Object();
console.log(obj [Symbol.iterator])//objundefined

根据解释,数组可以正常解构可以理解,但为什么对象没有却也行呢?

通俗的解释

  1. 数据的解构过程:创建数组 -> 遍历迭代器 -> 复制属性
  2. 对象的解构过程:创建对象 -> 枚举属性(OwnPropertyKeys) -> 复制属性,跟迭代器无关
    这也是为什么数组无法解构对象的原因,当然也可以强行解构,无非写个 [Symbol.iterator],当然你也可以把数组的遍历器赋值null玩玩,这回报错,别在项目里坑别人!哈哈
  • 下面直接手写一个 [Symbol.iterator]
js 复制代码
 const obj={0:10,1:112,2:12};
 obj [Symbol.iterator]=function *(){
    yield 10
    yield 112
    yield 12
}

声明时的注意代码块

  • 错误的写法
js 复制代码
let x;
{x} = {x: 1};
// SyntaxError: syntax error

因为 JavaScript 引擎会将{x}理解成一个代码块

相关推荐
小堃学编程6 分钟前
前端学习(1)—— 使用HTML编写一个简单的个人简历展示页面
前端·javascript·html
hnlucky1 小时前
通俗易懂版知识点:Keepalived + LVS + Web + NFS 高可用集群到底是干什么的?
linux·前端·学习·github·web·可用性测试·lvs
懒羊羊我小弟1 小时前
使用 ECharts GL 实现交互式 3D 饼图:技术解析与实践
前端·vue.js·3d·前端框架·echarts
前端小巷子1 小时前
CSS3 遮罩
前端·css·面试·css3
运维@小兵1 小时前
vue访问后端接口,实现用户注册
前端·javascript·vue.js
雨汨1 小时前
web:InfiniteScroll 无限滚动
前端·javascript·vue.js
小盐巴小严2 小时前
正则表达式
javascript·正则表达式
Samuel-Gyx2 小时前
前端 CSS 样式书写与选择器 基础知识
前端·css
天天打码3 小时前
Rspack:字节跳动自研 Web 构建工具-基于 Rust打造高性能前端工具链
开发语言·前端·javascript·rust·开源
AA-代码批发V哥3 小时前
正则表达式: 从基础到进阶的语法指南
java·开发语言·javascript·python·正则表达式