在游戏Screeps中,我遇到了一些内置函数返回类型的问题。请使用以下代码:
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
为什么并非所有这些函数都返回Array
的实例?世界环境中甚至有Array
的不同版本?有没有办法将结果转换为Array
?
答案 0 :(得分:1)
Game.creeps不返回数组,它返回一个表现为哈希的对象,其中creep名称是键,creep是值。这在API for Game.creeps中有记录。如果您需要将它放在数组中,则可以遍历该对象并将条目附加到数组中。
至于为什么creeps2 instanceof在模拟中与实际游戏不同,很难说。但是,Array.isArray(creeps2)似乎在两个环境之间保持一致(在两个实例中都返回true)。