ES6学习笔记(一)

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; // ReferenceError
let 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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值