ES6(一) let和const

  随着前端技术的逐渐强大,JavaScript从一个简单的脚本语言,迅速的伸出了它的触角,一直延伸到了后端。于是原有的ES3/ES5的语法与规范已经不能适应它的发展了,因此w3c就在2015年推出了js新的语法规范,也就是ECMAScript6,也叫ECMAScript2015,一般简称为ES6。

 一、let

  在ES3和ES5中,JS只有全局作用域和函数作用域,它是没有块级作用域的。任何时候声明变量都是使用var关键字。

  在ES6支持了块级作用域的概念,支撑这个块级作用域的新语法就是新增了let关键字,用来取代var,作为声明具有块级作用域的变量的关键字。

  let本身是否简单,只有2个需要注意的点。

  1.第一个需要注意的点,直接上例子:  

1 function test(){
2     for (let i = 0; i < 5; i++) {
3        console.log(i);
4     }
5     console.log(i);//报错
6 }
7 test();

  这个demo的输出结果如下面的截图

  。  

  本身例子很简单,循环输出0-4,并且在for循环结束后再次访问循环变量i,由于i是用let声明的,这个i就是个块级作用域。第5行代码试图访问i,但是已经超出了i的作用域范围。所以报错。

  但是这里有个疑问,为什么第5行是报错,而不是undefined?

  原因如下:

  1.如果js代码中使用了ES6语法规范,那么该执行环境就是默认的开启了“严格模式”

  2.所谓严格模式,在ES5的时代,就是在你的js代码中,写入了‘use strict’这样的字符串。‘use strict’可以理解为一个指令,它告诉浏览器,我之后的js代码,都要以严格模式的规范来解析。而在ES6中,不需要声明这个指令,就默认使用了严格模式

  3.在严格模式中,如果变量没有声明就拿来使用,就会报”引用异常“的错误:ReferenceError。而不会是undefined。

  2.第2个需要注意的点,直接看例子  

function test(){
    let num = 10;
    let num = 20;
}
test();

  这个例子的执行结果如下图:

  

  这里报的错是,num重复定义了。

  如果使用var声明变量,是不会报错的,后声明的num会把之前声明的num给覆盖了。

  但是使用let就不行了,重复定义变量会报错的。

  以上就是let与var的区别。非常简单,其实习惯了强类型语言的朋友,压根就不会觉得有什么奇怪的,早该如此。。。。

 二、const

  const也是ES6新增的关键字,它是用来声明常量的。与其他语言中的常量一样,const声明的常量,只能在声明时赋值,并且不能重复赋值。它有如下几个需要注意的点。

  1.只能在声明时赋值,所以下面的例子会报错的。  

function test(){
    const stu;
    stu = ‘张明‘;
    console.log(stu);
}

  报错,在使用const声明常量的时候,没有赋值。

  2.const声明的常量也是一个具有块级作用域的。不能跨作用域访问。

function test(){
    {
        const stu = ‘张明‘;
        console.log(stu); //输出 ‘张明‘
    }
    console.log(stu); //报错,stu超出了作用域
}

  这个例子执行时会报stu未声明的错误,原因就是stu是在一对{ }中声明的,于是它的作用域仅限于这个花括号之内。在外部访问stu,虽然它贵为常量,也无法跨作用域访问。

  3.值类型的常量不能二次赋值,但是引用类型的对象,有特例。比如下面的例子。

 1 function test(){
 2     const stu = ‘老张‘;
 3     // stu = ‘老王‘; //报错
 4     console.log(stu);
 5     const student = {age: 18};
 6     student.age = 20; //不会报错
 7     student.name = ‘小赵‘; //不会报错
 8     student = { id: ‘1800123‘, age: 18}; //报错
 9     console.log(student.age);
10 }

  分析:

  1.在第2行声明的stu是一个string类型常量,它是个值类型的,所以如果执行第3行代码,就会报错。

  2.在第5行,声明的student是一个对象,它是引用类型的。所以执行第6、7行代码都不会报错。

  3.但是如果执行第8行代码,就会报错。

  原因是student是1个对象,它是应用类型的,它本身只存了1个地址作为引用,const要求不能二次赋值,第6行和第7行,虽然改变了student所指向的对象的属性,但是并没有改变student作为引用类型变量它本身所存储的那个地址的指向。换句话说,并没有改变student这个常量存储的值。所以第6、7行不会报错。

  反而是第8行,又拿了1个新的字面量对象给student赋值,这就改变了student引用的地址,也就改变了student存储值,所以会报错。

  这个一定要注意。

原文地址:https://www.cnblogs.com/ldq678/p/10325378.html

时间: 2024-08-29 10:18:49

ES6(一) let和const的相关文章

es6学习 -- let和const

在es6中let和const声明的变量都只能在其声明的块级作用域中使用,所谓的块级作用域就是{}这么一对大括号. 为什么需要块级作用域? ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景. 第一种场景,内层变量可能会覆盖外层变量. var tmp = new Date(); function f() { console.log(tmp); if (false) { var tmp = 'hello world'; } } f(); // undefined 上面代码的原

ES6入门-let和const指令

LET: 基本用法:在javascript中声明一个变量通常使用var ,在es6中新增了let指令,用法类似var ,但是let声明的变量只能在所在的代码块有效. ??  使用let声明变量要注意一下几个点: 1,let指令不存在变量提升,所以变量一定要先声明后再使用,否则就会报错. console.info(info); //ReferenceError let info; 2, 存在暂时性死区,也就是说,只要一个块级作用域中使用let声明了某个变量,那么这个变量就被绑定在这个区块了.外界对

es6(一):es6介绍以及let,const

es是js的规范,而js是具体实现 将es6转化为es5代码工具:运用的多的是babel 在线转换地址:babel,traceur(属于谷歌) 1.let申明变量:let其实可以完全取代var,并且没有var这么多副作用 1 { 2 var a = 10; 3 let b = 10;//let申明的变量是块级作用域 4 } 5 console.log(a)//10 6 // console.log(b)//b is not defined let很适合的一种场景是:for 1 for (let

es6基础学习二 const

es5是没用常量声明这个选项,es6将其添加其中. 1.基本用法 const 声明一个只读常量.一旦申明,常量的值就不能改变. const PI = 3.1415; PI = 3; //SyntaxError const 声明的变量,一旦声明必须初始化(即赋值),否则报错. const foo; // syntaxError 除此之外,const的声明常量类似let声明的变量: a> 不存在变量提升 b> 只在声明所在的块级作用域内有效 c> 不能重复用var.let.const声明 e

关于ES6的let,const与var之间的三生三世

首先需要明确的是let.const.var都是用来定义变量的 在ES6之前,我们一般都用var来定义变量,例如 : function test(){ var i=1; console.log(i); console.log(j); var j=2; } test(); console.log(i); 在上面的代码中,我们可以预计到第一个console输出的是1,第二个由于变量提升输出的是undefine,而不是产生ReferenceError错误,第三个输出的还是1:也就是说在函数中定义的一个变

JavaScript ES6 的let和const

1 作用域和提升 1.1 作用域(Scope) 某个变量名或者函数名,在某个程序片段中是否可见或者可访问,如果是,那么这个程序片段就是这个变量名或者函数名的作用域.比如: 1 var name = "Tom"; 2 function getInlibrary(){ 3 var libraryName = "Xinhua"; 4 console.log(name ); 5 console.log(libraryName ); 6 } 7 8 getInlibrary(

es6的let 和const命令

1.不存在变量提升,即变量不可以在声明之前使用,否者会报错(值为undefined). 2.ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域.凡是在声明之前就使用这些变量,就会报错. 3.不允许重复声明. 4.let和const为js新增了块级作用域.(function({}())); 5.const定义常量,对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针. 原文地址:https://www.cnbl

es6(var,let,const,set,map,Array.from())

1.变量声明--var,const,let 1.1 var - (全局作用域,局部作用域)会有变量提升 //第一个小例子 <script> var num = 123; function fn(){ console.log(num); // undefined var num = 46; console.log(num) // 46 } fn() </script> //为什么第一个输出值会是undefined,而不是123呢?因为这里存在着变量名的提升,其实上述语句相当于: &l

ES6中let与const命令详解

阮一峰ES6入门 let 作用域 let命令用来声明变量,但声明的变量只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1 for循环 上图代码中i是var声明的,在全局范围内部有效,所以全局只有一个变量i. 每一次循环,变量i的值都会发生改变,而循环内被赋给数组a的函数内部的console.log(i),里面的i指向的就是全局的i. 也就是说数组a的成员里面的i,指向

ES6 之 let和const、块级作用域

let let 声明的变量只在其所在的代码块内有用 不存在变量提升 只要在会计作用域中存在let命令,它所声明的变量就绑定这个区域 不允许重复声明 ES6块级作用域 外层代码不受内存代码块的影响 ES6规定,在块级作用域之中,函数声明类似于let 允许在块级作用域内声明函数 函数声明会提升到所在块级作用域的头部 const const声明一个只读常量,一旦声明,常量的值就不能改变 只在声明所在的块级作用域内有效 const声明的常量与let命令相同,只在声明所在的块级作用域内有效 const不存