2016-05-18 2 views
0

空のオブジェクトmyscrollvar myscroll = {}と定義されています。今、私はそれに配列プロパティを追加したいと思います。私は次のようにしました:javascriptで配列の値を直接設定できないのはなぜですか?

var myscroll = {} 

myscroll.point[0] = getScrollpos("home"); 
myscroll.point[1] = getScrollpos("artists"); 
myscroll.point[2] = getScrollpos("songs"); 
myscroll.point[3] = getScrollpos("beats"); 
myscroll.point[4] = getScrollpos("contact"); 

私はエラーmyscroll.pointが定義されていません。その後私は最初にそれをmyscroll.point = [];と定義し、その後コードが機能しました。

なぜ、配列の値を直接設定し、そのプロパティをjavascriptのオブジェクトに追加できないのですか?なぜそれを最初に独立して定義しなければならないのですか?

+0

Javascriptは、あなたが決して初期化しないと、正確に 'point'となるべきものが何であるか知っていますか?あなたは何らかの形でそれを推論させるために言語にルールを追加することができますが、*明示的なものは通常暗黙的なものより優れています* – deceze

答えて

4

オブジェクトプロパティを扱う場合、デフォルトでオブジェクトのプロパティにアクセスでき、そのプロパティの値は前に設定されていない場合はundefinedになります。したがって、インデックス(myscroll.point[0])で定義されていないプロパティにアクセスすると、未定義のプロパティ0にアクセスしようとしていますが、にはのプリミティブな値がありますので、TypeErrorになります。

結果として、プリミティブ値を未定義のオブジェクトプロパティに設定できますが、オブジェクトと同様に定義されていないプロペラではダイヤルできません。

またたいあなたを指し、以下のコードの最初のビューの状況から、同様の少しで状況を説明するために:

var obj = [] 
obj[0] = 10 

notDefinedObj[0] = 10 // cause ReferenceError 

配列はオブジェクトです。 JSでは、前にオブジェクトを初期化せずにオブジェクトのプロパティを変更/追加/削除することはできません。

これは、オブジェクトがメモリに格納されているために発生したもので、参照によってアクセスできます。例えば、新しい要素をリストに追加するなど、新しいプロパティを追加しようとすると、参照がない変数にプロパティをアタッチしようとしています。そのため、ReferenceErrorを取得しています。

Good Luck!

+0

あなたの答えは上手です。 obj.myprop.priceが未定義のオブジェクトにアクセスすると、未定義のさらなるプロパティ(または値)にアクセスすると、typeErrorがスローされるというcrockfordの同様の説明を思い出しました。 – user31782

0

あなたはmyscroll = {}ため)に定義されていないmyscrollpointプロパティにアクセスしようとしています。

コンソールmyscroll.pointとすると、undefinedが返されます。ここではundefinedに何かを入れようとしていたので、TypeError: myscroll.point is undefinedとなりました。

あなたはこのようmyscrollを定義する場合:

var myscroll = { 
     point : [] 
} 

次に、あなたのコードが動作すると、あなたはmyscroll.point = []を定義する必要はありません。

3

myscroll.pointmyscrollオブジェクトのpointプロパティにアクセスしようとしています。しかし、そのオブジェクトにはそのようなプロパティはありません。そのため、undefined is not an objectエラーメッセージ(またはブラウザに応じて同様のもの)が表示されます。

あなたはPHPから来ている場合、これは奇妙なことかもしれないが、実際にははるかに明示的に、例えば、以下のPHPスニペットに関与魔法よります:キーの

$myscroll = []; 
$myscroll['point'][0] = getScrollpos("home"); 
// ... 

PHP 自動的作成サブアレイ存在しない

更新comment

myscroll.mypoint = 5;myscroll.point[0] = getScrollpos("home");との間に有意な違いがあります。

最初のケースでは、myscrollから5に明示的にpointプロパティを設定します。しかし、2番目のケースでは、存在しないプロパティpoint[]演算子(配列演算子)にアクセスしようとしています。理論的にJavascriptはPHPと同じ魔法を使うことができ、配列を自動的にのように作成することができますが、そうではありません。それがあなたのエラーを取得する理由です。

mypropertymyscroll.mypointのように、myscroll.mypoint.mypropertyのようにアクセスしようとするのと同じです。 undefinedmyscrollにあるmypropertymypointにアクセスしようとしているため、これはうまくいきません。

+0

私はPHPを知らない。私の質問は、もし私が 'myscroll.mypoint = 5'を実行できるのであれば、なぜ' myscroll.point [0] = getScrollpos( "home"); '? 'myscroll.mypoint'にアクセスできれば、なぜ' myscroll.point [0] 'にアクセスできないのですか? – user31782

0

myscroll.point[0] = getScrollpos("home");Get the first element of the point array inside of myscroll and set it to..と理解できるため、存在しない配列の最初の要素にアクセスすることはできません。

0

typeofmyscrollに配列変数をチェックし、typeofmyscroll.pointをチェックしてください。配列外の配列のプロパティを割り当てようとしました。それは空またはundefinedです。

0

空のオブジェクトがあり、配列を保持する新しいプロパティを設定したい場合は、これを行う必要があります。

var obj = {}; 
obj['propertyName'] = []; 

これは、後で読み込むことができます配列を保持propertyNameを対応するプロパティを配置します。配列は、あなたの場合には、この

obj['propertyName'] = getScrolloops(); 

Idealyを行うことができますgetScrolloops()返す場合

あなたはこれを行うことができます。

obj['propertyName'] = [getScrollpos("home"), 
    getScrollpos("atrist"), 
    getScrollpos("songs"), 
    getScrollpos("beats"), 
    getScrollpos("contact") 
]; 

EDIT:説明:をなぜあなたのコードではありませんワーキング? としてはhereを説明した:

あなたはそれに値を割り当てることにより、プロパティを定義することができます。

あなたがしていることは、そのプロパティのインデックスに値を割り当てることによってプロパティを定義しようとしていることです。これは、自分自身のプロパティに値を割り当てず、存在しないプロパティのインデックスに割り当てるため、機能しません。

また、私はそれを達成するために両方のプロパティアクセサを使用できることに言及する必要があります。 Thisは役に立つリンクになる可能性があります。

関連する問題