gpt4 book ai didi

javascript - JavaScript 中的拳击强制转换?

转载 作者:可可西里 更新时间:2023-11-01 02:16:47 26 4
gpt4 key购买 nike

You Don't Know JS - the Coercion Chapter我读过强制转换,你永远不会得到复杂值的结果,比如对象或数组。拳击不属于准确意义上的胁迫。装箱与幕后 JavaScript 中的强制转换有何不同?表面上我真的看不出有什么区别。

最佳答案

这主要是语义问题。

首先,让我们定义“装箱”,因为该术语在 JavaScript 中并不常用(例如,它没有出现在规范中):

“装箱”是将一个对象包裹在一个原始值周围。例如,new Number(42) 为原始数字 42 创建了一个 Number 对象。

在 JavaScript 中唯一的自动装箱是:

  1. 当您在基元上使用方法时,如下所示:

    console.log("testing".toUpperCase());

    "testing" 是原始字符串,因此没有(也不能)有方法。当 JavaScript 引擎看到具有原始根的属性访问器操作时,根据规范,它会在检索属性之前为该原始创建一个包装对象(例如,原始字符串的 String 对象)。如果正在调用该属性(例如,"foo".toUpperCase()),在松散模式下,包装对象是调用中的this(在严格模式下,它是原语字符串)。除非方法调用中的某些东西保留了包装器对象,否则它会在之后被丢弃。

  2. 当您在松散模式下使用原语作为 Function#callFunction#apply 的第一个参数时,它会被装箱以便成为 this 在通话期间。 (在严格模式下,this 可以是原语。)除非被调用的函数保留对包装器对象的引用,否则它会在调用完成时被丢弃。

拆箱当然是相反的:从装箱对象中获取原语。

规范中的语言称装箱为“转换”:

来自 §7.1.13 :

The abstract operation ToObject converts argument to a value of type Object...

但是,它把拆箱称为“转换”和“强制”:

来自 §7.1.1 :

The abstract operation ToPrimitive converts its input argument to a non-Object type

来自 §4.3.16 :

A Boolean object can be coerced to a Boolean value.

来自 §4.3.19 :

A String object can be coerced to a String value...

归根结底,重要的是我们了解什么时候会发生什么。我怀疑作者并非有意区分convertcoerce

关于javascript - JavaScript 中的拳击强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34067261/

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