为什么(function(){return this;})。call('字符串常量')返回[String:'字符串常量']而不是'字符串常量'?

bar*_*occ 8 javascript

这是我尝试JS时的最新发现:

(function() { return this; }).call('string literal');
// => [String: 'string literal'] in V8
// => String { "string literal" } in FF
Run Code Online (Sandbox Code Playgroud)

我在执行以下操作时偶然发现了这一点:

(function() { return this === 'string literal'; }).call('string literal');
// => false
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么this在函数内部不完全是作为第一个参数传递给的call

编辑1

字符串基元和JavaScript中的String对象有什么区别?已被标记为我的问题的可能重复项。

虽然这两个问题的答案都与JS如何在Objects中包装原语有关,但我认为这些问题及其答案并不相同。

我的问题是“为什么传递给调用的参数和函数内部的this的值不同?”而另一个问题是“为什么代码块1比代码块2更快?”

我的问题的正确答案是“因为您未使用严格模式”,而另一个问题的答案与实现ECMAScript的引擎在内部如何快速访问数据有关。

我希望这个澄清是正确的

Cer*_*nce 8

.call内部调用[[Call]],执行

  1. 执行OrdinaryCallBindThis(F,calleeContext,thisArgument)。

并且OrdinaryCallBindThis(设置this要调用的函数的值)将以this非严格模式将新包装在对象中:

  1. 如果thisMode是严格的,则让thisValue为thisArgument。

  2. 其他,

    一种。如果thisArgument未定义或为null,则...

    b。否则,让thisValue为!ToObject(thisArgument)。

在严格模式下,您会看到字符串没有被包装在对象中:

'use strict';
(function() {
  console.log(this);
  console.log(this === 'string literal');
}).call('string literal');
Run Code Online (Sandbox Code Playgroud)