ES6中let命令和const基本用法

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;

上面代码中,变量foovar命令声明,会发生变量提升,即脚步开始运行时,变量foo已经存在了,但是没有值,所以会输出undefined。变量barlet命令声明,不会发生变量提升,这表示在声明它之前,变量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,就会报错。

猜你喜欢

转载自blog.csdn.net/weixin_30363263/article/details/81872100