在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((操作时执行以下步骤:
- 设x为?
thisNumberValue(this value)
注意抽象操作thisNumberValue
(值(执行以下步骤:
-
如果
Type(value)
是Number,则返回值。 -
如果Type(value(为Object,并且value具有[[NumberData]]内部插槽,然后
- 设n为值。[[NumberData]]
- 断言:类型(n(是数字
- 退货编号
-
引发TypeError异常。
- 让f是?CCD_ 10。
注意抽象运算ToInteger
将参数转换为整数值。此抽象操作的功能如下:
- 让数字是?
ToNumber(argument)
。(注意ToNumber也是一个抽象操作( - 如果数字是NaN,则返回+0
- 如果数字是+0、-0、+∞或-∞,则返回数字
- 返回数值这与数字的符号相同,其大小为地板(abs(数字((
- 断言:如果
fractionDigits
未定义,则f为0