已經有一個答案發布到測試本身,可以找到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"]
- 我期望的值。這個隱藏的第三個值在哪裏,我如何訪問它?
所以,我想我最終有兩個問題:
- 爲什麼不爲我工作與其他問題的答案?
- 第一次測試和第二次測試有什麼不同?
但是,如果你將一個['hasOwnProperty'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/HasOwnProperty)投入混合,你可以解決原型問題。 – 2012-02-17 09:11:00
@ muistooshort:如果有人向你的數組中添加一些其他屬性,你仍然有問題:'a = []; a.alive = false;'。我認爲只是使用普通的'for'循環或 - 更好 - 適當的高階函數('forEach','map','filter','reduce' ...等)是最好的方法。 – 2012-02-17 09:14:13
我不同意你的看法,使用'for ... in'作爲數組沒有太大意義,它更多的是使用'for ... in'而不包含'hasOwnProperty'幾乎總是檢查不管你是否應該使用'for ... in',都是一個錯誤。 – 2012-02-17 09:17:52