繁体   English   中英

为什么(function(){return this;})。call('string literal')返回[String:'string literal']而不是'string literal'?

[英]Why does (function() { return this; }).call('string literal') return [String: 'string literal'] instead of 'string literal'?

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

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

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

(function() { return this === 'string literal'; }).call('string literal');
// => false

谁能告诉我,为什么this里面的功能不完全是被作为第一个参数传递给call

编辑1

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

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

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

我的问题的正确答案是“因为你没有使用严格模式”而另一个问题的答案与实现ECMAScript的引擎内部访问数据的速度有关。

我希望这个澄清是正确的😅

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

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

OrdinaryCallBindThis (这将把this ,那将被调用的函数的值),将包装的新this在非严格模式的对象:

  1. 如果thisMode是严格的,那么让thisValue成为thisArgument。

  2. 其他,

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

    否则,让这个值得! ToObject(thisArgument)。

在严格模式下,您将看到字符串包含在对象中:

 'use strict'; (function() { console.log(this); console.log(this === 'string literal'); }).call('string literal'); 

由于您在字符串原语上调用方法,因此它会自动转换为String对象。

日志是两个控制台如何呈现字符串对象。

进一步阅读: JavaScript中的字符串原语和String对象有什么区别?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM