小编mog*_*rod的帖子

JavaScript引擎是否优化闭包中定义的常量?

想象一下,我有一个函数可以访问常量(永不突变)(例如,查询表或数组)。在函数范围之外的任何地方都不会引用该常数。我的直觉告诉我,应该在函数范围之外定义此常量(下面的选项A),以避免在每次函数调用时都(重新)创建该常量,但这确实是现代Javascript引擎的工作方式吗?我想认为现代引擎可以看到该常量从未修改过,因此只需创建和缓存一次(是否有此术语?)。浏览器是否以相同的方式缓存闭包中定义的功能?

在访问函数的位置旁边(选项B),简单地在函数内部定义常量是否有不可忽略的性能损失?对于更复杂的对象情况是否有所不同?

// Option A:
function inlinedAccess(key) {
  const inlinedLookupTable = {
    a: 1,
    b: 2,
    c: 3,
    d: 4,
  }

  return 'result: ' + inlinedLookupTable[key]
}

// Option B:
const CONSTANT_TABLE = {
  a: 1,
  b: 2,
  c: 3,
  d: 4,
}
function constantAccess(key) {
  return 'result: ' + CONSTANT_TABLE[key]
}
Run Code Online (Sandbox Code Playgroud)

实际测试

我创建了一个jsperf测试,比较了不同的方法:

  1. Object -内联(选项A)
  2. Object -常数(选项B)

@jmrk建议的其他变体:

  1. Map -内联
  2. Map - 不变
  3. switch -内联值

初步发现(在我的机器上,请自行尝试):

  • Chrome v77:(4)是迄今为止最快的,其次是(2)
  • Safari v12.1:(4)的速度比(2)略快,跨浏览器的性能最低 …

javascript optimization performance v8

6
推荐指数
1
解决办法
147
查看次数

从 string=>type 的映射推断反应道具类型时修复打字稿警告

我有一个名为 React 的组件Field,用于呈现各种类型的表单输入,包括通过其他 React 组件实现的自定义输入。输入的类型由 确定type,它可以是一个已知字符串(keyof FIELD_TYPES,它反过来决定要创建的 React 组件)或任何类型的 React 组件(基于函数或类)。这已经实现了,但是我在尝试为实现提供正确的类型时遇到了一些问题。请注意,目标之一是确保正确推断道具,以便智能感知可以建议结果元素的有效属性。

这个代码沙盒展示了我正在尝试修复的 3 个不同的 Typescript 警告。每个问题都附有// FIXME注释;

(1) & (2):类型 X 不能用于索引类型 'Y' - 到目前为止,我一直无法在这里找到满足 Typescript 的方法。

(3): Typescript 不接受自定义组件 - 不确定如何修改类型以允许这样做。

我也尝试过使用区分联合,但在尝试推断组件的 props 时遇到了困难,因为它是type通过FIELD_TYPES映射传递或解决的。使用这种方法的答案也很有效。

const FIELD_TYPES = {
  text: "input",
  checkbox: "input",
  textarea: "textarea",
  custom: Custom
} as const;
type FieldTypeMap = typeof FIELD_TYPES

type KeysOfType<T, K> = { [I in keyof T]: T[I] extends …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs typescript-generics typescript-typings

5
推荐指数
1
解决办法
174
查看次数