【问题标题】:Eloquent Javascript 2nd. Chapter 4. Computing Correlation. Final Analysis - [Variable Recursion & in operator] Pt 2雄辩的 Javascript 第二。第 4 章计算相关性。最终分析 - [变量递归和 in 运算符] Pt 2
【发布时间】:2014-10-10 20:55:05
【问题描述】:

我正在完成第 4 章 Eloquent Javascript 中第一个示例的结尾。这是完整的代码(这是我有疑问的最后一段,但我附上了第一部分以供参考)。

var journal = [];

function addEntry(events, didITurnIntoASquirrel) {
  journal.push({
    events: events,
    squirrel: didITurnIntoASquirrel
  });

function phi(table) {
  return (table[3] * table[0] - table[2] * table[1]) /
    Math.sqrt((table[2] + table[3]) *
              (table[0] + table[1]) *
              (table[1] + table[3]) *
              (table[0] + table[2]));
}

function hasEvent(event, entry) {
  return entry.events.indexOf(event) != -1;
}

function tableFor(event, journal) {
  var table = [0, 0, 0, 0];
  for (var i = 0; i < journal.length; i++) {
    var entry = journal[i], index = 0;
    if (hasEvent(event, entry)) index += 1;
    if (entry.squirrel) index += 2;
    table[index] += 1;
  }
  return table;
}

function gatherCorrelations(journal) {
  var phis = {};
  for (var entry = 0; entry < journal.length; entry++) {
    var events = journal[entry].events;
    for (var i = 0; i < events.length; i++) {
      var event = events[i];
      if (!(event in phis))
        phis[event] = phi(tableFor(event, journal));
    }
  }
  return phis;
}

var correlations = gatherCorrelations(JOURNAL);
console.log(correlations.pizza);

我的问题是:

  1. .events in 的目的是什么

    var events = journal[entry].events;

它会以递归的形式调用自身吗?如果是,为什么?难道我们不能只有 journal[entry] 并且该函数将运行从 tableFor 函数调用条目吗?它是否以一种重要的方式回调了 AddEntry 函数(其中 events 变量被建立)?

  1. (!(event in phis)) 的目的是什么。

我将其解读为:如果 phis 中的事件为真,则将其翻转为不为真,然后触发必要的 phi 计算。去掉 不是更有意义! (不等于)还是那段代码?如果我们已经有一个 for 循环,那么函数是否会在日志的最大长度之前运行并停止?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    var events = journal[entry].events; 您从数组journal 中索引entry 处的对象获取events 对象,并将其分配给名为events 的临时变量。

    这样做只是为了方便,因此您不必一直引用journal[entry].events。例如,稍后它有这一行:

    var event = events[i];
    

    会变成:

    var event = journal[entry].events[i];
    

    没有分配给临时变量。

    if(!(event in phis)) 正在测试对象phis 是否没有名称包含在变量event 中的属性。如果对象还没有该属性,则将其添加到下一行:

    phis[event] = phi(tableFor(event, journal));
    

    in operator

    这是一个非常简单的 sn-p 代码,可以帮助理解 in 运算符:

    var foo = {};
    console.log("bar" in foo);    // logs "false" because foo doesn't have a "bar" property
    foo.bar = 1;                  // or foo["bar"] = 1;
    console.log("bar" in foo);    // logs "true" because foo now has a "bar" property
    

    【讨论】:

    • 哇,非常感谢。
    【解决方案2】:
    1. .events in 的目的是什么

      var events = journal[entry].events;

    此声明的目的符合脚本编写方便和经济的 2 个概念。对象深度的每个级别都会增加调用时的整体调用时间。当然,现代浏览器在扁平化对象变量堆栈方面做了很多工作,但如果从逻辑上考虑,任何对 object1.object2["Memeber3"].object4 的调用都必须经过 4 个步骤才能获得值本身。将值扁平化为本地对象更经济。其次,代码的可读性(以及因此的可维护性)得到了增强,因为您没有额外的“journal [entry]”。堵塞你的表情。作为一般经验法则,如果您要在一个块中多次使用对象的一个​​成员,那么您应该为该成员创建一个局部变量。


    1. 目的是什么

      (!(phis 中的事件))。

    此评估的目的是确定特定成员(事件)是否不在对象(phis)中。在此示例中,如果确实缺少该成员,则下一行将创建该成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-25
      • 2018-12-04
      • 2013-12-12
      • 2012-10-23
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多