javascript - Function.prototype.call modifică typeof this, în afara modului strict; de ce?


var example = function () {
  console.log(typeof this);
  return this;
};

În modul strict: example.call('test') # afișează 'string'

Altfel, example.call('test') # afișează 'object'

Totuși, console.log(example.call('test')) afișează test (așa cum te-ai aștepta)

De ce schimbă Function.call typeof 'test' === 'string' legat de this în interiorul example?

Răspuns #1

Când folosești call() și setezi argumentul this la o valoare primitivă, acea valoare primitivă este întotdeauna convertită într-un obiect, astfel că obții obiectul string în locul stringului primitiv

String {0: "t", 1: "e", 2: "s", 3: "t", length: 4, ...

Documentația pentru call() pe MDN afirmă că

thisArg
Valoarea lui this furnizată pentru apelul funcției.
Rețineți că aceasta s-ar putea să nu fie valoarea efectivă văzută de metodă: dacă metoda este o funcție în cod non-strict, null și undefined vor fi înlocuite cu obiectul global, iar valorile primitive vor fi convertite în obiecte.

Deci, în modul non-strict, valoarea primitivă a șirului este convertită într-un obiect, acest lucru fiind specificat și în standardul ECMA, Anexa C

restricții și excepții în modul strict
Dacă this este evaluat într-un cod în modul strict, atunci valoarea this nu este forțată să devină un obiect.
O valoare this de null sau undefined nu este convertită în obiectul global, iar valorile primitive nu sunt convertite în obiecte wrapper.
Valoarea this transmisă printr-un apel de funcție (inclusiv apelurile efectuate folosind Function.prototype.apply și Function.prototype.call) nu forțează conversia valorii this transmise într-un obiect