Screeps 内置函数没有 return 预期的类型

Screeps built-in functions don't return expected types

在游戏 Screeps 中,某些内置函数的 return 类型存在一些问题。取以下代码:

var creeps1 = Game.creeps
var room = Game.rooms[myRoomName];
var creeps2 = room.find(FIND_CREEPS);

console.log(creeps1.constructor.name);
console.log(creeps1 instanceof Array);

console.log(creeps2.constructor.name);
console.log(creeps2 instanceof Array);

console.log([].constructor.name);
console.log([] instanceof Array);

您希望这些都是数组,因此都是 Array 的实例。然而在世界游戏中,我得到以下结果(myRoomName 设置为我有权访问的房间的名称):

// Results in world
[1:11:11 AM] Object
[1:11:11 AM] false
[1:11:11 AM] Array
[1:11:11 AM] false
[1:11:11 AM] Array
[1:11:11 AM] true

但是等等,它变得更奇怪了。当我在模拟运行同样的代码时(这次myRoomName'sim'),得到如下结果:

// Results in simulation
[1:11:11 AM] Object
[1:11:11 AM] false
[1:11:11 AM] Array
[1:11:11 AM] true
[1:11:11 AM] Array
[1:11:11 AM] true

为什么所有这些函数 return 都不是 Array 的实例?世界环境中怎么会有不同版本的Array?有没有办法将结果转换为 Array 的实例?

Game.creeps 不是 return 数组,它 return 是一个对象,表现为散列,其中 creep 名称是键,creep 是值。这记录在 API for Game.creeps 中。如果您需要将它放在数组中,您可以遍历对象并将条目附加到数组。

至于为什么 creep2 instanceof 在模拟和实际游戏中不同,很难说。然而,Array.isArray(creeps2) 似乎在两种环境之间表现一致(return在两种情况下都是正确的)。