es6数组初始化_ES6常用语法

29cfc95110223eb76131d512e16206d3.png

var、let和const

var是之前就有的了,在这里提出来主要是为了比较其和let与const。

区别

1. 块级作用域

for(var i = 0; i < 3; i++) {setTimeout(() => {console.log(i); // 输出3个3}, 0)}复制代码

解析:变量i是var声明的,在全局范围内是都有效,全局只有一个变量i。每次循环,变量的值会发生改变。循环内的i是指向全局的i。

for(let i = 0; i < 3; i++) {setTimeout(() => {console.log(i); // 输出0, 1, 2}, 0)}复制代码

解析:变量i是let声明的,当前的i只在本轮循环有效,所以每次循环的i其实都是一个新变量。JavaScript引擎内部会记住上一轮的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。

2. 不存在变量提升

console.log(a); // undefinedvar a = 100;复制代码

var命令会发生变量提升现象,即变量可以在声明之前使用,值为undefined;而let纠正了这种行为,不能产生变量提升。

console.log(a); // 报错let a = 100;复制代码

3. 暂时性死区

只要块级作用域内,存在let命令,它所声明的变量就绑定(binding)在这个区域,不再受外部影响。

如:

var temp = 123;if(true) {temp = 'abc'; // 引入错误let temp; }复制代码

在上面中,if后面的大括号内容就形成了一个区域。而temp此时是找不到外层的,因为内部有个temp且你在内部let temp声明前赋值了。

在看一个隐晦的例子:

function bar(x = y, y = 2) {return [x, y]}bar(); // 报错复制代码

在上面的例子中bar里面进行赋值操作的时候,就产生了一个封闭的区域了,可以认为x 和 y通过let声明,可是上面的问题是,x = y的引用在y = 2的声明之前。

可以修正如下:

function bar(y = 2, x = y) {return [x, y];}bar(); // [2, 2]复制代码

4. 不可重复声明

var a = 100;var a = 1000;console.log(a); // 1000复制代码let a = 100;let a = 1000; // 报重复声明错误复制代码

5. ES6声明的变量不会挂在顶层对象

嗯~ES6变量的声明是指哪些声明呢?

指let, const, import, class声明。

而var, function声明是ES6之前的。

所以目前JavaScript有六种声明变量的方式了~

var job = 'teacher';console.log(window.job); // teacher复制代码let job = 'teacher';console.log(window.job); // undefined复制代码

const命令注意点

  1. let可以先声明稍后赋值;而const声明之后必须立马赋值,否则会报错
let a;a = 100; // this is ok复制代码const a; // 报没初始化数据的错误复制代码
  1. const声明了简单的数据类型就不能更改了;声明了引用类型(数组,对象等),指针指向的地址不能更改,但是内部的数据可以更改的
const str = 'this is a string';str = 'this is another string'; // 报了个“给不变的变量分配值”的错误复制代码const obj = {name: 'jia'}obj.name = 'ming'; // this is okobj = {}; // 报了个“给不变的变量分配值”的错误复制代码
8554ec8508d3104c75bc5bf45879de09.png

let和const的使用场景

  1. let使用场景:变量,用以代替var
  2. const使用场景:常量、声明匿名函数、箭头函数的时候。
// 常量const PI = 3.14;// 匿名函数const fn1 = function() {// do something}// 箭头函数const fn2 = () => {// do something}复制代码

变量的解构赋值

解构可以理解就是一个作用:简化你变量赋值的操作。

数组场景

let [name, job] = ['jiaming', 'teacher'];console.log(name); // jiaming复制代码

本质上,这种写法属于模式匹配,只要等号两边的模式相同(重点),左边的变量就会被赋予对应的值。再比如:

let [ , , third] = ["foo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值