ES6----个人笔记

来源:互联网 发布:openoffice linux下载 编辑:程序博客网 时间:2024/06/03 07:52

1. let

-变量声明,但只限于块级作用域 { }
-for循环中适用let 这样可以避免var 的i值全局变量覆盖

var a = [];for (var i = 0; i < 10; i++) {  a[i] = function () {    console.log(i);  };}a[6](); // 10

个人理解==>这样 i 值去++的时候会去把全局变量 i 覆盖掉,所以不管打印a[ i ] 都会是 i 引用的最终值。

如果用let的话 每一次for循环中let 的 i 都是一个块级独立变量,项目之间不会干扰。

如果用var 的话就要用到闭包,在function(){ } 后面去加(i) 去执行自执行方法,让他每申明之后先调用出来把a[ i ] 的值先赋值给自身。

var 会有变量提升,在全局作用域或者函数作用域中,js首先会先去获取var 的变量(但值为undefined)和function(){…}函数体,再去逐行执行改代码,如果先赋值变量,再打印就正常,反之则会打印出来undefined。

let则没有变量提升,为了纠正变量提升这种奇怪的现象取消了变量提升这种效果如果在输出变量时还未声明,则会报错

// var 的情况console.log(foo); // 输出undefinedvar foo = 2;// let 的情况console.log(bar); // 报错ReferenceErrorlet bar = 2;

let的暂时性死区:只要块级作用域中有let命令,它所有声明的变量都会锁死在这个区域中,不会再受外部的 影响。

var tmp = 123;if (true) {  tmp = 'abc'; // ReferenceError  let tmp;}

if的条件块级作用域中有tmp的let声明,所以tmp就不能再引用上级作用域的val,由于let没有变量提升,所以就导致报错。
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。


在 var 和 let 之间有一个 typeof的使用区别

 typeof abc // "undefined" //如果未声明,用typeofundefined
typeof x; // ReferenceErrorlet x;//如果let声明,会抛出ReferenceError引用错误

在没有let之前,typeof运算符是100%安全的,永远不会报错。


死区报错情况特例:

function bar(x = y, y = 2) {  return [x, y];}bar(); // 报错//参数x=y的时候y变量还未声明,所以报错,把两个变量位置替换就OK//之后default 参数会讲

由于使用let声明变量时候,只要变量在还没声明的时候使用,就会报错

// 不报错var x = x;// 报错let x = x;// ReferenceError: x is not defined

不允许重复声明

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

块级作用域

es5的函数作用域

在es5的函数作用域中会覆盖外层作用域的变量,
这里f()中由于var tmp会变量提升,所以进入方法先声明tmp 进入if判断才会复制tmp

var tmp = new Date();function f() {  console.log(tmp);  if (false) {    var tmp = 'hello world';  }}f(); // undefined

es6块级作用域

一对大括号就是一个块级作用域,每层的let都是相互独立的互不干扰
有了块级作用域,IIFE(里即可执行函数表达式)就可以不再使用了


在块级作用域下,函数声明语句类似于let,在块级作用域之外不可引用。


do表达式
{ 哇啦哇啦一大堆,没看懂,猜测也用不到 }


const命令

const声明一个只读常量,一旦声明,常量的值就不可以改变,改变就报错

const PI = 3.1415;PI // 3.1415PI = 3;// TypeError: Assignment to constant variable.

意味着用const一旦声明,就必须立即初始化赋值,不能留到以后赋值。

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

const和let一样,只在声明的块级作用域中生效
也不会变量提升,需要先声明后使用(暂时性死区),不可以重复声明


const的本质是变量指向的内存地址值不可以改变,如果重新赋值,是将变量改变为其他内存地址值,因为const是将地址指针固定,所以改变变量就会改变地址值,就会报错。

const a=1;a//1a=2//Uncaught TypeError: Assignment to constant variable.
const foo = {};// 为 foo 添加一个属性,可以成功foo.prop = 123;foo.prop // 123// 将 foo 指向另一个对象,就会报错foo = {}; // TypeError: "foo" is read-only

foo对象本身不可变,但是内部的属性是可变的。

不管是基本数据类型还是引用数据类型都是一样的。

对象本身被冻结之后,就不可以再更改对象用到Object.freeze方法

const foo = Object.freeze({});// 常规模式时,下面一行不起作用;// 严格模式时,该行会报错foo.prop = 123;

除了对象本身被冻结,他的属性也被冻结,这个对象才是彻底被冻结

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

ES6 有6种声明方式
在es5种只有两种var,function( ){ }
es6中还有let const 之后还有import class


顶层对象的概念

在es5中,顶层对象在浏览器环境中就是window对象

window.a = 1;a // 1a = 2;window.a // 2

es6中为了把全局对象和顶层对象区分开,let、const、class 依然是全局变量,但不属于顶层对象的属性

var a = 1;// 如果在Node的REPL环境,可以写成global.a// 或者采用通用方法,写成this.awindow.a // 1let b = 1;window.b // undefined

global 对象
(用不到,完了再说)


2.变量的解构

数组的解构

原创粉丝点击