在上一篇文章中JavaScript中AMD和ES6模块的导入导出对比,偏向于理论层面,还有一些同学在微信群里或是私下里针对一些问题进行了沟通,所以有了这一篇文章,对js的导入导出进行总结和实践

当直接给 module.exports时,exports会失效

这个问题其实已经和导入导出没什么关系了, 我们看一个知乎上的问题(详细地址阅读原文可以查看) 我们以此为突破点 js 数组赋值问题 :值传递还是引用?

var a = [1,2,3];
var b = a;
a = [4,5,6];
console.log(b);  //=>[1,2,3]
复制代码

继续看

var a = [1,2,3];
var b = a;
a.pop();
console.log(b);  //=>[1,2]
复制代码

为什么会出现这种情况?

数组和对象的赋值操作都是引用传递

看下这个(留意注释部分)

var a = [1,2,3];// a指向了数组 [1,2,3];
var b = a;//b 指向 a 所指向的数组[1,2,3];
a = [4,5,6];//a 指向了新的数组 [4,5,6],(a的指向发生了变化,改变的是a引用本身,没有改变数组对象,所以b没有变)
console.log(b);  //b没有改变,还是指向数组 [1,2,3];
复制代码

再看下这个(留意注释部分)

var a = [1,2,3];// a指向了数组 [1,2,3];
var b = a;//b 指向 a 所指向的数组[1,2,3];
a.pop();// a 指向的数组实例发生了 pop 操作
console.log(b);  //=>a和b都是指向同一个数组,a变量,所以b也变量,最后输出=>[1,2]
复制代码

看一张图片,很形象的描述

数组如此,对象也是大同小异 看一个群友@ZSing提供的demo

var test = {"name": "zhangshuo"
}
var demo = test;demo.name = "want you"
//你认为test是什么?
console.log(test)//=>{ name: 'want you' }
复制代码

下面通过注释解释一下(如出一辙)

var test = {  "name": "zhangshuo"}//test指向了一个对象 {  "name": "zhangshuo"}
var demo = test;//demo 指向 test 所指向的对象 {  "name": "zhangshuo"}
demo.name = "want you"//对象的属性发生了改变 {  "name": "want you"}
//你认为test是什么?
console.log(test)//=>{ name: 'want you' }
复制代码

test和demo指向了同一个对象,一个变了,就都变了 同样的,我们对上面的demo做一下改造

var test = {"name": "zhangshuo"
}
var demo = test;test={"name": "更改了这个name"}
demo.name = "want you"
//你认为test是什么?
console.log(test)//=>{ name: '更改了这个name' }
复制代码

还需要对此进行赘述吗? 还是通过注释对此进行解释说明

var test = {  "name": "zhangshuo"}//test指向了一个对象 {  "name": "zhangshuo"}
var demo = test;//demo 指向 test 所指向的对象 {  "name": "zhangshuo"}test={ "name": "更改了这个name" }//test的指向发生了变化,指向了一个新对象{ "name": "更改了这个name" }
demo.name = "want you"//demo的指向没有变,改变了原对象的属性 {  "name": "want you"}
//你认为test是什么?
console.log(test)//=>{ name: '更改了这个name' }
复制代码

我相信,上面的两个栗子你已经看懂了,即将进入正题 先来一个过渡 再看一个栗子,用来模拟exports和 module.exports的关联关系

  let md = {exps:{}}//md指向一个对象 {exps:{}}let exps = md.exps//exps指向了md.exps所指向的对象 ,这个空对象{}md.exps = {a: 1,  b: 2}//md.exps指向了一个新对象 {a: 1,  b: 2}exps.c=3//exps,属性赋值 {c: 3}console.log(md.exps); //新对象{ a: 1, b: 2 }
复制代码

上面栗子中的md就是module,md.exps就是module.exports,exps就是exports 在每一个模块的头部都有一行这样的命令

var exports = module.exports;
复制代码

当直接给module.exports赋值时(module.exports={.....}),module.exports就指向了一个新对象,exports会失效

直接给exports赋值会切断exports和 module.exports的关联关系

还是这样的一个前提

var exports = module.exports;
复制代码

exports是来自于module,exports指向 module.exports所指向的对象 当直接给exports赋值,即

 exports = {a:1}
复制代码

exports指向了一个新对象,不再是 module.exports所指向的对象,所以不要给 exports 直接赋值( exports =。。。)

实践=>导出

exports

exports的output.js

exports.str='string字符串'//导出字符串
exports.bool=true//导出布尔
exports.num=123//导出number
exports.foo=(r)=>{//导出函数console.log(`导出函数为:${r}`);
}
exports.arr=[1,2,3]//导出数组
exports.obj={ a:1, b:2}//导出对象
复制代码

input.js

  const iptObj= require('./output.js')console.log(iptObj.str);//=>string字符串console.log(iptObj.bool);//=>trueconsole.log(iptObj.num);//=>123console.log(iptObj.arr);//=>[ 1, 2, 3 ]console.log(iptObj.obj);//=>{ a: 1, b: 2 }iptObj.foo('参数')//=>导出函数为:参数
复制代码

module.exports

module.exports的output.js

module.exports={str:'string字符串',bool:true,num:123,foo:(r)=>{console.log(`导出函数为:${r}`);},arr:[1,2,3],obj:{ a:1, b:2}
}
复制代码

input.js

  const iptObj= require('./output.js')console.log(iptObj.str);//=>string字符串console.log(iptObj.bool);//=>trueconsole.log(iptObj.num);//=>123console.log(iptObj.arr);//=>[ 1, 2, 3 ]console.log(iptObj.obj);//=>{ a: 1, b: 2 }iptObj.foo('参数')//=>导出函数为:参数
复制代码

module.exports的output.js同时支持如下写法

module.exports.str='string字符串'
module.exports.bool=true
module.exports.num=123
module.exports.foo=(r)=>{console.log(`导出函数为:${r}`);
}
module.exports.arr=[1,2,3]
module.exports.obj={ a:1, b:2}
复制代码

input.js不变

export

export的output.js

export const srt = 'string字符串'
export const bool = true
export const num = 123
export const arr = [1, 2, 3]
export const obj = { a: 1, b: 2}
export function foo(r) {console.log(`导出函数为:${r}`);
}
复制代码

input.js

import {str,arr,obj,bool,num,foo} from './output'
console.log(str)
console.log(arr)
console.log(obj)
console.log(bool)
console.log(num)
foo('参数')
复制代码

export的output.js同时支持如下写法

const str = 'string字符串'
const bool = true
const num = 123
const arr = [1, 2, 3]
const obj = { a: 1, b: 2}
function foo(r) {console.log(`导出函数为:${r}`);
}
export {str,bool,num,arr,obj,foo
}
复制代码

input.js 导入支持重命名

import {str as STR,arr,obj,bool,num,foo as FOO} from './output'
console.log(STR)
console.log(arr)
console.log(obj)
console.log(bool)
console.log(num)
FOO('参数')
复制代码

继续重命名

import * as newName from './output'
console.log(newName.str)
console.log(newName.arr)
console.log(newName.obj)
console.log(newName.bool)
console.log(newName.num)
newName.foo('参数')
复制代码

export default

export default的output.js

export default {str: 'string字符串',bool: true,num: 123,foo: (r) => {console.log(`导出函数为:${r}`);},arr: [1, 2, 3],obj: { a: 1, b: 2 }
}
复制代码

input.js

import defaultObj from './output'
console.log(defaultObj.str)
console.log(defaultObj.arr)
console.log(defaultObj.bool)
console.log(defaultObj.num)
console.log(defaultObj.obj)
defaultObj.foo('ef')//=>导出函数为:ef
复制代码

export default的output.js同时支持如下写法

const str = 'string字符串'
const bool = true
const num = 123
const arr = [1, 2, 3]
const obj = {a: 1, b: 2}
function foo(r) {console.log(`导出函数为:${r}`);
}
export default {str,bool,num,arr,obj,foo
}
复制代码

input.js不变

总结

这篇文章是对上一篇文章的总结和实践

  • 当直接给 module.exports时,exports会失效
  • 直接给exports赋值会切断exports和 module.exports的关联关系
  • export,export default,exports,module.exports具体的使用方法实例

更多前端资源请关注微信公众号“前端陌上寒”

原文链接

参考链接

js 数组赋值问题 :值传递还是引用?

转载于:https://juejin.im/post/5ca0cee2e51d454bdc788bf4

js导入导出总结与实践相关推荐

  1. js实现导入导出Excel(结合js-xlsx)

    本文是单纯用前端实现导入导出Excel的功能. 说明: 1.导入要求导入的数据是文本格式. 2.导出是导出json数据到excel文件 demo的githup地址:https://github.com ...

  2. Luckysheet 导入导出 - Java后台处理和js前端实现

    luckysheet 官方群:926131495 无图无真相,所以先看视频效果吧:https://b23.tv/IzhaTv.协同演示与历史记录 目前已经实现导出有三种方案.Java后台方式基于模板导 ...

  3. Three.js数据结构、导入导出(.toJSON())

    Three.js数据结构.导入导出 本文是Three.js电子书的14.1节 通过Three.js模型数据导入导出过程的学习,可以让你对Threejs解析加载外部模型的过程更为了解. Threejs导 ...

  4. JS如何实现书签导入导出?我是这么做的

    目录 前言 依赖 概览 功能实现 FileSystem: HTMLSystem: html-config: 写在最后 前言 使用Node做过爬虫的人应该都知道Cheerio.js模块,其快速灵活的机制 ...

  5. Java:实现文件批量导入导出实践(兼容xls,xlsx)

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 作者:小卖铺的老爷爷 cnblogs.com/laoyeye/p/6938889.html ...

  6. 纯前端js直接导入导出json文件

    现在很多公司都有多个测试环境或者其他环境,有些配置信息在其他环境需要同样的信息,按照传统只能修改数据库对于新手小白来说只能求助于服务端了,现在前端也可以直接将当前的数据导出为json文件,然后在需要的 ...

  7. java导入导出有版本兼容问题_Java实现文件批量导入导出实践(兼容xls,xlsx)

    小Hub领读: 使用poi导入导出xls文件还是比较容易的,有完整的项目代码,可以clone下来好好研究哈! 1.介绍 java 实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写 ...

  8. JAVA工具类(17)--Java导入导出Excel工具类ExcelUtil

    实战 导出就是将List转化为Excel(listToExcel) 导入就是将Excel转化为List(excelToList) 导入导出中会出现各种各样的问题,比如:数据源为空.有重复行等,我自定义 ...

  9. JAE京东云引擎Git上传管理代码教程和京东云数据库导入导出管理

    文章目录 Git管理准备工作 Git工具上传代码 发布代码装程序 mywebsql管理 京东云引擎小结 JAE京东云引擎是京东推出的支持Java.Ruby.Python.PHP.Node.js多语言. ...

最新文章

  1. 图表君聊docker-仓库
  2. memmove 和 memcpy的区别
  3. [转贴]无刷新的2个DropDownList联动
  4. window 添加环境变量
  5. 登录不上_无法登录远程:出现身份验证错误,要求的函数不受支持
  6. 微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版
  7. 内存不能为read进不去桌面_四级报名进不去怎么办
  8. mysql创建多实例,mysql 单服务器创建多实例
  9. JavaEE基础(05):过滤器、监听器、拦截器,应用详解
  10. 写一篇好的技术文章有多难?
  11. java 实例域_Java实例域初始化方法及顺序
  12. (68)Verilog HDL系统函数和任务:$random
  13. Windows 编程[8] - WM_PAINT 消息
  14. 第二章 Jackson属性名转换+属性忽略
  15. swift基础之_swift调用OC/OC调用swift
  16. 《Java程序员职场全攻略:从小工到专家》连载十:这条路大家都是怎么走的
  17. 到底什么是NP问题,NP hard问题,NP完全问题?
  18. 电子板书:Word,PPT,PDF手写批注很轻松
  19. mysql 分库分表中间件 mycat_Mysql—分库分表中间件(Mycat)
  20. Android图片转化黑白图片,图像二值化,生成图像二值化后的黑白图像和图像矩阵(无压缩0,1矩阵),可灵活设置二值化值域

热门文章

  1. Android中TimePicker时间选择器的使用和获取选择的时和分
  2. AndroidStudio中使用XML和Java代码混合控制UI界面实现QQ相册照片列表页面
  3. selecte设置不可用使用disabled属性注意
  4. SSM中使用Druid连接池
  5. linux关于防火墙的一些知识
  6. 神策数据荣获 36 氪 「2020 中国新经济之王」之「最具影响力企业」和「最具竞争力企业」双奖 !...
  7. 神策数据荣登毕马威中国领先消费科技 50 企业
  8. 参会全攻略 | 倒计时 7 天!30+ 位重量级嘉宾“聊”什么?
  9. 神策沙龙回顾:大数据技术和金融、房产、理财的深度结合
  10. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 30 章 可靠性和预写式日志_30.5. WAL内部...