2012-02-17 28 views
5

已經有一個答案發布到測試本身,可以找到here,但我似乎無法弄清楚爲什麼這個答案是正確的。無法理解Javascript中的反射測試Koans

那是給我找麻煩了test的部分是:

var keys = []; 
var fruits = ['apple', 'orange']; 
for(propertyName in fruits) { 
    keys.push(propertyName); 
} 
ok(keys.equalTo(['__', '__', '__']), 'what are the properties of the array?'); 

的(顯然)正確答案,如上面的鏈接的問題指出是

ok(keys.equalTo(['0', '1', 'fruits.prototype'), 'what are the properties of the array?'); 

我試圖將答案 - 修正了語法錯誤 - 我的測試仍然失敗。

在相同的測試文件,另一個測試是幾乎完全相同,答案是什麼,我會想到它是:

test("property enumeration", function() { 
    var keys = []; 
    var values = []; 
    var person = {name: 'Amory Blaine', age: 102, unemployed: true}; 
    for(propertyName in person) { 
     keys.push(propertyName); 
     values.push(person[propertyName]); 
    } 
    ok(keys.equalTo(['name','age','unemployed']), 'what are the property names of the object?'); 
    ok(values.equalTo(['Amory Blaine',102,true]), 'what are the property values of the object?'); 
}); 

我可以在這兩個測試之間看到的唯一區別是,第二種是通過一個對象而不是一個數組。

我從第一次測試(單元測試框架之外)運行代碼並輸出密鑰的值,它顯示爲["0","1"] - 我期望的值。這個隱藏的第三個值在哪裏,我如何訪問它?

所以,我想我最終有兩個問題:

  1. 爲什麼不爲我工作與其他問題的答案?
  2. 第一次測試和第二次測試有什麼不同?

回答

2

聲明:我很肯定這是對的,但沒有打擾過測試它。你可以試試我的答案,因爲你已經完成了測試?

看着GitHub上的文件,有一個名爲koan.js的助手腳本。我假設它在測試之前被加載,因爲我懶得自己運行它們:P。 (這是在support目錄。)

在這個文件中,對所有的數組定義了一個名爲equalTo方法:

Array.prototype.equalTo = function(compareTo) { ... } 

因此,問題的答案:

  1. 因爲答案到另一個問題是錯誤的。完全誤導。等
  2. 因爲方法定義在Array而不是Object

似乎有點不知所措。

如果你在原型上定義了這樣的函數,它將被所有數組繼承。嘗試在控制檯中定義類似的內容,然後評估[].equalTo。然後,更多的樂趣,嘗試這樣的:由於這種方法是在原型定義中,循環遍歷它,以及

for (x in []) console.log(x) 

。所以答案是,測試可能是0, 1, 'equalTo'。但是,如果使用for循環檢查hasOwnProperty,它自然不會遍歷該方法。

這實際上是關於沒有使用for in來遍歷數組:)實物教學課。你永遠不知道會發生什麼事......巧合的是,這就是爲什麼prototype.js失寵,儘管它實際上是一個很好的框架。

+0

但是,如果你將一個['hasOwnProperty'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/HasOwnProperty)投入混合,你可以解決原型問題。 – 2012-02-17 09:11:00

+0

@ muistooshort:如果有人向你的數組中添加一些其他屬性,你仍然有問題:'a = []; a.alive = false;'。我認爲只是使用普通的'for'循環或 - 更好 - 適當的高階函數('forEach','map','filter','reduce' ...等)是最好的方法。 – 2012-02-17 09:14:13

+0

我不同意你的看法,使用'for ... in'作爲數組沒有太大意義,它更多的是使用'for ... in'而不包含'hasOwnProperty'幾乎總是檢查不管你是否應該使用'for ... in',都是一個錯誤。 – 2012-02-17 09:17:52