Es6学习笔记1

Posted by JayZhao on 2018-04-16

Es6学习笔记1

链接

let命令

  • var用法类似,但let声明的变量只在let命令所在的代码块内有效。
  • 不存在变量提升,被let声明的变量在被声明之前存在暂时性的死区
  • 不允许重复声明(结合以上两点,和 js 的严格模式有一点相像
  • 实际上为 js 提供了块级作用域(引申: IIFE概念
  • 允许函数在块级作用域内声明(Es5 虽然无法在块级作用域中声明函数,但浏览器并未执行,代码块内声明的函数会被提升到头部,而且在Es6浏览器中(其他环境则不用遵守),亦可以有自己的实现方式,遵循三条原则:1.允许在块级作用域内声明函数;2.函数声明类似于var,即会提升到全局作用域或函数作用域的头部;3.同时,函数声明还会提升到所在的块级作用域的头部。

const命令

  • 声明一个只读变量,与 java 中的final倒是有些类似
  • 作用域与let相同,声明的变量只对所在的块级作用域有效

本质:

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

在 Es6 中提供了一共 6 种声明变量的方式:除了 Es5 中已经存在的 var 和 function,还有 let,const,import,class。

顶层对象的属性

关于顶层对象,在浏览器环境中指的是 windowNode环境中指的是Global

ES6 中一方面为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。