Javascript 在JS中,为什么我能够使用toFixed()之类的函数,它驻留在原语类型上的数字包装器对象的原型中?
在JavaScript中,基本类型(数字、字符串等)不是对象。因此,他们没有[[prototype]],因此无法使用某些对象的[[prototype]]中可用的方法 而Number、String是包装器对象,可用于创建带有Javascript 在JS中,为什么我能够使用toFixed()之类的函数,它驻留在原语类型上的数字包装器对象的原型中?,javascript,primitive-types,Javascript,Primitive Types,在JavaScript中,基本类型(数字、字符串等)不是对象。因此,他们没有[[prototype]],因此无法使用某些对象的[[prototype]]中可用的方法 而Number、String是包装器对象,可用于创建带有new关键字的变量,我们可以在这些变量上使用Number对象原型中可用的方法(使用new关键字创建) 但是在给定的代码中,我创建了一个基元类型变量,并且能够使用驻留在Number对象中的方法,如toFixed() 这让我很困惑。请详细说明这一点 let a = 6.678; /
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()操作时,将执行以下步骤:
thisNumberValue(此值)
- 如果
是数字,则返回值类型(值)
- 如果类型(值)是对象,且值具有[[NumberData]]内部
那就开槽吧
- 设n为值。[[NumberData]]
- 断言:类型(n)是数字
- 返回
- 抛出TypeError异常
注意 抽象操作
ToInteger
将参数转换为整数。此抽象操作的功能如下:- 让数字成为现实吧
。(注意ToNumber也是一个抽象操作)ToNumber(参数)
- 如果数字为NaN,则返回+0
- 如果数字为+0,-0+∞, 或-∞, 返回号码
- 返回数值 这是和数字相同的符号,其大小是 楼层(abs(编号))
fractionDigits
,则f为0