ES6学习笔记(一)

来源:互联网 发布:java时间怎么加减 编辑:程序博客网 时间:2024/06/13 10:03

1、let在变量声明前使用会报错,而var在变量声明前使用,值为undefined。

ES6新增了let命令,用来声明变量的,声明的方法与var相似,但是let 命令声明的变量只在let当前的代码块内有用,在别的地方调用let声明的变量会报错,如:

function f(){  console.log(a);//ReferenceError: a is not defined  {    let a=3;  }};

上列中,如果把let改为var,得到的结果就会是undefined;

2、只要块级作用域内存在let命令,它所声明的变量就会被绑定到这个区域,不再受外部影响

for (let i = 0; i < 3; i++) {  let i = 'abc';  console.log(i);}// abc// abc// abc

循环条件中的let是一个作用域,循环体内的let是一个作用域,互不影响。

3、暂时性死区

如果代码块内存在let和const命令,这个区块对这些变量从一开始就形成了封闭作用域,也就是“暂时性死区”,typeof也不再是一个百分百安全的操作了。

typeof x; // ReferenceErrorlet x;

如果变量a未被声明

typeof a; //"undefined"

4、let不允许在相同作用域内重复声明一个变量,会报错

function func() {  let a = 10;  let a = 1;}func();//报错

5、ES5只有全局作用域和函数作用域,而ES6的let有块级作用域

function f1() {  let n = 5;  if (true) {    let n = 10;  }  console.log(n); // 5}

外层作用域无法读取内层作用域的变量。

6、ES6明确声明允许块级作用域之中声明函数,但在块级作用域中,函数声明的行为类似let,块级作用域外不可引用。

在ES5的环境下:

//浏览器的ES5环境function f() { console.log('I am outside!'); }(function () {  if (false) {    // 重复声明一次函数f    function f() { console.log('I am inside!'); }  }  f();}());//'I am inside!'

在ES6的环境下:

// 浏览器的 ES6 环境function f() { console.log('I am outside!'); }(function () {  if (false) {    // 重复声明一次函数f    function f() { console.log('I am inside!'); }  }  f();}());// Uncaught TypeError: f is not a function

7、do表达式

正常被let声明的变量在该块级作用域外是无法引用的,但如果在该块级作用域外加do,该作用域就会返回块级作用域内部最后执行的表达式的值。如:

let x = do {  let t = f();  t * t + 1;};//x=t*t+1;

8、const命令声明的变量不能改变其值,否则报错

const用来声明一个只读的常量,因此在声明的同时需要给它赋值,否则报错!

const a;// SyntaxError: Missing initializer in const declaration

本质上,const的值不能修改是因为存储该变量的地址不能修改,如果是简单类型的数据,值保存在变量指向的内存地址上,如果是复合类型的数据,变量指向的内存地址保存的是一个指针,指针是固定的,但是指针指向的数据结构是否可变是不一定的,此处慎用。

const foo = {};// 为 foo 添加一个属性,可以成功foo.prop = 123;foo.prop // 123// 将 foo 指向另一个对象,就会报错foo = {}; // TypeError: "foo" is read-only
const a = [];a.push('Hello'); // 可执行a.length = 0;    // 可执行a = ['Dave'];    // 报错

如果想对象冻结,可以使用object.freeze方法,对冻结了的对象添加属性将不起作用,但只是冻结对象的话在严格模式下会报错,想彻底冻结对象的话需要把对象的属性也冻结。如下:

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

9、const的作用域与let一样,只在其声明的块级作用域内有效,只能在声明后使用,且不可重复声明

if (true) {  const g = 5;}g; // Uncaught ReferenceError: MAX is not defined

10、global对象

引入global顶层对象,在所有环境下,global都是存在的,都可以从它拿到顶层对象。
为了确保在所有环境下,global都是存在的:

// CommonJS 的写法require('system.global/shim')();// ES6 模块的写法import shim from 'system.global/shim'; shim();

将顶层对象放入变量global中:

// CommonJS 的写法var global = require('system.global')();// ES6 模块的写法import getGlobal from 'system.global';const global = getGlobal();
原创粉丝点击