es6 一些小知识
本人最近被es6感兴趣了,学习一些,以下就是自己总结的一些小知识
1、当你在百度输入"es6"关键字,点击进入es6入门,首先你需要知道怎样学习的顺序,先看第21章Module语法,
严格模式
ES6 的模块自动采用严格模式,不管你有没有在模块头部加上"use strict";
。
严格模式主要有以下限制。
- 变量必须声明后再使用 例如:let
- 函数的参数不能有同名属性,否则报错 例如:const let
- 不能使用
with
语句 - 不能对只读属性赋值,否则报错 例如:const
- 不能使用前缀0表示八进制数,否则报错
- 不能删除不可删除的属性,否则报错 例如:数组的length
- 不能删除变量
delete prop
,会报错,只能删除属性delete global[prop]
eval
不会在它的外层作用域引入变量eval
和arguments
不能被重新赋值arguments
不会自动反映函数参数的变化- 不能使用
arguments.callee
- 不能使用
arguments.caller
- 禁止
this
指向全局对象 - 不能使用
fn.caller
和fn.arguments
获取函数调用的堆栈 - 增加了保留字(比如
protected
、static
和interface
)
arguments.callee 与 argument.caller
function fatherCheck() { check(""); function check() { sonCheck(); function sonCheck() { console.log(arguments.callee); console.log(sonCheck.caller.caller) } } } fatherCheck();
arguments.callee返回sonCheck的函数体(当前正在执行的函数),sonCheck.caller返回调用sonCheck的函数,即check,而再往上一层,sonCheck.caller.caller就是返回调用check的函数体,也就是fatherCheck。那如果是继续往上一层呢?sonCheck.caller.caller.caller?就会变成null。书里也有讲,arguments.caller在非严格模式下永远是undefined。我们就可以判断值是null还是undefined来区分arguments.caller和函数的caller。
2、let 与 const
es5中的var变量 , 1)没有块级作用域;2)指向全局,可以解析和变量的提前声明;3)可以相互覆盖
es6中的const 主要是为了让变量更加安全,不会相互覆盖(只读属性)
es6中的let 1)没有解析与变量的提前声明,只能声明后调用; 2)不指向全局,块级作用域,作用域更安全;3)不能重复声明,否则会报错
var b = [1,2,3,4,5,6,7,8,9,10]; for(let i=0; i<b.length; i++){ b[i] = function(){ console.log(i) } // b[i](); 输出 0 1 2 3 4 5 6 7 8 9
} b[6](); // 6
b[i](); //报错
3、解构赋值