typeof演算子
①1行目では、『aaa』が定義されているかどうかを確認?
②2行目では、もし定義されていなかったら定義する?
③『var aaa = {}』の『{}』これが定義ということなのでしょうか?
JavaScript
1if (typeof aaa === "undefind") {
2 var aaa = {}
3}
typeof aaa === "undefind"
が成立する状況はほぼありません。
typeof演算子が "undefind" を返す実装は私の知る限りではありませんが、仕様上はObject型になり、この文字列を返す実装が存在する可能性はあります。
typeof aaa === "undefined"
ならば、「変数 aaa が未定義」もしくは「変数 aaa の値が undefined」である場合に true を返します。
従って、変数 aaa が定義済であっても true になりえます。
ただし、定義済み変数との衝突が許されるには、var文で変数定義している場合であり、let/constでは多重定義が許可されません。
HTML
1<script>
2'use strict';
3var foo;
4
5if (typeof foo === "undefined") {
6 var foo = {}
7}
8console.log(foo); // {}
9</script>
10<script>
11'use strict';
12let bar; // SyntaxError: Identifier 'bar' has already been declared
13
14if (typeof bar === "undefind") {
15 var bar = {}
16}
17console.log(bar);
18</script>
変数定義は「変数文」で実行されます。
プロパティアクセサ
もう一点、『aaa.bbb』の場合は『var aaa.bbb』にはならないみたいなのですが、なぜなのでしょうか?
javascript
1if(typeof aaa === "undefind"){
2 var aaa = {}
3}
4if(typeof aaa === "undefind"){
5 aaa.bbb = {}
6}
プロパティを参照するには、当該プロパティを格納可能なオブジェクトが変数定義されていなければなりません。
aaaという名前の変数が存在しなければ、aaa.bbb
のプロパティ参照は失敗します。
var aaa.bbb
は「変数 aaa.bbbを定義する」という意味になり、変数名に"."を含めることはできない為、失敗します。
変数定義文の中で特定のプロパティを持つオブジェクトを定義することは可能です。
javascript
1var aaa = {bbb:{}};
Re: k-teratail さん