声明变量

首先我们来回顾一下 es6 之前声明变量的方法:通常情况下,在 JavaScript 中,我们只有一种声明变量的关键字--var,我们使用 var 声明变量,使用 = 给变量赋值。在es6中我们可以使用新增的关键字let和const声明变量:let声明变量的方法和var一致,均可先声明再赋值,或直接声明并赋值;const声明变量时,不可先声明再赋值,必须直接声明并赋值,否则会报错,并且const声明的变量一旦生产声明过后,就不可再更改,我们可以理解一般用const声明常量;

var str;                //声明变量
str = 'Learning';       //变量赋值
var str2 = 'Learning';  //直接声明并赋值

let str;                //声明变量
str = 'Learning';       //变量赋值
let str2 = 'Learning';  //直接声明并赋值

const str;              //报错Uncaught SyntaxError: Missing initializer in const declaration
const str3 = 'Learning';//直接声明并赋值

作用于块作用域

除此之外,let和const的作用域与var不同,let和const声明的变量只能在当前的块作用域内访问到;

{
  let a = 10;
  var b = 1;
}

a // 报错ReferenceError: a is not defined.
b 

不可以变量提升

var可以变量提升,即在声明变量之前使用,值为undefined;let、const不可以变量提升,在声明变量之前使用会报错;

// var 的情况
console.log(foo); // 输出undefined
var foo = 2;

// let 的情况
console.log(bar); // 报错ReferenceError
let bar = 2;

暂时性死区

只要块级作用域内存在let或const命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响,形成封闭作用域。凡是在声明变量之前访问变量都会报错,在作用域内,声明变量之前,该变量是不可用的,这称为“暂时性死区”。

var a = 'string';
if(true) {
    console.log(a); // ReferenceError

    a = 'abc';      // ReferenceError
    console.log(a); // ReferenceError

    let a;
    console.log(a); // undefined

    a = 123;
    console.log(a);
}

不可重复声明

let不允许在同一个作用域内声明同一个变量。

let a = 1;
var a = 2;  // Uncaught SyntaxError: Identifier 'a' has already been declared

let a = 2;  // Uncaught SyntaxError: Identifier 'a' has already been declared

let a = 1;
let a = 2;  // Uncaught SyntaxError: Identifier 'a' has already been declared

const定义复合类型

const声明变量的本质是变量指向的内存地址所保存的数据不得改动。对于单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。

const foo = {};

// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop 

// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only

为了使对象冻结,在声明变量的时候,我们使用Object.freeze方法。

const foo = Object.freeze({});

// 常规模式时,下面一行不起作用;
// 严格模式时,该行会报错
foo.prop = 123;

将对象本身冻结,对象的属性也应该冻结。下面是一个将对象彻底冻结的函数。

var constantize = function(obj){
  Object.freeze(obj);
  Object.keys(obj).forEach( (key, i) => {
    if ( typeof obj[key] === 'object' ) {
      constantize( obj[key] );
    }
  });
};

es6声明变量的6中方法

var、function、let、const、import、class

ES6--变量的更多相关文章

  1. ES6——变量

    ES6变量: 1.var 可以重复声明: 无法限制修改: 没有块级作用域:(如,{...},if(){..} ...) 2.let 不可以重复声明,变量—可以重复修改,有块级作用域: let a = ...

  2. es6变量和函数的提升、暂时性死区?

    es6变量和函数的提升.暂时性死区?

  3. ES6 变量的解构赋值

    数组的解构赋值     var [a,b,c] = [1,2,3];    左边是变量,右边是值,根据数据结构一一对应 只要等号两边的模式相同,左边的变量就会被赋予右边对应的值,必须模式相同 如果等号 ...

  4. ES6 - 变量的解构赋值学习笔记

    变量的解析赋值 数组的解析赋值 es6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这就称为解构. var a = 1; var b = 2; var c = 3; //在es6中允许写成 ...

  5. ES6 变量、常量声明总结

    较之前ES5,新颁布在声明上有改变 一.var  对比  let 1.作用域不同 let只在命令所在的代码块 {} 里有效 ES5只有全局作用域和函数作用域,没有块级作用域,带来很多不合理的场景,比如 ...

  6. es6变量声明和解构赋值

    /*声明: * 本文内容多为学习借鉴性内容,大部分非原创 * 特别感谢阮一峰的 ECMAScript6 入门,推荐大家学习 */ 一.es5变量声明的不足 1.变量提升和函数声明提升 es5的代码加载 ...

  7. ES6 变量的解构

    默认值 let [foo = true] = []; foo // true let [x, y = 'b'] = ['a']; // x='a', y='b' let [x, y = 'b'] = ...

  8. ES6变量解构赋值

    ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构ES6之前我们申明多个变量需要按照下面的方法: let l a=1; let b=2; let c=3; let d=4; ...

  9. es6变量解构赋值的用途

    这里是我觉得es6解构赋值,在平时我们写js的时候非常有用,而且经常用到的地方,能简化我们的代码,让写代码简介优雅易读; 用途 1.交换变量的值,太方便了这逼,写法不仅简介而且一看就明白 let [x ...

  10. es6变量的解构赋值学习笔记

    1. 解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象.由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错. let { prop: x } = undefin ...

随机推荐

  1. 预习初三物理电学部分的心得体会&知识梳理(持续更新)

    DAY 1 一.摩擦起电 用摩擦的方式使两个不同的物体带电的现象. 二.带电体 如果一个物体能够吸引轻小物体,我们就说这个物体带电或者说带了电荷. (注:吸引轻小物体是作用效果,带电体对任何物体都有吸 ...

  2. Jenkins的安装与使用(一)

    jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的"自动化"编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java, ...

  3. 设计模式-享元模式(Flyweight)

    享元模式是构造型模式之一,它通过与其他类似对象共享数据来减少内存占用 角色和职责: 1.抽象享元角色()-Person:   享元角色的公共接口 2.具体享元角色()-Teacher: 抽象享元角色的 ...

  4. HDU 5791:Two(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=5791 Two Problem Description   Alice gets two sequences A ...

  5. redux和react-redux做简单组件控制

    这次我们用两种方式实现以下要求 1.三个组件 2.第一个组件有两个按钮 分别控制第二和第三个组件年龄和姓名的改变 3第二个组件展示姓名,第三个组件展示年龄 用到哪些插件 store  redux 一 ...

  6. volatile的内存语义与应用

    volatile的内存语义 volatile的特性 理解volatile特性的一个好方法是把对volatile变量的单个读/写,堪称是使用同一个锁对这些单个读/写操作做了同步. 锁的happens-b ...

  7. java高并发系列-第1天:必须知道的几个概念

    java高并发系列-第1天:必须知道的几个概念 同步(Synchronous)和异步(Asynchronous) 同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后, ...

  8. 免费rar/zip解压缩工具BandZip

    今天为大家推荐一款解压缩类软件--BandZip bandzip是我认为的最好用的解压缩软件,速度快没广告 能够秒杀其他的压缩类软件 下载地址 bandzip点我 1 BandZip简介 BandZi ...

  9. Java基础之增强for循环

    平时大家for循环应该用的不少,特别是增强for循环,简单快捷.但是在增强for中做删除操作,却会抛出java.util.ConcurrentModificationException,一起来看下. ...

  10. 利用iisnode模块,让你的Node.js应用跑在Windows系统IIS中

    最近比较喜欢用Node.js做一些简单的应用,一直想要部署到生产环境中,但是手上只有一台windows server 2008服务器,并且已经开启了IIS服务,运行了很多.Net开发的网站,80端口已 ...