JavaScript 列表数据操作的优化方案
从一个简单需求说起
考虑下面需求:
我们有一组日常开支记账列表,我们需要从列表中,过滤出所有咖啡的消费,然后转换成消费金额,取前三条数据。
表达为代码实现,大概是这样的:
const list = [ { type: '早餐', amount: 12 }, { type: '咖啡', amount: 25 }, { type: '午餐', amount: 18 }, { type: '咖啡', amount: 19 }, { type: '零食', amount: 8 }, { type: '晚餐', amount: 22 }, { type: '水果', amount: 20 }, { type: '早餐', amount: 12 }, { type: '咖啡', amount: 25 }, { type: '午饭', amount: 20 }, { type: '咖啡', amount: 19 }, { type: '晚饭', amount: 21 }, //还有许多...]
const result = list.filter(item => item.type === '咖啡').map(item => item.amount).slice(0, 3)那么这个实现中,存在哪些比较显而易见的问题呢?
问题分析
例子代码中起码存在着以下问题:
READ MORE...JavaScript WeakMap
语言实现
比较无聊,不谈
怎么 polyfill
分析:
- 不能阻止 key 被 gc,因此,WeakMap 中不能直接持有 key。
- 通过 key 能找到 value,因为上条,不能由 WeakMap 或第三方对象去维护这种对应关系,于是只能在 key 中用某种方式去引用 value 来维持对应关系。
- 基于上条,得出 key 必须为对象的结论。
- 同一个对象能作为多个 WeakMap 的 key 分别引用不同的 value,这意味着 key 必须能识别不同的 WeakMap,因此,WeakMap 实现中,必须有个唯一标识,key 使用不同 WeakMap 的唯一标志作为属性名去引用不同的 value。
- 由于 WeakMap 不负责存储 key、value,所以 WeakMap 无法实现遍历 key、value 等操作。只能实现 get, set, has, delete 等方法去操作 key 中存储的数据。
JavaScript 的 eval
eval 的使用方式
eval 可以接受一个字符串,并解析执行,例如:
var a = 1;eval('a + 1') // 2
eval('{ foo: 123 }') // 123,代码块eval('({ foo: 123 })') // { foo: 123 },对象字面量严格模式
通常 eval 应当只在严格模式下使用。
跨源资源共享(CORS)相关 headers
CORS 相关响应头
在进行 CORS 相关的配置时,通常需要一些以 Access-Control 开头的响应头,比如:
Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-HeadersAccess-Control-Allow-CredentialsAccess-Control-Expose-HeadersAccess-Control-Max-Age
要理解这些 header 的作用,可以直接动手通过一个简单的实验来辅助理解。
实验代码的后端部分,基于 node + express。下面正式开始。
READ MORE...Excel 中 1900 闰年问题
在业余开发在线电子表格应用过程,学习了下 Excel 中对于日期的表示方式,发现了一个有意思的问题,那就是 Excel 会将 1900 年当作是闰年。 本篇博客就这个问题随意延伸聊聊。
Excel 日期表示
Excel 的日期内部存储为自然数,代表从 1900 年 1 月 0 日 开始的计算的某一天。
即:
- 0 代表 1900-01-00
- 1 代表 1900-01-01
- 2 代表 1900-01-02
- …
Excel 日期 BUG
但是由于历史原因(兼容 Lotus),有个永远不会被修复的 Bug 很出名,那就是 1900 年被日期函数认为是 “闰年”。
这导致了,60 这个数字,代表的就是 1900-01-29 这个日期。
Mac 版 的 Excel 默认使用 1904 日期系统,所以没有问题。