JavaScript运行时间是否缓存/优化嵌套对象访问?

问题描述 投票:0回答:1

可选上下文

我正在编写一个工具,该工具会生成用于自动验证Typescript类型的代码,所以我想知道我生成的代码是否有效。

当前,我的工具输出以下代码:

const newVersion = (p0) =>
  !!p0 &&
  Object.prototype.hasOwnProperty.call(p0, "a") &&
  !!p0["a"] &&
  Object.prototype.hasOwnProperty.call(p0["a"], "b") &&
  !!p0["a"]["b"] &&
  Object.prototype.hasOwnProperty.call(p0["a"]["b"], "c") &&
  typeof p0["a"]["b"]["c"] === "object" &&
  p0["a"]["b"]["c"] !== null &&
  !!p0["a"]["b"] &&
  Object.prototype.hasOwnProperty.call(p0["a"]["b"], "d") &&
  !!p0["a"]["b"]["d"] &&
  Object.prototype.hasOwnProperty.call(p0["a"]["b"]["d"], "e") &&
  typeof p0["a"]["b"]["d"]["e"] === "number";

以验证此Typescript类型

a: { b: { c: {}; d: { e: number } } };

实际问题

[如果我有以下内容:p0["a"]["b"]["c"] === some_value,几行后我要执行p0["a"]["b"]["c"]["d"] === another_value,那么Javascript引擎(其中Javascript引擎= Chrome / Safari / Firefox中的内容)会记住我访问了[C0 ]并使用它来使第二次访问更快。

因为如果不是上述情况,那么我将更改代码生成以输出类似这样的内容(与上面的代码不完全相同,但是相似):

p0["a"]["b"]["c"]

作为旁注:括号访问和点式访问之间有速度差异吗?我知道这些东西通常无关紧要,但是我认为,由于我正在执行自动代码生成,因此不妨进行微优化。

javascript benchmarking
1个回答
0
投票

只是一般建议:为什么不使用循环代替

    const old =  p12 => {
    if (!Object.prototype.hasOwnProperty.call(p12, "a") || !(p18 => {
      if (!Object.prototype.hasOwnProperty.call(p18, "b") || !(p21 => {
        if (!Object.prototype.hasOwnProperty.call(p21, "c") || !(p22 => {
          return true;
        })(p21.c)) return false;
        if (!Object.prototype.hasOwnProperty.call(p21, "d") || !(p23 => {
          if (!Object.prototype.hasOwnProperty.call(p23, "e") || !(typeof p23.e === "number")) return false;
          return true;
        })(p21.d)) return false;
        return true;
      })(p18.b)) return false;
      return true;
    })(p12.a)) return false;
    return true;
  }
© www.soinside.com 2019 - 2024. All rights reserved.