ES6-4/5 解构赋值、函数默认值、数组解构、对象解构

在这里插入图片描述

ES-4 解构赋值、函数默认值、数组解构、对象解构
ES-5 隐式转换、函数参数解构、解构本质、()用法

一 解构赋值

1 虚值

  • 含义:在Boolean转换结果为假的值falsy

2 函数默认值

ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。(默认值如果是函数,当非undefined的情况,函数不会执行,只有在用到的时候,才会求值。)

// es5写法
function foo(x, y) {// x = x || 1;// y = y || 2;// 以上写法,遇0出bug// 计算类型的,要取得正确结果,要考虑0的情况,应如下if (x !== 0) {x = x || 1;}if (y !== 0) {y = y || 1;}console.log(x + y);
}

以上计算,更人性化的写法应当是将null也转为0

// es6写法 能计算正确结果
function foo(x = 1, y = 2) {console.log(x + y)
}
// 转译es5
"use strict";function foo() {var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;console.log(x + y);
}
// null的时候,涉及到隐式类型转化Number(null)为0
let x = 1;
function foo(x = 2) {let x = 2; // 报错// Identifier 'x' has already been declared.console.log(x)
}
foo()
let x = 1;
function foo(y = x) {console.log(y) // 1
}
foo()

不要和for循环的父子级作用域搞混了,函数形参和函数体属于同一作用域。

在这里插入图片描述

  • 现象
function foo(x = x) {console.log(x) // 无实参时报错,TDZ 
}
foo()
let x = 1;
function foo(x = x) {console.log(x) // 无实参时报错,2
}
foo(2)
// 不报错!
function bar(x = 2, y = x) {return [x, y];
}
bar(); // [2, 2]

注意

var w = 1, z = 2;
function foo(x = w + 1, y = x + 1, z = z + 1) {// 报错地方在z// Uncaught ReferenceError: Cannot access 'z' before initializationconsole.log(x, y, z)
}
foo()
  • 形参默认值 - 惰性求值,不缓存,每次都重新计算
let a = 99;
function foo(b = a + 1) {console.log(b)
}
foo() // 100
a = 100
foo() // 101

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 在项目中的应用
    在这里插入图片描述

3 数组解构

  • 模式匹配(结构化赋值)
  • 解构失败时,结果为undefined
  • 不完全解构:提供的值比需要解构的变量多
  • 变量给默认值+解构
let [a = 6] = [1]
console.log(a) // 1
let [a = 6] = []
console.log(a) // 6
// 解构失败,模式不匹配
let [a = 6] = {} // 报错
// {} is not iterable
console.log(a)
let [a, b = 6] = [1, undefined]
console.log(a, b) // 1 6
let [a, b = 6] = [1, null]
console.log(a, b) // 1 null
let [a = 1, b = a] = []
console.log(a, b) // 1 1
let [a = 1, b = a] = [2]
console.log(a, b) // 2 2

4 对象解构

let firstName = 'Jessica';
let lastName = 'Jung';
let superIdol = {[firstName + lastName]: 'owner of e&b'
}
console.log(superIdol)

在这里插入图片描述
在这里插入图片描述

  • 解构语句的语法报错:认为等号左边是语法块
    在这里插入图片描述

  • ()变成表达式
    在这里插入图片描述
    在这里插入图片描述

  • 声明变量时不要乱加括号

[(b)] = [3];
console.log(b); // 3
({a:(b) = {}}) // 本身没有进行匹配,而是默认值
console.log(b); // {}
  • 变量值互换
let a = 1, b = 100;
[a, b] = [b, a]
console.log(a, b) // 100 1

在这里插入图片描述

5. 解构本质

事实上,只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值。

  • 变量的解构就是变量的赋值
  • 模式匹配可以匹配同源属性
    在这里插入图片描述
var x = 200, y = 300, z = 100;
var obj1 = {x: {y: 42},z: {y: z}
};
({ y: x = { y: y } } = obj1);// x = {y: y} → x = {y: 300}
({ z: y = { y: z } } = obj1);// y = {y: z} → y = {y: 100} 
({ x: z = { y: x } } = obj1);// z = {y: 42}console.log(x.y, y.y, z.y) // 300 100 42
function test([x, y]) { // 报错// Uncaught TypeError: undefined is not iterable (cannot read property Symbol(Symbol.iterator))console.log(x, y) 
}
test()
function foo({ x = 10 } = {}, { y } = { y: 10 }) {console.log(x, y)
}
foo() // 10 10
foo({}, {}) // 10 undefined
foo({x: 2}, {y: 3}) // 2 3

注意

({ x = 10 } = {});
// ({ x: x = 10 } = {}); 以上是属性和变量相同时的es6写法
({ y } = { y: 10 });
// ({ y: y } = { y: 10 });
console.log(x, y); // 10 10

6 解构的隐式转换

  • 字符串隐式转换类数组
const [a, b, c, d, e] = 'hello'
console.log(a, b, c, d, e) // h e l l o
let {length: len} = 'hello'
console.log(len) // 5
  • 数字类型/布尔值隐式转换为包装类
    在这里插入图片描述

解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。

7. 对函数length属性的影响

  • 当函数形参给默认值时,从当前位置及之后都不计入length(形参个数)的计算
  • 也就是说,指定了默认值后,length属性将失真。
  • 这是因为length属性的含义是,该函数预期传入的参数个数。某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。同理,后文的 rest 参数也不会计入length属性。
function test(a, b, c = 0) {
}
console.log(test.length) // 2
  • 如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了。
function test(c = 0, a, b) {
}
console.log(test.length) // 0
  • 形参实参的映射关系不再成立

8. 函数默认值与作用域

相当复杂的一系列例子

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

springboot之session、cookie

1- 获取session的方案 session: https://blog.csdn.net/yiifaa/article/details/77542208 2- session什么时候创建? 一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用HttpServletRequest.getSession(true)这样…

echarts --- 多折线图按段显示颜色规则订制

描述: 图中有4个序列,序列1和序列2在同一个x轴下,显示不同的颜色.(如,在-40到-30,序列一是红色,而序列2是黑色) 关键: VisualMap中的seriesIndex属性(根据不同的系列,制定不同的颜色规则). 下面是代码,可以直接复制到 echart实例 中进行调试 var symbolSize 20; var data [[…

Git-分布式版本控制系统

一、版本控制 版本控制系统是记录若干文件内容变化,以便将来查阅修订特定版本或还原部分文件的系统 分为:集中式版本控制系统(svn)简称cvcs 都有一个单一集中管理服务器,保存所有文件修订版本,开发人员通…

ES6-6 - this指向、箭头函数基本形式、rest运算符

一 chrome断点调试 观察函数调用栈 // 25min var x 1; function foo(x, y function () { x 2; console.log(2) }) {var x 3;y();console.log(x) } foo() console.log(x) // 2 3 1var x 1; function foo(x, y function () { x 2; console.log(x) }) {x 3;y();console.…

【二分答案】Problem C:木材加工

Problem C:木材加工 Time Limit:1000MS Memory Limit:65536K Total Submit:48 Accepted:20 Description 【问题描述】 木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头(木头有可能有剩余),需要得到的小段的数目是…

vue --- vue.js实战基础篇课后练习

练习1:在输入框聚焦时,增加对键盘上下键按键的支持,相当于加1和减1 练习2:增加一个控制步伐的prop-step,比如设置为10,点击加号按钮,一次增加10 思路: // 考虑到子模板的复用性,即在父模板中复用如下: <input-number v-model"value" :max"10" :min&qu…

js打字效果

//文字依次出来效果 $.fn.autotype function() {var $text $(this);// console.log(this, this);var str $text.html(); //返回被选 元素的内容var index 0;var x $text.html();//$text.html()和$(this).html()有区别var timer setInterval(function() {//substr(index, …

ES6-7 - 箭头函数的实质、箭头函数的使用场景

箭头函数返回对象 // 这种情况要要用(),否则会将对象的{}解释为块 const fn (a, b) > ({a:1, b:2})箭头函数的特点 this指向由外层函数的作用域来决定&#xff0c;它本身没有this&#xff0c;不能通过call、apply、bind改变不能作为构造函数使用不可以使用arguments对象&…

mybatis比hibernate处理速度快的原因

mybatis:是面向结果集的。当要展示的页面需要几个字段时&#xff0c;springmvc会提供这几个字段并将其拼接成结果集&#xff0c;在转化为相应的对象。 hibernate&#xff1a;是面向对象的。要展示的页面需要某些字段时&#xff0c;会将所有字段都查出来&#xff0c;在转化为相应…

zabbix 从入门到精通

https://www.cnblogs.com/clsn/p/7885990.html 转载于:https://www.cnblogs.com/learningJAVA/p/8376589.html

javasript --- 一个日期规范(x秒前,x分前...)

Time函数(通俗易懂,自己根据实际需求修改吧- -) // time.js var Time {// 获取当前时间戳getUnix: function () {var date new Date();return date.getTime();},// 获取今天0点0分0秒的时间戳getTodayUnix: function () {var date new Date();date.setHours(0);date.setMin…

ES6-8 - 函数名/对象拓展、描述符、getter/setter

函数名 有两种特殊情况&#xff1a;bind方法创造的函数&#xff0c;name属性返回bound加上原函数的名字&#xff1b;Function构造函数创造的函数&#xff0c;name属性返回anonymous。 bind函数名 // 以bound开头 function foo() { } const fnName foo.bind().name console.lo…

javascript --- 再识闭包

看下面一个例子: function zipCode(code, location) {let _code code;let _location location || ;return {code: function () {return _code;},location: function() {return _location;}} }再上述封闭的函数中,code的匿名函数根据作用域链可以访问到外面的_code变量. con…

iframe.contentWindow介绍

一、在使用iframe的页面&#xff0c;要操作这个iframe里面的DOM元素可以用&#xff1a; contentWindow、contentDocument(测试的时候chrome浏览器&#xff0c;要在服务器环境下) 1、先获取iframe里面的window对象&#xff0c;再通过这个对象&#xff0c;获取到里面的DOM元素 例…

ES6-9 对象密封4种方式、assign、取值函数的拷贝

一 对象密封 1 Object.preventExtensions 禁止对象拓展&#xff0c;仍可删除 严格模式下报错 const origin {a: 1 } const fixed Object.preventExtensions(origin) console.log(origin fixed) // true console.log(Object.isExtensible(origin)) // false 不可拓展 orig…

MySQL入门命令

我主要是在维护OpenStack云平台的时候会涉及MySQL数据库的操作&#xff0c;这里就跟大家分享一下常用的简单命令&#xff0c;也为自己做个小练习。 1.登录MySQL数据库 mysql -h localhost -u root -p 123456 其中&#xff0c;-h&#xff1a;mysql服务器的IP地址或主机名&#x…

【模板】分块

题意简述 已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 1.将某区间每一个数加上x 2.求出某区间每一个数的和 题解思路 对于一个长度为n的序列&#xff0c;我们可以讲其中的元素分为\( \sqrt{n} \) 个连续的子序列&#xff0c;每块的长度自然就为\( \sqrt{n} \)…

javascript --- 使用ajax与服务器进行通信

Ajax: (Asynchronous JavaScript and XML,异步JavaScript与XML技术)是一种有效利用JavaScript和DOM的操作. 与传统HTTP请求的区别: Ajax允许只更新页面的一部分,因此减少了响应中传输的数据量 Ajax的API: Ajax与服务器进行通信,可以使用JavaScript中原生的XMLHttpRequest对象…

ES6-10 super、4种遍历方式、原型、symbol遍历

由于现代 JavaScript 引擎优化属性访问所带来的特性的关系&#xff0c;更改对象的 [[Prototype]]即__proto__在各个浏览器和 JavaScript 引擎上都是一个很慢的操作。 一 Object原型方法 1 Object.setPrototypeOf(obj, proto) 用该方法而不是直接修改__proto__返回值是设置好原…

IntelliJ IDEA使用

1&#xff1a;下载 ideaIU-2017.2.exe&#xff0c;JetbrainsCrack-2.6.2.jar(补丁) 2&#xff1a;安装ideaIU-2017.2.exe&#xff0c;将补丁放在D:\java\intellij\IntelliJ IDEA 2017.2\bin 目录下 3&#xff1a;在安装的idea下面的bin目录下面有2个文件 &#xff1a; 一个是id…