- ベストアンサー
JSのプロパティにはなぜ''がいらないのか?
- JSのプロパティにはなぜ''がいらないのか?文字列ではない理由を解説します。
- 変数、オブジェクト、配列の再代入時にletを省略できる理由を解説します。
- 再宣言のlet省略と再代入を区別する方法について解説します。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
> これは二度目はvarを省略して、再宣言していると考えるのは間違えで、これは100%再代入と考えてよいという事でしょうか? はい、var が無い場合は変数の宣言ではなく、代入演算子を使った処理です。 > letは再代入は化で、再宣言は不可という事なので再宣言のlet、const省略はないですが、varの場合はどうですか? let はブロックスコープの「変数」なので、中の値はいつでも書き換え可能です。 再宣言は ECMAScript の規定でエラーにすることになっているので不可です。 const は「定数」なので、一度宣言して値をセットしたら変更不可能なので再宣言も再代入もできません。 var は「変数」なので、中の値はいつでも書き換え可能です。 再宣言については var は出来るのですが、言語エンジン内での処理としては var 宣言を無視するだけです。 これも ECMAScript の規定で定められており、var の処理としては「変数が存在しなければ変数を作る」と言う事になっているので、変数が存在したら新たに作ることはせず次の処理に進むだけです。 var と let の扱いの違いは歴史的なものもあって複雑な話なのですが、後から出てきた let の方が他のプログラム言語と同じ厳密な振る舞いになっていて、古くから存在する var は JavaScript 特有の緩い振る舞いをしています。
その他の回答 (6)
- b0a0a
- ベストアンサー率49% (156/313)
そもそも、「再宣言」という言葉をこれ程普通に使うこと自体があり得ません。 varでは何回宣言文を書いても意味はありませんし、letやconstではエラーとなります そのため「再宣言する」ということ自体が、それは意味が無いことだよと言う以外に意味のないことなのです 運動会の開催宣言を2回することを考えたとしましょう。 そしてそれを「再宣言」と呼ぶことの滑稽さが分かりますか? それはただ宣言を二回しただけです。 「再宣言」というとさも意味のあるように聞こえますが、 実際意味は無いですし、普通に使われる言葉ではないので、 使うと何の意図があって言っているのかと驚かれるかもしれませんよ。
お礼
再宣言にも必ずvarが必要で、varの省略という概念自体がなく、 varがないものはただの代入であるという事ですね。 こちらの認識はまず正しいのですね。 そして再代入は良く行うものの再宣言という行為はほとんど行われなという事ですね。 単語としても使われないというのはびっくりしました。
- b0a0a
- ベストアンサー率49% (156/313)
100%再代入ですよ。 varやletが付いた文を宣言文と言うので、付かなければ宣言になりようがありません。 sloppyモード(非strictモード)中では変数宣言なしに変数を代入するとグローバル変数となりますが、それも宣言とは言いません。 varの場合は何度も宣言することが許されていますが、別に2つ目、3つ目のvarが意味を持つことはありません。
お礼
>> varやletが付いた文を宣言文と言うので、付かなければ宣言になりようがありません。 一度宣言をしておけばvarは次から省略できるという情報は嘘だったのですね。 再宣言にも必ずvarが必要で、varの省略という概念自体がなく、 varがないものはただの代入であるという事ですね。
- bya00417
- ベストアンサー率34% (58/170)
> すると再宣言とは実は再代入の事を示す別の言い方になるのでしょうか? そもそも再宣言は Syntax Error になり、その場で処理が中断します。 先の回答にも書いた通り let はブロックスコープなので、ブロックが異なれば別変数として扱われるので、あなたが再宣言だと思っているのは実は別ブロックで宣言が行われているものじゃないでしょうか。
お礼
var a = 1 a = 2 というソースをよく見るのですが、これは二度目はvarを省略して、 再宣言していると考えるのは間違えで、 これは100%再代入と考えてよいという事でしょうか? letは再代入は化で、再宣言は不可という事なので再宣言のlet、const省略はないですが、varの場合はどうですか?
- b0a0a
- ベストアンサー率49% (156/313)
『再宣言とは実は再代入の事を示す』ということもあり得ません。 「宣言」と「代入」は別の独立した事柄です。 変に混乱しているようですが、話はシンプルです。 let abc これが宣言 abc = 123 これが代入 let abc = 123 これは宣言して代入(初期化) ただし、 let abc は実際は let abc = undefined の省略形と考えてください letは再代入は可能です。再宣言が不可なのです。 constの場合は、再代入も不可です
お礼
var a = 1 a = 2 というソースをよく見るのですが、これは二度目はvarを省略して、 再宣言していると考えるのは間違えで、 これは100%再代入と考えてよいという事でしょうか?
- bya00417
- ベストアンサー率34% (58/170)
プロパティ名に '' が必用無いのは、それがデータでは無いからです。 変数を宣言する時に変数名に '' を付けないのと同じと考えましょう。 そもそもプロパティとはオブジェクト内の変数の事ですから、プロパティ名は変数名と同義です。 データを変数に代入する時は、変数名なのかデータなのかを区別する必要があるのでデータの場合は '' で囲って区別させているのです。 let はブロックスコープの変数を新たに使用開始する宣言(命令)です。 JavaScript 言語エンジンは let を見つけるとメモリ上に変数保存領域を確保します。 一度宣言されt変数に新たな値を入れる場合、すでにメモリ上に保存領域が確保されているので新たな領域確保は必要ないので let が不要と言うことになります。 > また再宣言のlet省略と再代入が同じ見た目でこんがらがる let で作られた変数はブロックスコープです。 例えば function hoge () { let abc = 0; } function fuga () { let abc = 100; } と、違うブロック内( { から } の間)で宣言された abc 変数は、別物として扱われるため、それぞれが独立して異なる内容を保持できますので、どのブロックに属する変数なのかについて注意する必要があります。
お礼
>>> そもそもプロパティとはオブジェクト内の変数の事ですから、プロパティ名は変数名と同義です。 データを変数に代入する時は、変数名なのかデータなのかを区別する必要があるのでデータの場合は '' で囲って区別させているのです。 プロパティとはオブジェクト内の変数の事だったんですね。 それは知りませんでした。 つまり オブジェクトの外:中 プロパティ:変数 プロパティ名:変数名 プロパティの値:変数の中の値 関数:メソッド と同じという関係になっているという事でしょうか? 確かに変数名は文字列と区別するために''はつけないですね。 よってプロパティ名も''を付けないという事ですね。 >>> let はブロックスコープの変数を新たに使用開始する宣言(命令)です。 JavaScript 言語エンジンは let を見つけるとメモリ上に変数保存領域を確保します。 一度宣言されt変数に新たな値を入れる場合、すでにメモリ上に保存領域が確保されているので新たな領域確保は必要ないので let が不要と言うことになります。 一度目にlet name =と宣言した時点でメインメモリーの一部の領域をname変数が確保しているので、 name変数に別の値を再代入、上書きをしたい時は宣言letは不要という事ですね。 すると再宣言とは実は再代入の事を示す別の言い方になるのでしょうか? イコールと考えてよいのですかね?
- b0a0a
- ベストアンサー率49% (156/313)
プロパティ名に関しては文字列ですが、省略できるというだけです。クォーテーションを付けても構いませんよ。 letに関しては省略できるのではなく、2度使ってはいけない決まりです。 一度しか宣言できません。再宣言と言うことはできません。
お礼
letは再代入が不可ですが再宣言も不可なのでしたっけ? もしかして、再宣言とは実は再代入の事を示す別の言い方になるのでしょうか? イコールと考えてよいのですかね?
お礼
a = 2は再代入なので、 二度目からの再宣言はvarの省略ができるという情報は間違えなのですかね。 varがなければ必ず再代入で、 varがあれば必ず宣言。二度目なら再宣言という事ですね。
補足
varのみ再宣言ができるが、言語エンジン内での処理としては var 宣言を無視するという事ですが、 無視とはvarを無視して再代入として考えるという事ですか? それとも再宣言自体がなかったことにするという事でしょうか? ブロックスコープと関数スコープのさもなんだかよくわからないのですが、 教えていただければ幸いです。