2016-07-10 18 views
1

在遊戲Screeps中,我遇到了一些內置函數的返回類型問題。看看下面的代碼: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的實例?

回答

1

Game.creeps不返回一個數組,它返回一個對象,其行爲作爲一個散列,其中creep名稱是鍵,creep是該值。這在API for Game.creeps中有記錄。如果您需要將它放在數組中,則可以遍歷該對象並將條目追加到數組中。

至於爲什麼creeps2 instanceof在模擬和實際遊戲中不同,很難說。但是,Array.isArray(creeps2)似乎在兩個環境之間表現一致(在兩個實例中都返回true)。