所以,我有一个对象
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
使用的itemStore
是itemStore.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/