1

環境:Flex 3.6

このコードを見てください:

    var arr:Array = new Array()
    var t:Object = {number:"12345", id:"Public"};
    arr[t] = "Hello";

    for (var z:Object in arr)
    {
        if (z is String)
            trace("STRING");
        if (z is Object)
            trace("OBJECT");
        trace("z.number = " + z.number);
    }

出力:

STRING
OBJECT

その後、最後のtrace()呼び出しでクラッシュし、次のエラーが発生します。

ReferenceError: Error #1069: Property number not found on String and there is no default value

オブジェクトはフィールドの名前を保持することになっているのではありませんか?私が間違っているのは何ですか?

4

2 に答える 2

4

オブジェクトのfor(var key)ループには常にがあります。次に使用できるのはオブジェクトのタイプであり、コードは機能します。ArraykeyStringDictionarykey

 var arr:Dictionary= new Dictionary()
于 2013-01-17T12:51:36.783 に答える
0

配列の鍵は通常数字です。この線:

arr[t] = "Hello";

オブジェクトtを取得し、それを文字列に変換して配列のキーとして使用しているため、おそらく期待どおりに動作していません。取得するオブジェクトは、文字列「[objectObject]」に変換されます。

このコードにはいくつかの問題があります。

for (var z:Object in arr)
{
    if (z is String)
        trace("STRING");
    if (z is Object)
        trace("OBJECT");
    trace("z.number = " + z.number);
}

ZはObjectではなくString型である必要がありますが、配列内の各項目を確認し、forループではなくfor各ループを使用する場合。配列にはさまざまな型を含めることができるため、zは「*」型である必要があります。

最後に、z.numberのトレースは、zのタイプに関係なく実行されます。これは、zがオブジェクトである場合にのみ実行する必要があります。(また、配列内のすべてのオブジェクトにnumberプロパティがあると仮定します。)

arr[0] = "Hello";
arr[1] = t;

for each (var z:* in arr)
{
    if (z is String)
        trace("STRING");

    if (z is Object) {
        trace("OBJECT");
        trace("z.number = " + z.number);
     }
}
于 2013-01-17T21:45:14.973 に答える