私は理由を理解しています:
output = new Array();
と
output = [];
しかし、なぜこれが機能するのですか?
output = Array();
私は理由を理解しています:
output = new Array();
と
output = [];
しかし、なぜこれが機能するのですか?
output = Array();
Array()
コンストラクターは単純に実装されているため、呼び出す必要new
はありません。これはセマンティック定義の一部です。
のような組み込みのコンストラクターArray()
は (おそらく) JavaScript で記述されていませんが、独自のコードで同じ効果を得ることができます。
function MyConstructor() {
"use strict";
var newObj = this || {};
// ...
return newObj;
}
で呼び出すとnew
、コンストラクターは、何かがバインドされていることを確認しthis
ます。そうしないと、this
未定義になります(「厳密な使用」のため。代わりに、がグローバルオブジェクトであるかどうかを確認できます。this
これは、古いIEで行う必要があります)。
コンストラクターからの戻り値はnew
式の値ではありません。これは常に新しく作成されたオブジェクトです。ただし、なしで呼び出すとnew
、戻り値が使用されます。
編集— RobG はコメントで、これが実際に適切にnewObj
機能するためには、関数が作成する「合成」を明示的に設定して、適切なプロトタイプなどを取得する必要があると指摘しています。コードでこれを行うのが最も簡単かもしれません。
function MyConstructor() {
"use strict";
if (!this) return new MyConstructor();
// ... or possibly using "apply" if you need parameters too
}
TJ Crowder は、オブジェクト/継承のラングリングに関する素晴らしい回答をここに書いています。
のような関数は、演算子Array()
なしで呼び出されたかどうかを検出するように記述でき、省略された場合は自動的に新しいオブジェクトを作成して返します。new
new
配列は関数であるため、output = Array()は機能します。
このcod3を実行します
<script>
var a = new Array();
var b = Array();
a[0] = 123;
b[0] = 32;
alert("a = " + a +"\nb = " +b +", " + Array);
</script>
これは印刷されます:
a = 123
b = 32, function Array() {
[native code]
}
したがって、Arrayは関数であるため、Array()を呼び出すことができます。これを実装すると、新しいArray()が返されます。
些細な答えは「ECMA-262がそう言っているから」です。RTFM。
1 つ目はArray 関数をコンストラクターとして呼び出し、2 つ目はArray 初期化子(別名 Array リテラル) です。
3 つ目はArray 関数を関数として呼び出しており、new Array()
およびと同等[]
です。