2012-02-17 16 views
5

hereというテスト自体に回答がありますが、なぜ答えが正しいのかわかりません。その答えは正しいです。JavaScriptの反射テストを理解するのに問題がある

私に迷惑を与えている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"]として表示されていました。この隠された第3の値はどこにあり、どのように私はそれにアクセスできますか?

  1. なぜ他の質問から答えは私のために働いていません。

    だから、私は私が最終的に二つの質問を持っていると思いますか?

  2. 最初のテストと2番目のテストの違いは何ですか?

答えて

2

免責事項:私はこれが正しいと確信していますが、テストするのは面倒ではありません。あなたはテストを実行しているので、私の答えを試すことができますか?

GitHubのファイルを見ると、koan.jsというヘルパースクリプトがあります。私はテストの前にロードされていると仮定しています。自分自身を実行するのが面倒だからです。 (。それはsupportディレクトリにあります)

このファイルでは、方法があるすべてのアレイ上に定義equalTo呼ば:ご質問

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

だから、答えを:

  1. 答えているのでもう一つの質問には間違っていた。完全に間違っている。等
  2. ではなく、Arrayにメソッドが定義されているためです。

少しうんざりしているようです。

このような関数をプロトタイプで定義すると、すべての配列に継承されます。そのようなものをコンソールに定義してから、[].equalToを評価してみてください。この方法は、ループを反復処理は同様にそれの上に、プロトタイプに定義されているので

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

:そして、より多くの楽しみのために、のようなものを試してみてください。したがって、答えはおそらく0, 1, 'equalTo'です。しかし、hasOwnPropertyチェックでforループを使用すると、当然、そのメソッドに対して反復処理は行われません。

これは実際には、配列に対して繰り返し処理するためにfor inを使用しないことに関するオブジェクトレッスンです。あなたは何が入ってくるのか決して知らないのです...同時に、これはprototype.jsが実際に素敵なフレームワークであるにもかかわらず賛成できなくなった理由です。

+0

しかし、['hasOwnProperty'](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Object/HasOwnProperty)をミックスに投げると、プロトタイプの問題を回避することができます。 –

+0

@muistooshort:あなたの配列に他のプロパティを追加しても、まだ問題があります: 'a = []; a.alive = false; '。通常の 'for'ループを使うか、適切な高次関数(' forEach'、 'map'、' filter'、 'reduce'など)を使うのが最良のアプローチです。 –

+0

私はあなたに同意していません。配列の 'for ... in'を使うのはあまり意味がありません。ほとんどの場合、' hasOwnProperty'チェックをほとんど使わずに 'for ... in'を使うことが重要ですfor ... in'を使うべきかどうかは間違いです。 –

関連する問題