ES6笔记 4.解构赋值、函数默认值、数组解构、对象解构

暂时性死区 TDZ(Temproal Dead Zone)

暂时性死区 TDZ(Temporal Dead Zone),在块级作用域中 let 声明变量,将变量锁住在当前行,并且将变量捆绑到当前的块级作用域内部。

函数参数默认值的问题

falsy(虚值)
falsy 虚值,在通过 Boolean 进行转化的时候,是假的值就是虚值,undefined null 0 NaN false ’ '(空字符串)

函数参数默认值的写法

  1. ES5 函数参数默认值写法
...(a, b){
var a = typeof arguments[0] !== "undefined" ? arguments[0] : 1;
var b = typeof arguments[0] !== "undefined" ? arguments[0] : 2;
...
  1. ES6 函数参数默认值的基本语法
function foo(x = 1, y = 2) {
  console.log(x + y); // 1 + 2
}
foo();

函数参数默认值生效的条件
传入的参数严格等于(===)undefined,函数默认值生效

function foo(x = 1, y = 2) {
  console.log(x + y); // 2 + 2
}
foo(2);

function foo(x = 1, y = 2) {
  console.log(x + y); // 2 + 2
}
foo(2, undefined);

function foo(x = 1, y = 2) {
  console.log(x + y); // undefined + 2
}
foo("undefined", undefined);

函数默认值赋值的作用域相关

先看以下代码

function fn(x = 2) {
  let x = 3;
  console.log(x); // SyntaxError: Identifier 'x' has already been declared
}
fn();
  • 这说明函数括号内和函数大括号内并不是一般形式的父子作用域关系
  • 不能等同于以下
{
  let x = 2;
  {
    let x = 3;
    console.log(x); // 3
  }
}
  • 更接近于以下
{
  let x = 2;

  let x = 3;
  console.log(x); // SyntaxError: Identifier 'x' has already been declared
}

此时再看以下代码

let x = 1;
function foo(y = x) {
  let x = 2;
  console.log(x, y); // 2 1
}
foo();

如果通过刚刚的方式进行划分作用域
以下代码是会报错的

{
  let x = 1;
  {
    let y = x;

    let x = 2;
    console.log(x, y); // ReferenceError: Cannot access 'x' before initialization
  }
}

综上所述,我认为可以这样看:由于 let 不会变量提升,所以使用 let 声明的变量可以看作是代码一开始知道有这个变量,但是没有初始化,代码运行到这一行才初始化的变量,对于没有初始化的变量进行使用是会报出错误 ReferenceError: Cannot access ‘x’ before initialization ,而这仅仅只能解释上面这一段划分作用域的代码,所以对于函数中的划分应该还有别的解释
对于函数中的默认参数,如果出现默认参数变量和函数体中新声明的变量名相同,应当看作默认参数变量在函数执行之前就已经存在,这样就只能在函数外部作用域去寻找默认参数变量

let x = 1;
function foo(y = x) {
  let x = 2;
  console.log(y); // 1 此时 foo(y = x) 中的 x 应该去函数体外部作用域寻找,同时,函数体内不能重复声明变量 y
}
foo();

如果函数中的默认参数变量于形参变量相同,则会出现类似于 let x = x 这样的代码,在运行时由于使用 let 声明,所以在此作用域内 x 是一个新的变量,同时赋值给自己就会出现报错 ReferenceError: Cannot access ‘x’ before initialization

let x = 1;
function fn(x = x) {
  // --> let x = x 在预编译中为 x:undefined 与函数第一行变量声明冲突
  let x = 2; // --> SyntaxError: Identifier 'x' has already been declared
  console.log(x);
}
fn();

惰性求值,每次需要重新计算表达式,如果函数参数的默认值没有生效,则不会计算 a + 1 的值

let a = 99;
function foo(b = a + 1) {
  console.log(b);
}
foo(); // 100
a = 100;
foo(); // 101

解构赋值

模式匹配或者结构化赋值,数组与数组匹配解构,对象与对象解构

let [a, b, c] = [1, 2, 3];
let [d, [e], [f]] = [1, [2], [3]];
let [a, [b, c], [d, [e, f, [g]]]] = [1, [2, 3], [4, [5, 6, [7]]]];

解构失败

  1. 解构失败,变量多了,对应解构的值少了,导致 undefined 进行填充
let [a, [b, c], [d, [e, f, [g]]]] = [1, [2, 3], [, [, 6, [7]]]];
console.log(a, b, c, d, e, f, g); // 1 2 3 undefined undefined 6 7
  1. 不完全解构,值多了,变量少了
let [a, [b, c], [, [, , [g]]]] = [1, [2, 3], [4, [5, 6, [7]]]];
console.log(a, b, c, g); // 1 2 3 7
  1. 解构的默认值:传入的参数严格等于 undefined 时,默认值才会生效,所以存在惰性求值的问题
let [a = 6] = [1]; //a = 1;
let [a, b = 2] = [1]; //(a = 1), (b = 2);
let [a, b = 2] = [1, undefined]; //(a = 1), (b = 2);
let [a, b = 2] = [1, null]; //(a = 1), (b = null);
  1. 默认值给函数
function test() {
  console.log(1);
}
let [x = test()] = [1]; // x = 1;
let [x = test()] = []; // x = undefined;

// 默认值是变量,存在暂时性死区
let [x = y, y = 1] = [];
console.log(x, y); // ReferenceError: Cannot access 'y' before initialization

ES6 的对象赋值加强

ES5:
var name = "zhangsan",
		age = 14;
var person = {
	name: name,
	age: age,
	sex: 'male'eat: function() {
		console.log(1);
	}
}

ES6:
let na = 'na';
let me = 'me';
var person = {
	[na + me]:name,
	age,
	sex: 'male',
	eat() {
	}
}

对象解构

结构是完全一样的两个对象,才可以通过解构进行变量赋值

let  { a:a, b:b, c:c } = { a:1, b:2, c:3 };
console.log( a, b, c); // 1 2 3

// 简写:
let  { a, b, c } = { a:1, b:2, c:3 };
console.log(a, b, c);
  1. 不完全解构,嵌套默认值
let { a = 2, b, c} = { a:1, b:2, c:3, e:4, f:5};
console.log(a, b, c); // 1 2 3
  1. 解构失败
let { a = 2, b, c, d, e, f, g, h} = { b:2, c:3, e:4, f:5};
console.log(a, b, c, d, e, f, g);  // 2  2  3  undefined 4 5 undefined undefined
  1. 数组的解构是存在一个顺序的问题,对象的解构是不存在顺序的
let { a, b, c } = { c:3, b:2, a:1};
console.log(a, b, c); // 1 2 3

let [ a, b, c ] = [ 3, 1, 2 ];
console.log(a, b, c); // 3 1 2
  1. 对象解构赋值重命名,a(属性名):a(变量)
let { a: e, b: f, c: g } = { a: 1, b: 2, c: 3 };
console.log(e, f, g); // 1 2 3


var person = {
		name : "zhangsan",
		age:50,
		son:{
			name:"lisi",
			age: 30,
			son: {
				name:"wangwu",
				age:12
			}
	}
}
var { son:{ son:son1 } } = person;
console.log(son1); // { name:"wangwu", age:12 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的高校科研信息管理系统实现了操作日志管理、字典管理、反馈管理、公告管理、科研成果管理、科研项目管理、通知管理、学术活动管理、学院部门管理、科研人员管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让高校科研信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
ES6数组解构赋值是一种便捷的语法,可以将数组中的元素分配给变量。通过解构赋值,可以轻松地从数组中提取值并将其赋给变量。这种语法可以简化代码,并使代码更易于理解和维护。 使用数组解构赋值,可以按照特定的顺序将数组中的元素赋值给变量。例如,如果我们有一个包含三个元素的数组[1, 2, 3],我们可以使用解构赋值将每个元素分配给对应的变量。代码示例如下: const arr = [1, 2, 3]; const [a, b, c] = arr; console.log(a, b, c); // 输出1, 2, 3 在上面的代码中,我们定义了一个名为arr的数组,并使用解构赋值数组中的第一个元素赋值给变量a,第二个元素赋值给变量b,第三个元素赋值给变量c。最后,我们将这些变量的值打印出来。 需要注意的是,解构赋值的顺序与数组中元素的顺序有关。换句话说,解构赋值的左边的变量必须与数组中的元素的顺序相对应。如果解构赋值的变量数目少于数组中的元素数目,那么多余的元素将被忽略。如果解构赋值的变量数目多于数组中的元素数目,那么多余的变量将被赋值为undefined。 此外,需要注意的是,解构赋值只能用于具有Iterator接口的数据结构。这意味着,只要数据结构具有Iterator接口,就可以使用数组形式的解构赋值来提取值。 总结来说,ES6数组解构赋值是一种方便的语法,可以将数组中的元素分配给变量。它可以简化代码,提高代码的可读性和可维护性。通过数组解构赋值,可以按照特定的顺序将数组中的元素赋值给变量,并且解构赋值只能用于具有Iterator接口的数据结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ES6数组对象解构赋值详解](https://download.csdn.net/download/weixin_38621870/12940725)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [ES6-----数组解构](https://blog.csdn.net/zhouzhou20002000/article/details/128325411)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [ES6 数组解构学习](https://blog.csdn.net/QY_99/article/details/126279215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值