let基本用法
ES6了新增let
命令,用来声明变量。它的用法类似var
,但是所声明的变量,在只let
命令所在的代码块内有效值。
{
let a = 10;
var b = 9;
}
a // ReferenceError: a is not defined.
b // 9
上面的代码块里,用分别let
状语从句:var
声明了2个变量。然后在代码块之外调用这个2歌变量,查询查询结果let
声明的变量报错,var
声明的变量返回了正确的值。表明这let
声明的变量只在它所在的代码块有效。
for
的循环计数器位就很适合使用let
命令:
for(let i=0;i<10;i++){}
console.log(i); // ReferenceError: a is not defined.
上面代码中,计数器位i
只在for
循环体内里有效值,在循环体外引用就会报错。
不存在变量提升
let
不像var
那样会发生“变量提升”现象,所以,变量一定要在声明后使用,否则报错。
console.log(foo); // undefined
console.log(bar); // ReferenceError
var foo = 2;
let bar = 2;
上面代码中,变量foo
用var
命令声明,会发生变量提升,即脚步开始运行时,变量foo
已经存在了,但是没有值,所以会输出undefined
。变量bar
用let
命令声明,不会发生变量提升,这表示在声明它之前,变量bar
的英文不存在的,这是如果用到它,就会抛出一个错误。
暂时性死区
块只要级作用英文域内存在let
命令,它所声明的变量就“绑定”(结合)这个区域,不再受外部的影响。
var tmp = 123;
if(true){
tmp = 'abc'; // ReferenceError
let tmp;
}
上面代码中存在全局变量tmp
,块但是级作用英文域内let
汉语中类似的声明了一个局部变量tmp
,导致后者绑定了这个块级作用域,所以在let
声明变量之前,对tmp
赋值会报错。
“暂时性死区”意味着也。typeof
不再的英文一个百分之百安全的操作:
typeof x; // ReferenceError
let x;
上面的代码中,变量x
使用let
命令声明,所以声明在都之前属于x
的“死区”,只要有用到该变量就会报错。因此,typeof
运行时就会抛出一个ReferenceError
。
作为比较,如果一个变量根本没有被声明,使用typeof
反而不会报错:
typeof xxoo; // "undefined"
所以,没有在let
之前,typeof
运算符是百分之百安全的,永远不会报错。现在这一点不成立了,这样的设计是为了让大家养成良好的编程习惯,变量一定要在声明之后使用。
不允许重复声明
// 报错
function (){
let a = 10;
var a= 1;
}
因此,不能在函数内部重新声明参数:
function func(arg){
let arg; // 报错
}
function func(arg){
{let arg; // 不报错}
}
https://blog.csdn.net/github_26672553/article/details/53520575
const基本用法
const
声明一个只读的常量。一旦声明,常量的值就不能改变。
const PI = 3.1415;
PI // 3.1415
PI = 3; // TypeError: Assignment to constant variable.
上面的代码表明改变常量的值会报错。
const
声明的变量不得改变值,这意味着,const
一旦声明变量,就必须立即初始化,不能留到以后赋值。
const foo; // SyntaxError: Missing initializer in const declaration
const
作用域和let
相同:只在声明所在的块级作用域内有效
if(true){
const MAX = 5;
}
MAX // Uncaught ReferenceError: MAX is not defined
const
命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用:
if(true){
console.log(MAX); // ReferenceError
const MAX = 5;
}
const
声明的常量,和let
一样不可重复声明:
var msg = "hello";
let age = 20;
// 以下2行都会报错
const msg = "goodbye";
const age = 30;
对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。const
命令只是保证变量名指向的地址不变,并不保证改地址的数据不变,所以把一个对象声明为常量必须非常小心。
const foot = {};
foo.prop = 123;
foo.prop // 123
foo = {}; // TypeError: "foo" is read-only
上面的代码中,常量foo
存储的是一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo
指向另一个地址,但对象本身是可以变的,所以依然可以为其添加新属性。
const a = [];
a.push("hello"); // 可执行
a.length = 0; // 可执行
a = ["world"]; // 报错
上面的代码中,常量a
是一个数组,这个数组本身的可写的,但是如果将另一个数组赋值给a
,就会报错。