这篇文章主要是为了记录和一起学习小伙伴互相出的每日一题。每天了解一个知识点,大家共同进步
Object.keys() 为什么没有写成Object.prototype.keys()(2022-09-16)
这个题的答案,参考了知乎一位大佬的回答
- 第一点,当我们使用Object.create(null)去创建一个对象的时候,这个对象是无原型的,那么就无法调用prototype上面的方法
- 如果对象上面有keys, values, hasOwnproperty(这个名字不太常见),那么再调用原型上的方法时就会报错
var obj = {keys: [1, 2, 3]}
obj.keys() // 报错
- 定制ES5的时候,还要考虑ES3环境的
polyfill
, 如果polyfill的代码写上一句Object.prototype.keys()=function(){} 那么所有的对象的for...in都会在遍历时多出一个keys属性。因为ES3里没办法让一个属性不可枚举
在eslint中,有一个配置会可以禁止在对象上调用原型方法no-prototype-builtins
// 加上这个配置之后,无法调用原型方法
var hasBarPrototype = foo.hasOwnProperty("bar")
var isPrototypeofBar = foo.isPrototypeOf(bar)
...
// 正确的代码为
Object.prototype.hasOwnProperty.call(foo, "bar")
qiankun 中沙箱的实现方法(2022-09-15)
__diranme, __filename, path.resolve(), path.join() 区别(2022-09-14)
__dirname
表示当前文件所在的文件夹 是绝对路径
__filename
表示当前文件路径 是绝对路径
假设有一个文件a.js在c盘的b文件夹下
__dirname
的结果是C:\b
__filename
的结果是C:\b\a.js
path.join()
表示对路径进行拼接, 遇到../会返回上一级
// path.resolve()方法是使用的平台特定的分隔符,Unix系统是/, windows系统是\
console.log(path.join('a', 'b')) // a\b
console.log(path.join('a', 'b', '..')) // 对路径进行拼接 ..表示返回上一级 // a
console.log(path.join('/c', 'a', 'b')) // \c\a\b
console.log(path.join('../', 'a', 'b')) // ..\a\b
console.log(path.join(__dirname, 'a', 'b')) // C:\aaa\a\b
path.resolve()
把一个路径碎片解析为绝对路径
// 如果前面没有绝对路径的话,会使用当前文件夹所在地址的路径
// 下面两段代码返回结果相同
console.log(path.resolve('a', 'b'))
console.log(path.resolve(__dirname, 'a', 'b'))
// 从下面两句代码可以看出,path.resolve是遇到相对路径后就不会再拼接前面的路径了
console.log(path.resolve('/a', 'b', 'c')) // D:\a\b\c
console.log(path.resolve('a', '/b', 'c')) // D:\b\c
package.json 和 package-lock.json(2022-09-13)
关于package.json
package.json可以用来描述项目的基本信息以及所依赖的模块信息 package.json中有许多的配置什么name、description、version等等,就不一一介绍了(有需要可以去掘金上面查找)
我们可以通过使用 npm init
或者 npm init -y
命令来生成生成一个package.json文件
package.json会有一个依赖模块的信息,比如dependencies,devDependencies等(我记得大概有四个),里面会记录一些依赖包的版本
假如当前版本是1.2.3 那么这三部分分别表示主版本号、次版本号、修订号
主版本
主要用来表示当前版本无法兼容上一个版本的代码,需要提升主版本号
次版本号
当前版本新增了一些功能和特性,但仍兼容前一版本的代码,所以提高次版本号
修订号
当前版本修复了一些bug,仍然兼容前一版本的代码,所以提高修订号
有时,我们会看到版本号前面有^
或者~
这样的符号,他们有什么作用呢
^
代表会匹配最近的大版本依赖包,比如^1.2.3 则会匹配1.x.x版本的包,主要是按照次要版本去寻找最新的包
~
代表会匹配最近的小版本的依赖包,比如~1.2.3 则会匹配1.2.x版本的包,主要是按照修订号去寻找最新的包
关于package-lock.json
package-lock.json 描述了node_modules中的依赖结构。在我们执行npm install的时候,会自动生成一个package-lock.json文件。如果项目中存在package-lock.json文件的话,使用npm i安装的时候也会自动使用package-lock.json中的版本来进行安装。注意,如果使用cnpm i是不会生成package-lock.json文件的。也不会根据package-lock.json来进行安装
package-lock.json 主要解决了如果package.json中的版本存在~
或者^
,那么如果版本更新,会存在不同的开发者,安装的依赖包版本不同的问题
package-lock.json什么时候会改变呢
- 当修改依赖的位置,比如将部分包的位置从dependencies移动到devDependencies
- 安装源registry不同,执行npm install时也会修改package-lock.json