es6和commonjs对导入导出的值修改是否影响原模块

CommonJS模块与ES6模块的区别 趁着这个机会,将CommonJS模块与ES6模块之间一些重要的的区别做个总结。语法上有什么区别就不具体说了,主要谈谈引用的区别。 CommonJS 对于基本数据类型,属于复制。即会被模块缓存。同时,在另一个模块可以对该模块输出的变量重新赋值。 对于复杂数据类型,属于浅拷贝。由于两个模块引用的对象指向同一个内存空间,因此对该模块的值做修改时会影响另一个模块。 当使用require命令加载某个模块时... 阅读详情

文章目录

都说es6的导出是引用,commonjs导出是值拷贝,所以我想测试一下:

commonjs

commonjs对引用类型导出:对导出的引用修改,会改变模块的值,且引用了该模块的模块都可以获取最新值

// a.js
module.exports.x = "default1";
setTimeout(() => {
  module.exports.x = 6;
}, 4000);
setInterval(() => {
  console.log('a',module.exports);
}, 1000);

// b.js
let a = require("./a.js");
setInterval(() => {
  console.log('b',a);
}, 1000);
setTimeout(() => {
  a.x = "2";
}, 2000);

结果为:

a { x: 'default1' }
b { x: 'default1' }
a { x: '2' }
b { x: '2' }
a { x: '2' }
b { x: '2' }
a { x: 6 }
b { x: 6 }

commonjs对基本数据类型导出:外部修改无效(会脱离指向),内部的修改,无法反映到外部!

// a.js
module.exports = "default1";
setTimeout(() => {
  module.exports = 6;
}, 4000);
setInterval(() => {
  console.log('a',module.exports);
}, 1000);

// b.js
let a = require("./a.js");
setInterval(() => {
  console.log('b',a);
}, 1000);

结果为:

a default1
b default1
a default1
b default1
a default1
b default1
a 6
b default1

es6

对于es6导出的引用类型数据,任何一个地方的更改都会影响别的地方的数据!

// a.js
let x = {name:"default1"};
export let y = {name:"default2"};
export default x;
setTimeout(() => {
  x.name = "4";
  y.name = "4";
}, 4000);
setInterval(() => console.log("a", x, y), 1000);

// b.js
import x from "./a.js";
import { y } from "./a.js";
setInterval(() => console.log("b", x, y), 1000);
setTimeout(() => {
  x.name = "2";
  y.name = "2";
}, 2000);

结果:

a {name: 'default1'} {name: 'default2'}
b {name: 'default1'} {name: 'default2'}
a {name: 'default1'} {name: 'default2'}
b {name: 'default1'} {name: 'default2'}
a {name: '2'} {name: '2'}
b {name: '2'} {name: '2'}
a {name: '4'} {name: '4'}
b {name: '4'} {name: '4'}

换成基本类型数据,测试结果:无法在外部改变引入模块的值,因为是只读属性引入的,但是内部改变后可以被外部非默认导出获取到最新值!

// a.js
let x = 'default1';
export let y = 'default1';
export default x;
setTimeout(() => {
  x = "4";
  y = "4";
}, 4000);
setInterval(() => console.log("a", x, y), 1000);

// b.js
import x from "./a.js";
import { y } from "./a.js";
setInterval(() => console.log("b", x, y), 1000);
setTimeout(() => {
  x = "2"; // 报错!提示常量无法赋值
  y = "2"; // 报错!提示常量无法赋值
}, 2000);

结果:

a default1 default1
b default1 default1
a default1 default1
b default1 default1
报错了。。。
a default1 default1
b default1 default1
a 4 4
b default1 4

总结


  • 在模块导出基本类型数据时,require方式无法获取内部最新数据而且修改变量值会脱钩,import方式外部无法修改模块的数据(只读),但是非默认导出属性可以获取内部最新值。
  • 在模块导出引用类型数据时,外部和内部的修改都可以被观测到!

数据库系统概论课后习题答案(第五版 王珊、萨师煊) 第1章 绪论 1 .试述数据、数据库、数据库系统、数据库管理系统的概念。 答: ( l )数据( Data ) :描述事物的符号记录称为数据。数据的种类有数字、文字、图形、图像、声音、正文等。数据与其语义是不可分的。解析在现代计算机系统中数据的概念是广义的。早期的计算机系统主要用于科学计算,处理的数据是整数、实数、浮点数等传统数学中的数据。现代计算机能存储和处理的对象十分广泛,表 阅读详情

相关推荐

CloudCompare点云滤波实战:三种植被去除技术的对比与应用

本文详细对比了CloudCompare中三种植被去除技术(低通滤波、CSF滤波和坡度法)的实战应用与效果。通过具体案例和参数优化建议,帮助用户根据地形特征选择最佳滤波方法,提升点云数据处理精度和效率,特别适用于复杂场景下的植被去除需求。

weixin_30689307的博客 83

彻底理解JavaScript ES6中的import和export

那么到这里,我们明白了,一个js文件被当做一个模块引入,会暴露为一个对象(也就是被导入后,可以当做一个对象来操作)。export的作用,是在这个文件对象中添加属性,export出来的东西,全部会添加到文件对象中。export default 的作用,是给文件对象的default属性,添加值。

first_hands的博客 2628

App渗透 - 人脸识别登录绕过

一、APP抓包和逆向破解加密算法打开APP是一个登录框抓包后发现参数被加密了使用Jadx脱源码发现,并没有加壳也没有混淆,运气很好根据经验,先搜索Encrypt、Decrypt等关键字,发现在Common.js中有一个encryptData函数定位过去,一套加解密算法都写好了放在这放到浏览器console里面调试,果然没错二、寻找注入点首先测试了一下注入明文:{"userName":"TEST'...

渗透测试研究中心 2823

commonjs和es module对定义变量被改变的分析

commonjs和es module都是js模块化机制,commonjs一般用于服务端写nodejs而es module是用与web浏览器js开发。 这篇文章主要说的是在两种不用的模块化机制中对于定义的变量改变的区别commonjs:commonjs 引用的js文件中的变量被改变是其他地方引用相同的文件的变量不会被改变 文件test1 const {a, afn} = require('./testmodule') console.log(a, '进来了') afn() setTimeout(fun

qq_40816649的博客 1015

hMailServer安装配置

hMailServer安装配置 使用宝塔面板上的宝塔邮件服务器2.1版本,进行安装hMailServer。 宝塔在安装hMailServer是有做了一些配置,如果是手工安装需要注意一下配置点: 1、\hMailServer\Bin 目录下增加mysql连接文件libmysql.dll,要去下载32位的。 libmysql.dll下载 链接:https://pan.baidu.com/s/1YGJXzjowlJ9n_MiqB4xiqw 提取码:wz90 2、 需要提前安装mysql,并创建hM.

王者的博客 5865

5分钟搞定Google Custom Search API申请:从注册到获取CX Key全流程

本文详细介绍了如何快速申请和配置Google Custom Search API,从Google Cloud项目创建、启用计费、获取API Key,到在Programmable Search Engine控制台创建自定义搜索引擎并获取关键的CX Key,提供了全流程实战指南。文章还包含安全配置建议、API调用测试方法及前端与后端的集成代码示例,帮助开发者高效实现网站或应用的智能搜索功能。

weixin_29227585的博客 1663

CommonJS和ES6模块化的区别以及如何解决让CommonJS导出的模块也能改变其内部变量

ES6 模块化 1.export export可以输出变量、函数和类,切记不可直接输出值,否则会报错 2.export default 一个模块只能有一个默认输出,因此export default命令只能使用一次。所以,import命令后面才不用加大括号,因为只可能唯一对应export default命令 3.import import命令接受一对大括号,里面指定要从其他模块导入的变量名。大括号里...

qq_37918241的博客 3160

基于STM32F407标准库与SimpleFOC实现无刷电机2804位置闭环控制的实战解析

本文详细解析了基于STM32F407标准库与SimpleFOC算法实现2804无刷电机位置闭环控制的实战过程。通过硬件选型、速度闭环调试到位置环PID参数整定,提供了完整的工程实现方案和抗饱和策略,帮助开发者掌握高精度电机控制技术。

oauth7security的博客 917

js对象赋值问题(对象赋值影响原对象、对象赋值后原对象值随之变化)

js对象赋值问题(对象赋值影响原对象、对象赋值后原对象值随之变化)

帅的博客 2901

paddle 43 用onnxruntime实现ppyoloe模型的部署(含python和c++版本)

PP-YOLOE+是PP-YOLOE模型的升级版,PP-YOLOE+_l在COCO test-dev2017达到了53.3的mAP, 同时其速度在Tesla V100上达到了78.1 FPS。PP-YOLOE+_s/m/x同样具有卓越的精度速度性价比。paddle官方只给出了基于paddle框架的部署案例,为了更好的部署,为此实现将paddle模型转换为onnx模型,然后在python下实现onnxruntime部署。后续会补充c++ onnxruntime部署

a486259的博客 1914

RICHARDSON-LUCY 去卷积简介

Lucy去卷积1.泊松过程及联合概率分布2.极大似然估计参考文献 1.泊松过程及联合概率分布 首先假设相机接收光子生成图像的过程符合泊松分布。 因此,一次曝光过程中,某像素位置接收到iii个光子的概率p(i)p(i)p(i)为: p(i)=exp⁡(−λ)⋅λii!\qquad\qquad p(i)=\exp(-\lambda)\cdot\cfrac{\lambda^{i}}{i!}p(i)=exp(−λ)⋅i!λi​ 那么针对一张M∗NM*NM∗N的图像,所有像素的联合概率分布可以描述为: P(I)=∏e

驽马十驾,功在不舍;锲而不舍,金石可镂。 8694

Js数组和对象赋值(根源上解决修改新对象数组导致改变了原数组对象的问题)---浅拷贝与深拷贝

Js数组和对象赋值(根源上解决修改新对象数组导致改变了原数组对象的问题)---浅拷贝与深拷贝

1463

Python分布式爬虫深度实战:反爬破解+数据清洗+性能优化全流程

分布式爬虫的核心是“调度中心化+执行分布式”,Scrapy-Redis是最易落地的框架,无需从零写调度逻辑;反爬破解要分级应对:基础反爬靠随机UA/限流,进阶反爬靠代理池,高级反爬靠第三方验证码API;数据清洗的关键是“批量处理+标准化”,避免内存溢出,核心字段去重和异常值过滤是必做步骤;性能优化不是单纯加节点,而是从架构(分片)、代码(批量写入)、服务器(索引/网络)三层协同优化,才能实现效率翻倍。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1200

commonJS和ES6模块化的区别

commonJS和ES6模块化一、简述区别1.语法差异2. 什么是运行时加载呢?3. 什么是编译时加载或静态加载呢?4.在 Node.js 中使用模块化,ES6 模块与 CommonJS 模块差异二、commonJS三、ES6模块化1.语法2.在浏览器中使用ES6模块四、在 Node.js 中使用模块化1. 在Node.js 中使用ES6模块2. 在Node.js 中使用commonjs模块3.package.json 的 main 和exports字段 一、简述区别 在 ES6 之前,社区制定了一些模块

xieanna123的博客 5547

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

CommonJS和ES6模块化的区别

1,使用环境 CommonJS模块的require语法是同步的,导致CommonJS模块规范只适合用在服务端。因为如果在浏览器端使用同步的方式加载一个模块,需要有网络来决定快慢,响应时间可能会很长。 ES6模块无论在浏览器端还是服务端都是可以使用的,但是在服务端,还需要遵循一些特殊的规则才能使用。 2,输出方式不同 CommonJS输出的是一个值的拷贝 ES6模块输出的是值的引用 CommonJS-值的拷贝 CommonJS输出的是值的拷贝,换句话说,一旦输出了某个值,模块内部后续的变化影响不了外部

Dax1_的博客 4635

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

聊聊CommonJS与ES6 Module的使用与区别

学了JS并且用过Node.js后,对模块化应该是有所了解和使用了,那么一定见过以下两种模块导入导出的方式第一种: ES6 Module;第二种: CommonJS

零一的博客 7541

详解CommonJS模块与ES6模块

详解CommonJS模块与ES6模块 历史上,JS一直没有模块体系,在ES6之前,最主要的是CommonJS和AMD两种。前者用于服务器,后者用于浏览器,ES6在语言标准的层面上实现了模块功能,使用简单,称为浏览器和服务器通用的模块解决方案 CommonJS模块: 上面代码实质上就就是整体加载fs模块,生成一个_fs对象,然后在从这个对象上读取方法,这种加载称为运行时的加载,因为只有运行的时候才会得到这个对象,导致完全没有办法在编译的时候做“静态优化” ES6模块: ES6模块不是对象,而是通过expo

马小兜要努力呀 4226

前端面试——CommonJS模块和ES6模块的区别?

本篇文章是博主看阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版,看文章,加代码实践总结的,如果有错误或者歧义的地方希望大佬们指出,免得误导更多人!!!

Concise200的博客 4093

CommonJS的值拷贝与ES6的动态映射

Time: 20190924 导入模块式,CommonJS中获取的是导出值的拷贝,ES6模块中则是值的动态映射,且这个映射是只读的。 简单来说就是,在CommonJS规范下,通过require()导入的是模块的一份值拷贝,可以任意修改,且不会影响到原模块的值。修改原模块的值也不会变动当前文件下的值。-- 二者在导入那一刻失去了联系。 在ES6规范下,打入只是和原模块建立连接,当前文件下不允许修...

Bing's Blog 1591

CommonJS模块与ES6模块及区别

CommonJS模块和ES6模块 在ES6之前,js本没有模块体系之说,最主要使用的是CommonJS和AMD两种。前者用于服务器,后者用于浏览器,ES6后在语言标准的层面上实现了模块功能,使用简单,称为浏览器和服务器通用的模块解决方案。 CommonJS模块化规范 Node.js 遵循了 CommonJS 模块化规范,CommonJS 规定了模块的特性和各模块之间如何相互依赖,规定每个模块内部,规定 module 变量代表当前模块,module 变量是一个对象,它的 ...

AI_huihui的博客 2364

CommonJS模块和ES6模块的区别

CommonJS 1.对于基本数据类型,属于复制。即会被模块缓存。同时,在另一个模块可以对该模块输出的变量重新赋值。 2.对于复杂数据类型,属于浅拷贝。由于两个模块引用的对象指向同一个内存空间,因此对该模块的值做修改时会影响另一个模块。 3.当使用require命令加载某个模块时,就会运行整个模块的代码。 4.当使用require命令加载同一个模块时,不会再执行该模块,而是取到缓存之中的值。也就是...

张木期的博客 2050

CommonJS 和 ES6module 的区别

CommonJS 与 ES6 Module 最本质的区别在于前者对模块依赖的解决是“动态的”,而后者是“静态的”。在这里“动态”的含义是,模块依赖关系的建立发生在代码运行阶段:而“静态”则表示模块依赖关系的建立发生在代码编译阶段。模块 A 在加载模块 B 时会执行 B 中的代码,并将其对象作为require函数的返回值返回。require的模块路径可以动态指定,支持传入一个表达式,甚至可以通过if语句判断是否加载某个模块。

qq_36973122的博客 1009

ES6和CommonJS模块区别

特性ES6 模块(ESM)CommonJS加载时机解析时(静态)运行时(动态)输出本质值的引用(只读)值的拷贝(可修改)循环依赖处理基于模块记录(更可靠)基于执行状态(可能不完整)适用环境浏览器 + 现代 Node.jsNode.js 原生动态导入支持import()(返回 Promise)require()天然支持现代前端开发以 ES6 模块为主,而 CommonJS 主要用于 Node.js 后端开发。在实际项目中,两者可通过打包工具(如 Webpack)相互兼容。

qq_45530512的博客 942

CommonJS和ES6模块的区别

背景 我们都知道JS模块化的演变经历了一个漫长的过程,从最初的CommonJS ,到后来的AMD和CMD,再到今天的ES6模块化方案。优胜劣汰,对于JS这门语言来说,服务端的模块化方案CommonJS 活了下来,而ES6推出的模块化方案更是赢得了大家的认可,大有可能成为未来JS的主要的模块化方案。相信大家都可能产生过这样的疑问:既然两个模块化方案都能被大家使用和认可,那么它们到底有什么优势?两个模块化方案有什么差异?带着疑问我也看了一些文章,发现总结得不是很全面,所以想写一篇文章,完善地总结一下它们的不同

wo240的专栏 665

ES6模块和CommonJs的区别,以及注意事项

区别 CommonJS模块输出是一个值的拷贝,ES6模块输出的值是引用 CommonJS是运行时候加载,ES6模块的编译的时候输出接口 CommonJS是require()同步加载模块,ES6模块是import命令是异步加载,有一个独立的模块依赖的解析阶段 CommonJS模块输出是一个值的拷贝,ES6模块输出的值是引用 CommonJS CommonJS是一个值的拷贝也就是说,一旦输出一个值,模块内部的变化就影响不到这个值 例子 来自 // lib.js var counter = 3; func

qq_39148344的博客 1337

CommonJS和ES6模块有什么区别

commonjs和esmodule有什么区别

weixin_50786692的博客 1650
上一篇: WebSocket
下一篇: redux快速上手
天落枫
博客等级 码龄10年 91粉丝 92原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值