gpt4 book ai didi

javascript - 为什么 (function() { return this; }).call ('string literal' ) 返回 [String : 'string literal' ] instead of 'string literal' ?

转载 作者:数据小太阳 更新时间:2023-10-29 05:06:51 26 4
gpt4 key购买 nike

这是我在试验 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

What is the difference between string primitives and String objects in JavaScript?已被标记为可能与我的问题重复。

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

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

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

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

最佳答案

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

  1. Perform OrdinaryCallBindThis(F, calleeContext, thisArgument).

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

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

  2. 否则,

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

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

在严格模式下,您会看到字符串不会被包裹在一个对象中:

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

关于javascript - 为什么 (function() { return this; }).call ('string literal' ) 返回 [String : 'string literal' ] instead of 'string literal' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57819151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com