每天学习一个知识点

88 阅读4分钟

这篇文章主要是为了记录和一起学习小伙伴互相出的每日一题。每天了解一个知识点,大家共同进步

Object.keys() 为什么没有写成Object.prototype.keys()(2022-09-16)

这个题的答案,参考了知乎一位大佬的回答

  1. 第一点,当我们使用Object.create(null)去创建一个对象的时候,这个对象是无原型的,那么就无法调用prototype上面的方法
  2. 如果对象上面有keys, values, hasOwnproperty(这个名字不太常见),那么再调用原型上的方法时就会报错
   var obj = {keys: [1, 2, 3]}
   obj.keys() // 报错
  1. 定制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)

juejin.cn/editor/draf…

__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什么时候会改变呢

  1. 当修改依赖的位置,比如将部分包的位置从dependencies移动到devDependencies
  2. 安装源registry不同,执行npm install时也会修改package-lock.json

参考: juejin.cn/post/707823…