es6-let 和 const

1.let

1.1用法:类似var ,但是所声明的变量只在let命令所在的代码块内有效

{

let a = 10;

var b =1;

}

for 循环适合用 let

for( let i = 0; i<arr.length; i+=){ }

console.log( i );    // 这样会报错,i is not defined

对比var

var arr = [];

for( var i=0; i < 10; i++){

arr[i] = function(){

console.log(i);

};

}

arr[6]();    // 10

let

var arr = [ ];

for( let i =0; i<10; i++){

arr[i] = function(){

console.log(i);

};

}

a[6]();    // 6

1.2 TDZ

1.2.1 不存在变量提升,所以一定要先声明后使用

1.2.2暂时性死区 TDZ,简单说就是声明之前该变量都是不可用的

本质是进入当前作用域后,所使用的变量存在了但是不可获取,只有等到声明变量的哪一行代码出现,才可以获取和使用该变量

if( true ){

// TDZ开始

tmp = ‘abc‘;     // 报错

console.log( tmp );    // 这两行都会报错

let tmp;  // TDZ 结束

console.log(tmp);  // undefined

tmp = 123;

console.log(tmp);    // 123

}

1.2.3 由于有TDZ 需要注意typeof

--没有let 之前,typeof 这个是永远不会有报错的情况的

--现在不一样了

typeof a;    // 这样就会报错

typeof b;    // 返回undefined,不会报错

let a;

1.2.4 还是说死区TDZ

function foo( x = y, y = 2 ){

return [x, y];    // 这样会报错,x = y的时候y没有声明

}

foo();

function foo( x = 2, y = x ){

return [x, y];

}

foo();    // [2, 2]  这是ok的

1.3不允许重复声明

以下都是报错的

function(){

let a = 10;

var a = 1;

}

function(){

let a = 1;

let a = 10;

}

function fn( arg ) {

let arg;

}

这样不报错

function fn( arg ) {

{

let arg;    // 不报错

}

}

2. 块级作用域

2.1let就是新增了块级作用域

function f1(){

let n = 5;

if(true){

let n = 10;

}

console.log(n);    // 5, 外层不会受里面的影响

}

2.2 允许任意的嵌套

{{{{{ let aaa = 123 }}}}}

2.3 外层不能读取内层

{{{{

{ let a = ‘123‘}

console.log(a);    // 报错

}}}}

内层作用域可以定义外层的同名变量

{{

let a = ‘hello‘;

{let a = ‘world‘}

}}

取代立即执行函数

//IIFE

(function(){

var tmp = ...;

...

})()

// 块级作用域写法

{

let tmp = ...;

...

}

外层不能调用内部定义的函数

{

let a = ‘secret‘;

function f(){

return a;

}

}

f();    // 会报错

下面这样写可以调用

let f;

{

let a = ‘secret‘;

f = function(){

return a;

};

}

f();    // ‘secret‘

es5中的if for 循环之中是不能声明函数的

es6是ok的,但是,1.大括号不能省略,2.里面声明的函数外面是不可以用的

3. const命令

3.1 声明一个只读的变量,一旦声明,常亮的值就不能改变,所以他声明后必须立即初始化,而不能等到下面在赋值

‘use strict‘     // 需要注意的是 use strict 模式会报错,常规不报错,但是也是无效的

const PI = 3.14;

PI  //  3.14

PI = 3;    // 报错

3.2 特点

const 的作用域和let 命令相同,只在块内有效;

同样没有声明提前,同样存在暂时性的死区,只能在后面使用

同样不可以重复声明

3.3 注意,对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。

所以对象是可变的。

const foo = {};

foo.prop = 123;

foo.prop   // 123    // 之后随便添加属性都ok

foo = {}   // 但是改变指向的话报错

想改变的话,使用Object.freeze( { } );

3.4 es5中有两种声明变量的方法:var 和 function

es6 新增 let,const,import,class;一共六种

4.全局对象的属性

es6开始 var 和fucntion 声明的全局变量依旧是全局对象的属性;

let,const,class命令声明的全局的属性,不属于全局对象的属性,全局变量将逐步与全局对象属性脱钩

时间: 2024-11-05 22:02:54

es6-let 和 const的相关文章

ES6基础之const声明

问题 今天在分析React教程时,观察到如下代码: class Board extends React.Component { constructor(props) { super(props); this.state = { squares: Array(9).fill(null), }; } handleClick(i) { const squares = this.state.squares.slice(); squares[i] = 'X'; this.setState({squares

ES6(二) let const

一:let 1.块级作用域 外层作用域无法读取内层作用域的变量. 2.不存在变量提升 3.TDZ:暂时性死区 "暂时性死区"也意味着typeof不再是一个百分之百安全的操作. 这样的设计是为了让大家养成良好的编程习惯,变量一定要在声明之后使用,否则就报错. 变量没声明和声明不赋值,返回的都是undefined. 总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量. 4.不允许重复声明 5.

es6之 let&amp;const

let 声明了一个块级域的局部变量 const 声明一个块级域的只读的常量 let 和 const 共有的特性: 不存在变量提升 console.log(a); // undefined console.log(b); // Uncaught ReferenceError: b is not defined(-) var a = 1; let b = 2; // 或 const b = 2; 都存在暂时性死区在代码块内,使用 let const 命令声明变量之前,该变量都是不可用的.这在语法上,

es6中let,const区别与其用法

ECMAScript 是什么? 首先,我们都知道JavaScript由三部分组成:ECMAScript,DOM,BOM: 其中的ECMAScript是Javascript的语法规范. ECMAScript定义了很多东西,如: 语法-----解析规则,关键字,语句,声明,操作等 类型-----布尔型,数字,字符串,对象等 原型和继承 内置对象,函数的标准库----------JSON, Math, 数组方法,对象方法等 浏览器兼容: 目前Google和Firefox浏览器对ES6新特性的兼容最友好

ES6 let和const 命令

一.let命令 使用的注意事项: 1.es6新增了let命令,它的用法和var 差不多,但是它声明的变量只在let命令所在的代码块有效 2.不存在变量提升,所以变量要声明后再使用,不然会报错 3.不允许在相同的作用域中重复声明同一个变量,所以也不能在函数里重新声明参数 4.let为js新增了块级作用域,这样就能避免变量的全局污染 4-1.为什么需要块级作用域 1.在es5中,函数作用域:内层变量可能会覆盖外层变量 2.用来计数的循环变量泄露为全局变量 4-2.es6中的块级作用域 1.避免循环变

ES6:let const

es5 声明变量 var variable = value; 存在的问题: 变量提升引起的问题 function get(condition) { if(condition) { var value = 'test'; return value; }else { return null; } } 在JS的预编译阶段,JS引擎会将上面的函数修改如下: function get(condition) { var value; if(condition) { value = 'test'; retur

ES6浅谈--const,数组解构

关于const: 1.const声明的基本类型的值不可重复声明,不可修改,声明之后需要初始化,声明存在暂时性死区,只在声明的块级作用域内有效. 2.const本质上确保的是变量的内存地址的数值不会被改动,所以对于基本类型的值来说,数值在栈中保存,不会被修改:但是对于对象来说,const声明的对象不可以被改变的是内存地址,数据存在堆中,是可以被修改的,如果想不被修改需要freeze. 3.冻结对象后不能新添加属性,但是还可以修改原有属性,所以需要彻底冻结所有属性. 4.浏览器环境下顶层对象和全局对

es6 part 1 //const let

1. let 命令 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1 上面代码在代码块之中,分别用let和var声明了两个变量.然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值.这表明,let声明的变量只在它所在的代码块有效. for循环的计数器,

ES6中的const命令【转】

1.const声明一个只读常量,一旦声明,常量的值就不能改变 1 const PI=3.1415; 2 console.log(PI);//3.1415 3 4 PI=3;//Uncaught TypeError: Assignment to constant variable. 2.const一旦声明常量,就必须立即初始化,不能留到以后赋值 1 const WIDTH;//Uncaught SyntaxError: Missing initializer in const declaratio

ES6中的const命令

1.const声明一个只读常量,一旦声明,常量的值就不能改变 1 const PI=3.1415; 2 console.log(PI);//3.1415 3 4 PI=3;//Uncaught TypeError: Assignment to constant variable. 2.const一旦声明常量,就必须立即初始化,不能留到以后赋值 1 const WIDTH;//Uncaught SyntaxError: Missing initializer in const declaratio