ES6简介

一、什么是ES6?

ES的全称是ECMAScript,它是由ECMA国际标准化组织制定的一项脚本语言的语法规范

ES6实际上是一个泛指,泛指ES2015及后续的版本

二、为什么使用ES6?

三、ES6的新增语法
 

1.let

ES6中新增的用于声明变量的关键字

  • let声明的变量只在所处的块级有效,具有块级作用域(一对{}中声明的)
if(true) {
    let a = 10;
}
console.log(a);  //a is not defined

注意:使用let关键字声明的变量才具有块级作用域,使用var声明的变量不具备块级作用域特性

<script type="text/javascript">
		/*
			let关键字就是用来声明变量的

			使用let关键字声明的变量具有块级作用域

			在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的

		*/

		/* -------在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的--------- */
		if (true) {
			var a = 10;
			let b = 20;
		}
		console.log(a);
		console.log(b);


		

	</script>

 

  • 防止循环变量变成全局变量

在我们for循环的时候,如果使用var来声明变量,即使已经循环完了,在for循环的外面还是能访问得到这个计数的变量,如果使用了let(即使let是在for的括号里而不是在{}里,它依然和for的块级作用域绑定),就不能在for循环的外面使用该变量

<script type="text/javascript">
		/*
			let关键字就是用来声明变量的

			使用let关键字声明的变量具有块级作用域

			在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的

			防止循环变量变成全局变量
		*/

		/* -------防止循环变量变成全局变量--------- */
		for (var i = 0; i < 2; i++) {

		}
		console.log(i);

		for (let j = 0; j < 2; j++) {

		}
		console.log(j);

	</script>

 

  • 不存在变量提升 
console.log(a); //a is not defined
let a = 20;

 变量必须先声明再使用

  • 使用let声明的变量具有暂时性死区 
var temp = 123;
if(true) {
    temp = 'abc';
    let temp;
}

在块级作用域中声明的变量就和这个块级作用域进行了绑定 ,不会受外部影响,所以if里面的temp和外面声明的temp毫无关系,在if语句里面先使用temp变量再声明会报错

一旦在块级作用域中声明一个变量,这个变量就会和这个作用域进行绑定,具有暂时性死区

 经典面试题(一)

var arr = [];
for(var i = 0; i < 2; i++) {
    arr[i] = function() {
        console.log(i);
    }
}
arr[0]();  //2
arr[1]();  //2

 当i=0、1时进行循环,将两个函数赋值给数组的第0、1个值,注意,此时的函数没有调用,在整个for循环执行完成,也就是i=2不符合条件的时候,就会去调用两个函数,在函数的当前作用域中,是不存在i变量的,根据作用域链,会继续向上查找,于是去到全局作用域查找,i就是for循环中的计数器i,当前i=2,所以两个输出的都是2

注意:此题的关键点在于变量i是全局的,函数执行时输出的都是全局作用域下的i值

经典面试题(二)

let arr = [];
for(let i = 0; i < 2; i++) {
    arr[i] = function() {
        console.log(i);
    }
}
arr[0]();  //0
arr[1]();  //1

let关键字有块级作用域, 两次循环都会产生块级作用域,里面各有一个i的值,这两个i值相互不影响,因为是不同的作用域,执行函数的时候,在当前块级作用域中没有i,根据作用域链,要继续向上查找,找到的是自己的上一级也就是循环产生的作用域里的i值

2.const 

作用:声明常量,常量就是值(内存地址)不能变化的量

使用const声明的常量具有以下特点:

  • 具有块级作用域
if(true) {
    const a = 10;
}
console.log(a);  //a is not defined

 

<script type="text/javascript">
		if (true) {
			const a = 10;
			if (true) {
				const a = 100;
				console.log(a);
			}
			console.log(a);
		}
		console.log(a);
	</script>

  •  声明常量时必须赋值
const PI; //Missing initializer in const declaration
  •  常量赋值后,值不能修改(实质上是值对应的内存地址不可更改)

对于基本数据类型来讲,一旦赋值,值不可更改,比如数值、字符串类型的值

对于复杂数据类型来讲,不能重新赋值,但是可以更改数据结构内部的值,比如数组、对象

const PI = 3.14;
PI = 100; //Assignment to constant variable.
const ary = [100,200];
ary[0] = 'a';
ary[1] = 'b';
console.log(ary);  //['a','b'];
ary = ['a','b']; // Assignment to constant variable.
const ary = [100, 200];
ary[0] = 'a';
console.log(ary);
ary = [1, 2];

 let、const、var的区别

  1. 使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象
  2. 使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升
  3. 使用const声明的常量,在后面出现的代码中不能再修改该常量的值
varletconst
函数级作用域块级作用域块级作用域
变量提升不存在变量提升不存在变量提升
值可更改值可更改值不可更改

 什么时候使用const?定义了之后一般不改变的值,比如函数值,PI值,或者数学公式中不变的值

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值