一些发现(前端)

121 阅读3分钟

Day 1

  • JS 中,不管你export default了些啥,导出的都是整个.js文件,同理无论你引入的是啥,都引入了整个文件。体现在,被导入文件中本来要执行的的函数都会执行,而export这是为访问模块中的变量提供接口 整个文件的代码都会执行(你只能访问到那些被 export 暴露的变量)。

Day 2

  • 数组支持随机访问,根据下标随机访问的时间复杂度为O(1)。硬件可以保证。

    时间复杂度扩展

    数组中

    操作时间复杂度
    删除与添加O(n)
    随机读取O(1)

    链表中

    操作时间复杂度
    删除与插入O(1)
    随机读取O(n)

    数组的随机访问的实现:当你访问 nums[n],数组会按照下面的公式寻找地址nums[n] = *(nums+ n)时间复杂度 O(1)

    摘自数组访问随机元素的时间复杂度---O(1)

  • 备忘:

    求数组长度

    C/C++:sizeof(nums)/sizeof(nums[0])
    C++:nums.length()
    Java/JavaScript:nums.length

DAY 3

  • 关于 promise 或者 async/await 或者 回调函数式异步编程方法,只当你需要实现同步时才使用

DAY 4

  • 关于 全局状态管理跨页面/组件间通讯 ,普遍的说法是,当页面变得复杂时,才需要使用全局状态管理;而页面逻辑简单的,用“一般的方法”即可,而所谓一般的方法:

    • React 中(除了让状态和它的回调函数穿越层层组件),一般指使用 useContext 配合 <Provider/> 创建一定范围内(乃至全局)的上下文,实现范围内的组件共享状态。
    • Vue 中,貌似是有一个叫 EventBus/事件总线 的东西,可以将其挂载到全局,实现两个组件间的通信(我并没有用过 Vue ,可能有纰漏)。

    之所以把全局状态管理与跨页面/组件间通讯分割开来,大概是因为全局状态管理的构建,一般的方案如:ReudxVuex 等都不可避免地有些复杂,用在简单的 跨页面/组件间通讯 上,确实有杀鸡用牛刀的意思。但是,其实二者的实现所用到的原理都是相同的,即 状态提升

    最近在项目中使用到 RecoilJotai ,作为全局状态管理工具,使用起来却十分快捷,再也不用创建一个全局的 store ,而是直接在函数外声明一个状态容器 Atom ,它会将状态提升到全局,组件内可以直接通过相应的 hook “钩取”数据,十分方便。不知道这会不会让全局状态管理与跨页面/组件间通讯的形式趋于统一。

  • 组件状态共享 ,如果组件只是对状态做出改动,那么它对状态并不依赖;而一旦使用了状态,状态就将代替原来某个 state 的作用。

  • 不用 localStorage 做全局状态管理的原因(因为之前接触过这样的项目):

    • 数据并非响应式
    • 数据可以通过 DevTools 篡改,比较脆弱