var,let,const的区别
let 为 ES6 新添加申明变量的命令,它类似于 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会改变原数组吗?
解构赋值时希望使用新的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值为false或0时也会返回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
- es6:
-
require与import的区别require支持 动态导入,import不支持,正在提案 (babel 下可支持)require是 同步 导入,import属于 异步 导入require是 值拷贝,导出值变化不会影响导入值;import指向 内存地址,导入值会随导出值而变化
babel编译原理
- babylon 将 ES6/ES7 代码解析成 AST
- babel-traverse 对 AST 进行遍历转译,得到新的 AST
- 新 AST 通过 babel-generator 转换成 ES5