Does javascript autobox?
Does javascript autobox?
在处理另一个问题时,我创建了这个小提琴:
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]
这是一个自动装箱的例子吗?
从值类型转换为引用类型
这是维基百科的定义
首先我假设你在谈论原始值到对象的自动转换。在JavaScript中有两种情况:
- 当您将原始值作为
this
值传递给.call
或.apply
时(虽然不是严格模式)。 - 当您试图访问原始值的"属性"时,例如
"foo bar".split()
。
在第一种情况下,转换是永久的,即this
将确实引用一个对象,在第二种情况下,转换仅在
如果您对转换的细节不感兴趣,可以忽略答案的其余部分。
1。原语值为this
当一个函数被执行并且它的this
值不是对象时,它被转换为对象,至少在非严格模式下是这样。这在ECMAScript 5.1文档中的§10.4.3输入函数码[spec]中有描述:
在第三步中可以看到,通过调用当控制进入函数对象
F
、调用者提供的thisArg
和调用者提供的argumentsList
中包含的函数代码的执行上下文时,执行以下步骤:
- 如果功能码为严格码,则设置
ThisBinding
为thisArg
。- 如果
thisArg
为null
或undefined
,则设置ThisBinding
为全局对象- 如果
Type(thisArg)
不是Object
,则设置ThisBinding
为ToObject(thisArg
)
[…]
ToObject
[spec]将值转换为对象。
2。属性访问
当你试图访问属性(§11.2.1 Property Accessors [spec])时,也会发生类似的情况。这里用引号括起来的部分解释了表达式foo[bar]
是如何求值的,即如何用括号表示的属性访问进行求值。我们感兴趣的部分也适用于点表示法。
生产
MemberExpression : MemberExpression [ Expression ]
评估如下:
- 设
baseReference
为MemberExpression
的求值结果- 设
baseValue
为GetValue(baseReference)
。
[…),,8. 返回类型为
Reference
的值,其base
值为baseValue
,引用名称为propertyNameString
,strict
模式标志为strict
。
重要的一步是最后一步:无论MemberExpression
求值为什么,它都被转换为类型为Reference
[spec]的值。这是一种仅在规范中使用的数据类型,它包含关于如何从引用中检索实际值的附加信息(不要与实际JavaScript代码中的对象引用混淆!)。
为了从这样的引用中获得"真实"的值/结果,调用内部函数GetValue(V)
(§8.7.1)[spec](就像上面算法的第2步一样),其中它说:
当
V
是具有基本基值的属性引用时,GetValue
使用以下[[Get]]
内部方法。使用base
作为其this
值,并使用属性P
作为其参数来调用它。执行以下步骤:
- 设
O
为ToObject(base)
。
[…]
例子:
假设我们有表达式
var foo = "BAR".toLowerCase();
这是一个赋值表达式,计算如下:
产品
AssignmentExpression : LeftHandSideExpression = AssignmentExpression
的评估如下:
- 设
lref
为LeftHandSideExpression
的求值结果。- 设
rref
为AssignmentExpression
的求值结果- 设
rval
为GetValue(rref)
。
[…]
步骤1:计算左侧,即标识符foo
。标识符的解析方式并不重要。
步骤2:计算右侧,即"BAR".toLowerCase()
。该计算的内部结果将是一个参考值,类似于:
REFERENCE = {
base: "BAR",
propertyNameString: "toLowerCase",
strict: false
}
保存在rref
.
步骤3:调用GetValue(rref)
。引用的base
为"BAR"
。由于这是一个原始值,因此将调用ToObject
将其转换为临时 String
对象。此外,引用实际上是一个属性访问,因此GetValue
最终将在String
对象上调用方法toLowerCase
并返回方法的结果。
Javascript将非严格模式下提供给call
和apply
的this
参数框起来。从MDN:
如果方法是非严格模式代码中的函数,则
null
和undefined
将被替换为全局对象,并且原始值将被框化。
其他答案提供了自动装箱何时发生的详细信息,但这里还有一些事情需要记住:
-
当使用
in
操作符时,自动装箱不会发生,如果收到的值不是对象,则会抛出TypeError
。一个简单的解决方案是用Object(value)
手动将对象框起来。 -
当使用
for...of
或扩展语法[...value]
进行迭代时,会出现某种形式的自动装箱,这允许对字符串进行迭代。
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 使用php或javascript从facebook相册URL中删除多余的部分
- 正在添加'X'按钮,在文本字段旁边使用javascript
- 如何在JavaScript中将字符串转换为函数引用
- 模糊事件的Javascript测试
- Javascript更改图标
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 如何使用WCF服务和javascript表单post上传.doc文件
- javascript结合了数组和字典
- 这是什么 ==- javascript 运算符
- 从javascript创建一个列表
- 无法在通过jQuery的ajax加载的页面中执行javascript
- Javascript:selenium Web驱动程序isDisplayed()不工作
- 如何通过ajax刷新JSF填充的javascript变量
- 如何在Javascript中将JSon对象转换为数组
- Javascript生成的表单未提交
- 使用javascript将动态表从一个html页面打印到另一个html页
- Does javascript autobox?