引数を使用してプリミティブ値にcall()
設定するとthis
、そのプリミティブ値は常にオブジェクトに変換されるため、プリミティブ文字列ではなく文字列オブジェクトが取得されます。
String {0: "t", 1: "e", 2: "s", 3: "t", length: 4, ...
call()
on MDNのドキュメントには、次のように記載されています。
thisArg関数の呼び出しに提供される
値
これは、メソッドによって表示される実際の値ではない可能性があることに注意してください。メソッドが非厳密モード コードの関数である場合、グローバル オブジェクトに置き換えられ、プリミティブ値がオブジェクトに変換されます。this
null
undefined
したがって、非厳密モードでは、プリミティブ文字列値がオブジェクトに変換されます。これは、ECMA 標準の Annex Cでも指定されています。
厳密モードの制限と例外が厳密モード コード内で評価される
場合値はオブジェクトに強制されません。または
の this 値はグローバル オブジェクトに変換されず、プリミティブ値はラッパー オブジェクトに変換されません。関数呼び出し ( および を使用して行われた呼び出しを含む) を介して渡さ
たた値をオブジェクトに強制しません。this
this
null
undefined
this
Function.prototype.apply
Function.prototype.call
this