javascript - 为什么在第二次测试中检查导入对象上的键失败?

标签 javascript node.js

所以,我有一个对象

let itemStore = {};
module.exports = itemStore;

和一些元素

let itemStore = require('./itemStore');
let item = function() {
  let a = Math.random();
  let self = {
    rand: a,
    b: 'hello world'
  };
  itemStore[a] = self;
  return self;
}
module.exports = item;

我创建了一个项目并将其自身存储在商店对象中。我不太喜欢这个模式,但我继承了这个项目。

所以我遇到了问题并编写了这个测试用例:

(function() {
  'use strict';
  let item = require('./item.js');
  let itemStore = require('./itemStore.js');

  let inspect = function() {
    return Object.keys(itemStore).length;
  }
  let equals = function(a, b) {
    console.log("Expected " + b + ", was " + a);
  }

  let test = function() {
    equals(inspect(), 0);
    let subject = item();
    equals(inspect(), 1);
    let subject2 = item();
    equals(inspect(), 2);
    itemStore = {};
    equals(inspect(), 0);
  }
  test();
  console.log('-----------------');
  test();
})();

然后通过运行

node itemTest.js

我得到了这个奇怪的输出:

Expected 0, was 0
Expected 1, was 1
Expected 2, was 2
Expected 0, was 0
-----------------
Expected 0, was 0
Expected 1, was 0
Expected 2, was 0
Expected 0, was 0

你看,第二轮我莫名其妙。

我把它放在了github上: https://github.com/janlimpens/js_static

最佳答案

item.js使用的itemStoreitemStore.js导出的对象:

let itemStore = require('./itemStore');
...
itemStore[a] = self;

itemTest 中,您将 itemStore 重新分配给一个空对象,该对象与 中使用的 itemStore 断开连接 item.jstest 函数的最后:

let itemStore = require('./itemStore.js');
...
let test = function() {
  ...
  itemStore = {};  // <---- itemStore is a new object,\
                   // disconnected from the one in itemStore.js
  equals(inspect(), 0);
}

新的空 itemStore 对象只能在 itemTest.js 中引用 - item.js 将继续引用在其他模块itemStore.js。因此,进一步调用 item() 会将项目放在旧对象上,而不是新对象上 - 而您的 inspect() 将检查在第一次 test() 调用结束时重新分配后的新对象。

要么根本不重新分配 itemStore,要么让 itemStore.js 导出一个允许重新分配它使用的对象的函数(同时具有另一个函数,在调用时返回它正在使用的当前对象)。

关于javascript - 为什么在第二次测试中检查导入对象上的键失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57829444/

相关文章:

javascript - ES6 导入/导出语法的困难

javascript - 即使控制台日志识别出具有长度的 Else if 语句也将运行

javascript - 在 Express.js 中使用相同的响应对象发送多个响应

node.js - 当 Electron 应用程序关闭时,如何从 main 发送消息进行渲染

javascript - 无法从 github insights 页面抓取贡献者 div

node.js - Nodejs AsyncLocalStorage getStore() 返回未定义

javascript - 填充隐藏的表单输入 onClick

javascript - For循环取javascript中对象属性的平均值

javascript - Chart.js 的新扩展语法是什么?

javascript - 如何在 javascript 中的音频 blob 上设置编解码器、采样率和比特率?