ES2015入门系列2-let和const

ES2015 新增了两个变量润饰关键字:

  • let

  • const

它们都是块级别的,那什么是块?简朴的来讲,块就是一组花括号中心的部份。

  • Var

为了明白let我们先从var提及,以下代码:

function checkStatus(status) {
  if (status) {
    var statusLabel = 'ok';
    console.log(statusLabel);
  } else {
    console.log(statusLabel);
  }
}
checkStatus(true);
checkStatus(false);

在 Chrome Console 中运转后,取得效果:

ok
undefined

我们在false前提中到场一行代码:

function checkStatus(status) {
  if (status) {
    var statusLabel = 'ok';
    console.log(statusLabel);
  } else {
    console.log(statusLabel);
    console.log(abc);//实行后会输出: Uncaught ReferenceError: abc is not defined(…)
  }
}
checkStatus(true);
checkStatus(false);

关于首次打仗JavaScript的后端程序员来讲,会以为异常新鲜,在传入false的时刻为何获得的statusLabel是undefined而不是变量未定义?而尝试输出abc就能够获得变量未定义的毛病呢?

这是由于在JavaScript中运用var定义的变量会被预先提升到作用域最最先的处所(这里就是这个function), 在这个例子中也就是if位置的上面, 代码就能够够写成:

function checkStatus(status) {
  var statusLabel;
  if (status) {
    statusLabel = 'ok';
    console.log(statusLabel);
  } else {
    console.log(statusLabel);
  }
}

这是JavaScript独占的, 所以之前定义变量的好的习气就是在一切可能会运用的处所之前定义好,云云,才不会发生种种新鲜新鲜的题目。

  • Let

let就是新的 var,和var差别的是它是块级的,将上面的代码中的var换成let

function checkStatus(status) {
  if (status) {
    let statusLabel = 'ok';
    console.log(statusLabel);
  } else {
    console.log(statusLabel);
  }
}
checkStatus(true);
checkStatus(false);

如许的到的效果就是我们想象的,true的时刻是ok, false的时刻抛出变量不存在的毛病,假如false的时刻想要输出undefined, 那末就要手动定义在 if 的上面:

function checkStatus(status) {
  let statusLabel;
  if (status) {
    statusLabel = 'ok'
    console.log(statusLabel);
  } else {
    console.log(statusLabel);
  }
}
checkStatus(true);
checkStatus(false);
  • const

const 和 let 一样是块级, 从名字上看是用来常量的,其实不然,准确的说法是 single-assignment, 也就是说只能对其举行一次赋值而且只能在定义的时刻赋值,背面假如再想对其举行赋值操纵就会报错。

const PI = 3.1415926;
PI = 2.0; //报错,Uncaught TypeError: Assignment to constant variable.

然则,这不代表const定义的就不能够转变的(immutable), 以下代码:

const animals = ['rabbit', 'monkey'];
console.log(animals); //['rabbit', 'monkey']
animals.push('donkey');
console.log(animals);//['rabbit', 'monkey', 'donkey']
animals = ['bird']; //报错,Uncaught TypeError: Assignment to constant variable.

那怎样决议该运用哪一种关键词呢?

这个现在社区没有一致的范例,不过本人比较喜好下面这类,即:

  • 优先运用let

  • 常量用const, 如通例常量, 导入的模块等等。

  • 全局变量运用var (基本上能够不用了?)

    原文作者:chekun
    原文地址: https://segmentfault.com/a/1190000009970073
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞