Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在JS中,为什么我能够使用toFixed()之类的函数,它驻留在原语类型上的数字包装器对象的原型中?_Javascript_Primitive Types - Fatal编程技术网

Javascript 在JS中,为什么我能够使用toFixed()之类的函数,它驻留在原语类型上的数字包装器对象的原型中?

Javascript 在JS中,为什么我能够使用toFixed()之类的函数,它驻留在原语类型上的数字包装器对象的原型中?,javascript,primitive-types,Javascript,Primitive Types,在JavaScript中,基本类型(数字、字符串等)不是对象。因此,他们没有[[prototype]],因此无法使用某些对象的[[prototype]]中可用的方法 而Number、String是包装器对象,可用于创建带有new关键字的变量,我们可以在这些变量上使用Number对象原型中可用的方法(使用new关键字创建) 但是在给定的代码中,我创建了一个基元类型变量,并且能够使用驻留在Number对象中的方法,如toFixed() 这让我很困惑。请详细说明这一点 let a = 6.678; /

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

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

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

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

let a = 6.678; //primitive type

a= a.toFixed(1); // toFixed() resides in prototype of Number Object

console.log(a); // 6.7

这就是JavaScript引擎的工作原理。您认为分配给
a
的变量是数字类型的原语是正确的,但当您访问此原语值上的方法时,JS将创建一个特殊的包装器对象(它将为每个原语类型(即字符串)执行此操作),并允许它访问这些方法

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

您可以在此处阅读更多信息:


@ashu在下面的回答中包含了我实际上不知道的技术术语-所以直到!显然,这就是所谓的“自动装箱”

这与一个名为“自动装箱”的概念有关,Javascript看到您试图访问基元类型上的属性,因此在运行时的一个非常短暂的时刻,它将基元值转换为相应的包装器对象,并继续进行属性调用,在大多数情况下,它会将值转换回原语类型

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

这是一个很好的答案

由于抽象操作,我们能够执行toFixed()操作,它检查类型(值)是数字返回值,否则如果类型(值)是对象,值有一个[[NumberData]]内部槽,则让n为值,并分配类型[n]为数字。返回值,否则抛出
TypeError
异常

根据

Number.prototype.toFixed(分位数)

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

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

  • 让x来吧
    thisNumberValue(此值)
  • 注意 抽象操作thisNumberValue(值)执行以下步骤:

    • 如果
      类型(值)
      是数字,则返回值

    • 如果类型(值)是对象,且值具有[[NumberData]]内部 那就开槽吧

      • 设n为值。[[NumberData]]
      • 断言:类型(n)是数字
      • 返回
    • 抛出TypeError异常

  • 让f去吧<代码>到整数(分数位数)。

    注意 抽象操作
    ToInteger
    将参数转换为整数。此抽象操作的功能如下:
    • 让数字成为现实吧
      ToNumber(参数)
      。(注意ToNumber也是一个抽象操作)
    • 如果数字为NaN,则返回+0
    • 如果数字为+0,-0+∞, 或-∞, 返回号码
    • 返回数值 这是和数字相同的符号,其大小是 楼层(abs(编号))
  • 断言:如果未定义
    fractionDigits
    ,则f为0