teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

関数とコンストラクタ

2020/05/06 17:48

投稿

think49
think49

スコア18194

answer CHANGED
@@ -1,3 +1,5 @@
1
+ ### 関数呼び出し
2
+
1
3
  > ```JavaScript
2
4
  > console.log(Boolean("string")); //=> true
3
5
  > ```
@@ -5,4 +7,31 @@
5
7
  いずれも「コンストラクタ呼び出し」はされていません。
6
8
  「関数呼び出し」です。
7
9
 
10
+ ### 関数はコンストラクタの性質を併せ持つ
11
+
12
+ 関数定義の仕方によって違いはありますが、全ての関数はコンストラクタでもあるのが原則です。
13
+ コンストラクタ呼び出しできるなら、コンストラクタといえますし、関数呼び出しできるなら、関数といえます。
14
+ `Boolean()` は両方の性質を持ちます。
15
+
16
+ ```JavaScript
17
+ new Boolean; // コンストラクタ呼び出し
18
+ Boolean(); // 関数呼び出し
19
+ ```
20
+
21
+ ### 関数またはコンストラクタの性質を持つ場合
22
+
23
+ 例外として、一部のビルトイン関数はいずれか一つの呼び出しのみを許可しています。
24
+
25
+ ```JavaScript
26
+ Map(); // TypeError: Constructor Map requires 'new'
27
+ new parseInt; // TypeError: parseInt is not a constructor
28
+ ```
29
+
30
+ ユーザ定義としては、アロー関数やclass構文も例外に入ります。
31
+
32
+ ```JavaScript
33
+ new (()=>{}); // TypeError: (intermediate value) is not a constructor
34
+ (class {})(); // TypeError: Class constructors cannot be invoked without 'new'
35
+ ```
36
+
8
37
  Re: ohs6261 さん