gpt4 book ai didi

javascript - JavaScript 会自动装箱吗?

转载 作者:行者123 更新时间:2023-12-03 02:01:55 26 4
gpt4 key购买 nike

在解决另一个问题时,我创建了这个 fiddle :

http://jsfiddle.net/tr2by/

function foo() {
// console.log(_.isBoolean(this));
console.log(this === true);
}

foo.call(true); // object:[object Boolean]
foo.apply(true); // object:[object Boolean]

这是自动装箱的示例吗?

从值类型到引用类型。

这是一个wikipedia def.

最佳答案

首先,我假设您正在谈论原始值到对象的自动转换。 JavaScript 中的两种情况会发生这种情况:

  1. 当您将原始值传递为 this 时值为 .call.apply (但不是严格模式)。
  2. 当您尝试访问原始值的“属性”时,例如"foo bar".split() .

在第一种情况下,转换是永久性的,即 this确实会引用一个对象,第二次转换仅在评估期间在内部发生

如果您对转换的详细信息不感兴趣,可以忽略答案的其余部分。

<小时/>

<强>1。原始值为 this

当一个函数被执行时,它的this value 不是一个对象,它被转换为一个对象,至少在非严格模式下是这样。 §10.4.3 Entering Function Code [spec] 中对此进行了描述。在 ECMAScript 5.1 文档中:

The following steps are performed when control enters the execution context for function code contained in function object F, a caller provided thisArg, and a caller provided argumentsList:

  1. If the function code is strict code, set the ThisBinding to thisArg.
  2. Else if thisArg is null or undefined, set the ThisBinding to the global object.
  3. Else if Type(thisArg) is not Object, set the ThisBinding to ToObject(thisArg).
    [...]

正如您在第三步中看到的,通过调用 ToObject [spec] 将值转换为对象。 .

<强>2。属性(property)访问

当您尝试访问属性 ( §11.2.1 Property Accessors [spec] ) 时,会发生类似的情况。这里引用的部分解释了表达式 foo[bar] 如何被评估,即如何评估带有括号表示法的属性访问。我们感兴趣的部分也适用于点表示法。

The production MemberExpression : MemberExpression [ Expression ] is evaluated as follows:

  1. Let baseReference be the result of evaluating MemberExpression.
  2. Let baseValue be GetValue(baseReference).
    [...]

   8. Return a value of type Reference whose base value is baseValue and whose referenced name is propertyNameString, and whose strict mode flag is strict.

重要的一步是最后一步:无论做什么MemberExpression计算时,它会转换为 Reference [spec] 类型的值。这是仅在规范中使用的数据类型,包含有关如何从引用中检索实际值的附加信息(不要与实际 JavaScript 代码中的对象引用混淆!)。

为了从这样的引用中获取“真实”值/结果,内部函数 GetValue(V) (§8.7.1) [spec]被调用(就像上面算法中的步骤 2 一样),其中显示:

The following [[Get]] internal method is used by GetValue when V is a property reference with a primitive base value. It is called using base as its this value and with property P as its argument. The following steps are taken:

  1. Let O be ToObject(base).
    [...]

示例:

假设我们有表达式

var foo = "BAR".toLowerCase();

这是一个赋值表达式,其计算如下:

The production AssignmentExpression : LeftHandSideExpression = AssignmentExpression is evaluated as follows:

  1. Let lref be the result of evaluating LeftHandSideExpression.
  2. Let rref be the result of evaluating AssignmentExpression.
  3. Let rval be GetValue(rref).
    [...]

第 1 步:评估左侧,即标识符 foo 。标识符到底如何解析对此并不重要。
步骤 2:评估右侧,即 "BAR".toLowerCase() 。该评估的内部结果将作为引用值,类似于:

REFERENCE = {
base: "BAR",
propertyNameString: "toLowerCase",
strict: false
}

并存储在rref中.

第 3 步:GetValue(rref)叫做。 base引用值是"BAR" 。由于这是一个原始值,ToObject将被调用将其转换为临时 String目的。此外,引用实际上是一个属性访问,所以 GetValue最终会调用方法toLowerCase关于String对象并返回方法的结果。

关于javascript - JavaScript 会自动装箱吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17216847/

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