簡體   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