ES6新特性

187 阅读3分钟

var,let,const的区别

letES6 新添加申明变量的命令,它类似于 var,但是有以下不同:

(1)块级作用域: 块作用域由 { }包括,let和const具有块级作用域,var不存在块级作用域。块级作用域解决了ES5中的两个问题:

  • 内层变量可能覆盖外层变量
  • 用来计数的循环变量泄露为全局变量

(2)变量提升: var存在变量提升,let和const不存在变量提升,即在变量只能在声明之后使用,否在会报错。

(3)给全局添加属性: 浏览器的全局对象是window,Node的全局对象是global。var声明的变量为全局变量,并且会将该变量添加为全局对象的属性,但是let和const不会。

(4)重复声明: var声明变量时,可以重复声明变量,后声明的同名变量会覆盖之前声明的遍历。const和let不允许重复声明变量。

(5)暂时性死区: 在使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。使用var声明的变量不存在暂时性死区。

(6)初始值设置: 在变量声明时,var 和 let 可以不用设置初始值。而const声明变量必须设置初始值。

(7)指针指向: let和const都是ES6新增的用于创建变量的语法。 let创建的变量是可以更改指针指向(可以重新赋值)。但const声明的变量是不允许改变指针的指向

forEach会改变原数组吗?

参考文档:juejin.cn/post/708757…

解构赋值时希望使用新的key:

const obj={name:'tom',age:11};
let {name:sname,age:sage}=obj;
console.log(sname,sage);//'tom',11

对象合并并去重(使用扩展运算符或Object.assign()):

let a={a:1},b={b:2},c={b:3,c:4};
let d=Object.assign(a,b,c);
let e={...a,...b,...c};
console.log(d);//{a: 1, b: 3, c: 4}
console.log(e);//{a: 1, b: 3, c: 4}

数组合并并去重(使用扩展运算符与new Set()):

let a=[1,2,3];let b=[1,3,5,7];
let c=[...new Set([...a,...b])];
console.log(c);//[1, 2, 3, 5, 7]

多维数组扁平化(使用flat()):

注意:flat的参数可选,为数字,表示希望扁平化的层数,Infinity表示无限深度扁平化
let arr=[[1,2,3],[4,5,[6,7,8,[9]]]];
console.log(arr.flat(Infinity));//[1, 2, 3, 4, 5, 6, 7, 8, 9]

获取对象的所有属性或属性值:

Object.keys(obj);
Object.values(obj);

用可选链操作符替代传统的对象判空并取值:

before:let a=obj&&obj.name;
after:let a=obj?.name;

用空值合并运算符替代传统的非空判断:

before:if(value !== null && value !== undefined && value !== '')
after:if((value??'') !== '')
注意:如果使用if(!value)这种简单粗暴的写法的话,则当value值为false0时也会返回true,但以上的if((value??'') !== '')写法则可以避免这种问题    

link 与 @import 的区别

  • link功能较多,可以定义 RSS,定义 Rel 等作用,而@import只能用于加载 css
  • 当解析到link时,页面会同步加载所引的 css,而@import所引用的 css 会等到页面加载完才被加载
  • @import需要 IE5 以上才能使用
  • link可以使用 js 动态引入,@import不行

模块化

模块化开发在现代开发中已是必不可少的一部分,它大大提高了项目的可维护、可拓展和可协作性。通常,我们 在浏览器中使用 ES6 的模块化支持,在 Node 中使用 commonjs 的模块化支持。

  • 分类:

    • es6: import / export
    • commonjs: require / module.exports / exports
    • amd: require / defined
  • requireimport的区别

    • require支持 动态导入import不支持,正在提案 (babel 下可支持)
    • require同步 导入,import属于 异步 导入
    • require值拷贝,导出值变化不会影响导入值;import指向 内存地址,导入值会随导出值而变化

babel编译原理

  • babylon 将 ES6/ES7 代码解析成 AST
  • babel-traverse 对 AST 进行遍历转译,得到新的 AST
  • 新 AST 通过 babel-generator 转换成 ES5