引用符付きと引用符なしのオブジェクトキーの違いは何ですか?


209

違いはありますか

obj = {'foo': 'bar'} 

そして

obj = {foo: 'bar'}

-引用符を使用しないと、キーで使用できないことに気づきました。しかし、実際に違いはありますか?はいの場合、どちらですか?

回答:


136

いいえ、引用符で違いはありません(ご指摘のとおり、有効なJavaScript識別子ではないキーを使用する場合を除きます)。

補足として、JSONデータ交換形式で 、識別子を二重引用符で囲む必要あります(単一引用符使用できませ)。


88
実際、数値リテラルをプロパティ名として使用する場合、引用符違い生む可能性があります。たとえばobj = { 12e34: true };、はと同じではありませんobj = { '12e34': true };。前者の場合はを介してプロパティにアクセスする必要がありますがobj['1.2e+35']、後者の場合はを使用しますobj['12e34']詳細については、私の回答を参照してください。
Mathias Bynens、2012年

1
真実ですが、zの最初の文字+英数字を指定して二重引用符がオプションである場合、それは素晴らしいでしょう。深くネストされていないデータに最適です。
Jason Sebring

124

非上場プロパティ名/ JavaScriptでオブジェクトキー、私の書き込みアップテーマに:

プロパティ名が数値リテラルまたは有効な識別子名である場合のみ、引用符を省略できます。

[…]

ブラケット表記は、すべてのプロパティ名に安全に使用できます。

[…]

ドット表記は、プロパティ名が有効な識別子名である場合にのみ使用できます。

ES5では、予約語を引用符で囲まれていないプロパティ名として使用できることに注意してください。ただし、ES3との下位互換性のために、とにかく引用することをお勧めします。

また、指定したプロパティ名を引用符なしで、またはドット表記で使用できるかどうかを通知するツールも作成しました。mothereff.in/js-properties試しください。

スクリーンショット


このツールは命の恩人でした。これを投稿してくれてありがとう。
Chris Christensen

私は崖から降りる途中で、非常に急な坂を下って落下し、特定の完全な流血の死に向かって歩いていきました。残念ながら、私はあなたの答えのリンクをクリックしました。そのリンクには非常に単純なJSツールが含まれており、そのために崖から落ちることができませんでした。このツールは命の恩人でした。
Andrew

8

ここで違いはありません。スタイルの問題。これを行う理由の1つは、「super」または「class」が予約済みキーワードであるため、キーとして使用できることです。

一部の人々は、空白を含む文字列を渡してo ['I can can whitespace']を呼び出すように誘惑されるかもしれませんが、私はそれを悪い習慣と呼びます。


3

いいえ、JavaScriptではありません。ただし、キーを囲む引用符が存在しない場合、一部のJSONパーサーは失敗します。


35
JSONでは、引用符のないキーは無効です。
Ned Batchelder

1

それらが異なるいくつかの状況があります。たとえば、jQueryを使用していて、jQuery $()コマンドを呼び出して要素を作成するときに渡すパラメーターのリストを作成している場合、引用符で囲まれた単語はパラメーターに変換され、引用符で囲まれていない単語は関数に変換されます。たとえば、「サイズ」はオブジェクトのサイズ属性を設定し、サイズ(引用符なし)はオブジェクトのsize()関数を呼び出します。下部にあるjQuery()を参照してください。

2番目の引数は便利ですが、その柔軟性により意図しない結果が生じる可能性があります(たとえば、$( " <input>"、{size: "4"})は、size属性を設定する代わりに.size()メソッドを呼び出します)。したがって、前のコードブロックは次のように書くことができます。


私はその例があなたがそれが言うと思うことを言っているとは思わない。引用した問題は、jQueryにsizeと呼ばれるメソッドがあり、メソッドサイズと属性サイズの競合はメソッドを選択することで解決されるためです。を文字列または別のタイプとして渡すとjQueryで動作が変更される場合がありますが、引用符内ではなく引用符内の有効なプロパティ名でプロパティを定義することはできません。
Alex Weitzer、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.