ES6 common.js和es6中模块引入的区别

ES6 common.js和es6中模块引入的区别:

1、common.js和es6中模块引入的区别
Common.js是一种模块系统,主要用于node.j。使用require函数引入模块,使用module.exports导出模块

特点:

动态导入,require可以在函数体中,条件语句动态引入模块
同步加载:require是同步的,模块在执行require时会立即加载并返回结果
导出的是值的拷贝
ES6模块:

ES6模块系统是ECMAScript标准的一部分,使用import和export进行导入和导出模块

export const name = ‘shanghai’

特点:

静态导入,在文件的顶部定义,在编译时确定依赖关系
异步加载
导出的是值的引用,这就意味着值发生改变后,所有的引用处发生反映
兼容性和转换:使用Babel或者Webpack等可以将ES6转为Common.js

2、箭头函数
– 箭头函数和普通函数的区别
使用=>来定义箭头函数,省去了function关键字,采取=>定义函数,函数的参数写在=>前的括号,函数体写在后面花括号

区别:

语法上来看,箭头函数更简洁、清晰,很便捷

箭头函数不会创建自己的this,它是捕获自己定义时所处的外层执行环境的this,并继承这个值。

箭头函数继承而来的this指向永远不会改变

.call()\.apply()\.bind()不会改变箭头函数的this指向

虽然这些方法可以动态的修改函数执行时的this指向,但是箭头函数的this指向在定义时就已经确认了

箭头函数不能作为构造函数使用

构造函数的new做了什么

JS内部生成一个对象,继承构造函数的原型对象:Object.create(constructor.prototype)
将函数中的this指向该对象
执行构造函数中的语句
返回该对象的实例
由于箭头函数的this指向在定义时就已经确定,并且无法改变,因此this指向无法随在哪里调用、被谁调用而改变,因此箭头函数不能作为构造函数使用

箭头函数没有自己的arguments

arguments对象是一个函数内部的类数组的对象,作用存储函数调用时传入的所有参数。

箭头函数没有原型prototype

箭头函数不能用作Generator函数,不能使用yeild关键字

Generator函数是一种特殊的函数,function* 语法定义,可以暂停和恢复程序执行,返回一个迭代器对象

yield 是 Generator 函数中的关键字,用于暂停函数执行并返回一个值。每次调用迭代器的 next() 方法时,函数会从上次暂停的位置继续执行。

适合回调函数,避免普通函数的this丢失问题(不再用 var that = this 或者bind)

– 箭头函数的this指向问题
箭头函数没有属于自己的this,它所谓的this是指捕获其所在上下文的this值,作为自己的this,它没有自己独立的this上下文

从作用域机制来看,普通函数的this是在运行时动态绑定的,谁调用函数,this就指向谁;而箭头函数他是在定义时静态绑定的,继承外部词法作用域的this,并不会改变的

从babel转译来看,转译后用闭包(变量 var _this = this )保存当前作用域的this,箭头函数被转为普通函数,就直接使用闭包保存的_this

– new一个箭头函数会怎么样
报错:TypeError: ArrowFunction is not a constructor

核心原因:

没有自己的this,无法通过new绑定到新创建的实例上
没有[construct]内部方法,用于创建对象实例这个方法
不能使用arguments、super
3、var\const\let区别
var

在ES5中,顶层对象和全局对象是等价的,var声明的变量既是全局变量也是顶层变量

使用var声明的变量存在变量提升的现象,就是在编译阶段将其提升到顶部

使用var,能够对一个变量多次声明并且后面会覆盖前面的

函数中使用var声明变量,该变量是局部

le

ES6新增的,存在块级作用域,在let命令所在的代码块中有效

不存在变量提升,未声明直接使用会报错(ReferenceError),使用let声明变量前,该变量都不可用(暂时性死区)

let不允许在相同作用域重复声明

const

声明一个只读变量,一旦声明,常量的值就不可变了,实际上是保证变量指向的内存地址所保存的数据不可改动

– 区别
变量提升:

var声明的变量存在变量提升,值为undefined

let和const声明的变量不存在变量提升,即声明的变量一定要在声明后使用,否则报错

这种说法也不全对,只能说暂时性死区使得我们感受不到变量提升的效果,会被提升只是不会被初始化、被引用

从变量赋值的过程来看,创建变量时会在内部中开辟空间,然后初始化,再赋值,但是let不会进行初始化

暂时性死区

var不存在,let和const存在

块级作用域

var不存在,let和const存在

重复声明

var允许,且后声明的会覆盖前面声明的,const和let在同一个作用域不允许重复声明

修改声明的变量

var和let可以修改,const声明一个只读的常量不可以进行修改

使用

优先使用const,其次let,避免var

4、Symbol作用
主要解决ES5中属性名都是字符串导致的属性名冲突问题,保证每个属性名都是独一无二的

Symbol:表示独一无二的值,继undefined、null、boolean、string、Number、Object、BigInt:表示任意精度的整数,ECMAScript2020中引入

通过Symbol函数生成,对象属性名有两种:字符串、Symbol类型

5、ES6新特性
主要有四大类

解决原有语法的不足

对原有语法进行增强

解构、展开、参数默认值、模板字符串

全新的对象、方法、功能

promise、proxy、object的assign、is

全新的数据类型和结构

symbol、set、map

 

欢迎使用66资源网
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!

66源码网 » ES6 common.js和es6中模块引入的区别

提供最优质的资源集合

立即查看 了解详情