在JS中,为什么我能够使用像toFixed()这样的函数,它驻留在基元类型上的Number包装器对象的原型中



在JavaScript中,基元类型(数字、字符串等(不是对象。因此,他们没有[[prototype]],因此无法使用某些对象的[[prototype]]。

而Number和String是包装对象,可以用于创建具有new关键字的变量,我们可以在这些变量上使用Number对象原型中可用的方法(使用new关键字创建(。

但在给定的代码中,我创建了一个基元类型变量,并且能够使用类似于驻留在Number Object中的toFixed()的方法。

这让我很困惑。请详细说明。

let a = 6.678; //primitive type
a= a.toFixed(1); // toFixed() resides in prototype of Number Object
console.log(a); // 6.7

这与一个名为";"自动装箱";,Javascript看到您正试图访问基元类型上的属性,因此在运行时的一个非常短暂的时刻,它将基元值转换为相应的Wrapper对象,然后继续进行属性调用,然后在大多数情况下将值转换回基元类型。

let a = 6.678; //primitive type
a= a.toFixed(1); // JS converts a to "Number Object" and then the function is called
console.log(a); // 6.7

这里有一个很好的答案,它是javascript自动框吗?

这或多或少就是JavaScript引擎的工作方式。您认为分配给a的变量是Number类型的基元是正确的,但当您访问该基元值上的方法时,JS将创建一个特殊的包装器对象(它将为每个基元类型(即字符串(执行此操作(,并赋予它访问这些方法的权限。

访问该方法后,该值将不再是对象。

您可以在此处阅读更多信息:https://javascript.info/primitives-methods#a-图元作为对象

@下面ashu的回答包括了一个我实际上并不知道的技术术语——所以TIL!显然,这被称为";自动装箱"!

由于thisNumberValue抽象操作,我们能够执行toFixed((操作,该操作检查Type(value(是Number,否则返回值。如果Type(value(是Object,并且value有[[NumberData]]内部槽,则设n为value,并指定Type[n]是Number。返回值else引发TypeError异常。

根据ECMAScript®2020语言规范

Number.prototype.to固定(小数位数(

toFixed返回一个字符串,该字符串包含以小数定点表示的该数值,小数点后有fractionDigits位。如果fractionDigits是未定义,则假定为0。

执行toFixed((操作时执行以下步骤:

  1. 设x为?thisNumberValue(this value)

注意抽象操作thisNumberValue(值(执行以下步骤:

  • 如果Type(value)是Number,则返回值。

  • 如果Type(value(为Object,并且value具有[[NumberData]]内部插槽,然后

    • 设n为值。[[NumberData]]
    • 断言:类型(n(是数字
    • 退货编号
  • 引发TypeError异常。

  1. 让f是?CCD_ 10。

    注意抽象运算ToInteger将参数转换为整数值。此抽象操作的功能如下:
  • 让数字是?ToNumber(argument)。(注意ToNumber也是一个抽象操作(
  • 如果数字是NaN,则返回+0
  • 如果数字是+0、-0、+∞或-∞,则返回数字
  • 返回数值这与数字的符号相同,其大小为地板(abs(数字((
  1. 断言:如果fractionDigits未定义,则f为0

最新更新