You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
//name.jsletname='William';setTimeout(()=>{name='Yvette';},300);module.exports={ name };//index.jsconst{ name }=require('./name');console.log(name);//William//name 是一个原始类型的值,会被缓存。setTimeout(()=>console.log(name),500);//William
不积跬步无以至千里。
关于【Step-By-Step】
1. 实现一个
JSON.stringify
JSON.stringify([, replacer [, space])
方法是将一个JavaScript值(对象或者数组)转换为一个 JSON字符串。此处模拟实现,不考虑可选的第二个参数replacer
和第三个参数space
,如果对这两个参数的作用还不了解,建议阅读 MDN 文档。基本数据类型:
undefined
)"false"/"true"
NaN
和Infinity
)转换之后是字符串类型的数值undefined
"null"
NaN
和Infinity
转换之后是字符串"null"
如果是函数类型
undefined
如果是对象类型(非函数)
如果有
toJSON()
方法,那么序列化toJSON()
的返回值。如果是一个数组
undefined
、任意的函数以及symbol
,转换成字符串"null"
如果是
RegExp
对象。返回
{}
(类型是 string)如果是
Date
对象,返回Date
的toJSON
字符串值如果是普通对象;
undefined
、任意的函数以及 symbol 值,忽略。symbol
为属性键的属性都会被完全忽略掉。对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。
测试代码:
2. 实现一个
JSON.parse
JSON.parse(JSON.parse(text[, reviver])
方法用来解析JSON字符串,构造由字符串描述的JavaScript值或对象。提供可选的reviver函数用以在返回之前对所得到的对象执行变换。此处模拟实现,不考虑可选的第二个参数reviver
,如果对这个参数的作用还不了解,建议阅读 MDN 文档。第一种方式 eval
最简单,最直观的方式就是调用
eval
直接调用
eval
存在XSS
漏洞,数据中可能不是json
数据,而是可执行的JavaScript
代码。因此,在调用eval
之前,需要对数据进行校验。JSON
是 JS 的子集,可以直接交给eval
运行。第二种方式
new Function
Function
与eval
有相同的字符串参数特性。3. 实现一个观察者模式
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。
观察者(Observer)直接订阅(Subscribe)主题(Subject),而当主题被激活的时候,会触发(Fire Event)观察者里的事件。
4. 使用 CSS 让一个元素水平垂直居中
父元素
.container
子元素
.box
利用
flex
布局子元素是单行文本
设置父元素的
text-align
和line-height = height
利用
absolute
+transform
利用
grid
布局利用绝对定位和
margin:auto
5. ES6模块和
CommonJS
模块有哪些差异?1.
CommonJS
模块是运行时加载,ES6模块是编译时输出接口。CommonJS
加载的是一个对象,该对象只有在脚本运行完才会生成。2.
CommonJS
模块输出的是一个值的拷贝,ES6模块输出的是值的引用。CommonJS 模块输出的是值的拷贝。
ES6 模块的运行机制与
CommonJS
不一样。JS 引擎对脚本静态分析的时候,遇到模块加载命令import
,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。因此上面的例子也很容易理解。
那么
export default
导出是什么情况呢?一起看一下为什么。
export default
可以理解为将变量赋值给default
,最后导出default
(仅是方便理解,不代表最终的实现,如果对这块感兴趣,可以阅读 webpack 编译出来的代码)。基础类型变量
name
, 赋值给default
之后,只读引用与default
关联,此时原变量name
的任何修改都与default
无关。复杂数据类型变量
hobbies
,赋值给default
之后,只读引用与default
关联,default
和hobbies
中存储的是同一个对象的堆内存地址,当这个对象的值发生改变时,此时default
的值也会发生变化。3. ES6 模块自动采用严格模式,无论模块头部是否写了
"use strict";
4. require 可以做动态加载,
import
语句做不到,import
语句必须位于顶层作用域中。5. ES6 模块的输入变量是只读的,不能对其进行重新赋值
6. 当使用require命令加载某个模块时,就会运行整个模块的代码。
7. 当使用require命令加载同一个模块时,不会再执行该模块,而是取到缓存之中的值。也就是说,CommonJS模块无论加载多少次,都只会在第一次加载时运行一次,以后再加载,就返回第一次运行的结果,除非手动清除系统缓存。
参考文章:
[1] 珠峰架构课(墙裂推荐)
[2] JSON.parse三种实现方式
[3] ES6 文档
[4] JSON-js
[5] CommonJS模块和ES6模块的区别
[6] 发布订阅模式与观察者模式
谢谢各位小伙伴愿意花费宝贵的时间阅读本文,如果本文给了您一点帮助或者是启发,请不要吝啬你的赞和Star,您的肯定是我前进的最大动力。 https://github.com/YvetteLau/Blog
The text was updated successfully, but these errors were encountered: