大致意思是说 internal slots 不是对象的属性,不会被继承,初始值都是未定义的。那就可以初步认为 internal slots 是一个类似于属性但是不能被直接获取的值,同时StackOverflow上也有人出来解释这个问题 What is an “internal slot” of an object in JavaScript?
。大致我们可以认为这是一个内部值。同时在文档中可以查阅到诸如 Set the value of O’s [[NumberData]] internal slot to n 之类的话语,
P.S.最近在看dayjs的源码,源码上用到了
valueOf
方法,虽然知道这个方法,但是很少接触,就试着找来了ECMAscript标准文档来看看标准的定义。首先看下标准对于
Object.prototype.valueOf
的定义:关于
ToObject
,标准如下定义:翻译过来就是:
到了这里,貌似可以停止查阅文档了,但是我们不要忘了一个事情那就是原型链,这只是定义在Object对象原型链上的。我们还需要看看各种类型自身的原型上是否定义了
valueOf
方法: 果不其然,Boolean、Number、String、Symbol的原型上都有自己的valueOf
方法,分别查阅规范:Boolean
Number
String
Symbol
根据上面的规范,制成表格为:
在这里我们假设调用的都是该定义的方法的类型,如调用
Boolean.prototype.valueOf()
方法的一个布尔类型的值。那么,或许有人问了那这几个重新定义的
valueOf
方法和定义在Object原型上的valueOf
返回值有啥不同吗?当然不同呀,定义在Object对象上返回的是一个对象,而重新定义的方法返回的是一个值,如下这就跟你用使用字面量定义数字和使用构造函数定义使用数字的区别一样!!!
既然我们都知道js完全可以通过使用
call
和apply
来改变this指向,那么也就是说完全这些方法可以被任意类型的值使用,那么此时的返回值又是什么呢?我们还是来看文档:
首先看
String.prototype.valueOf()
方法,规范中指出返回的值是抽象操作符thisStringValue(value)
的返回值,而thisStringValue(value)
的处理过程是这样子的:其他几个的规范也类似:
所以归根到底这里需要解决的是这个形如
[[SymbolData]] internal slot
是啥子东东的问题(姑且全翻译为类型内部插槽吧)。查询文档,可以看到规范对于
Internal slots
的说明:大致意思是说
internal slots
不是对象的属性,不会被继承,初始值都是未定义的。那就可以初步认为internal slots
是一个类似于属性但是不能被直接获取的值,同时StackOverflow上也有人出来解释这个问题 What is an “internal slot” of an object in JavaScript? 。大致我们可以认为这是一个内部值。同时在文档中可以查阅到诸如Set the value of O’s [[NumberData]] internal slot to n
之类的话语,因此,大致可以认为拥有
[[NumberData]] internal slot
的为数字类型,拥有[[StringData]] internal slot
为字符串类型。按照这个思路,
String.prototype.valueOf()
、Number.prototype.valueOf()
这些方法是不能被其他数据类型调用的,调用则会抛出 TypeError 异常。测试:
完全符合!
接下来需要考虑的就是Date、Math、functioin等对象的原型是否定义了
valueOf
方法,通过搜索查阅手册可以发现在这些对象中只有Date对象重写了valueOf
方法继续查阅可以知道这个
time value
就是时间戳,从getTime()
方法的描述也可以证实:所以 Date对象的
valueOf
方法直接返回时间戳。因此根据上述的查阅取证,总结一下
valueOf
: 定义在Object
的原型上的valueOf
方法内部调用了内部的方法ToObject()
,而ToObject()
方法除了 Undefined 和 null 之外都会返回一个对象。而Boolean
、Number
、String
、Symbol
、Date
对象的原型则重写了valueOf
方法,且传入不是该类型的参数参数时会报错,列表为:Object.prototype.valueOf
Boolean.prototype.valueOf
String.prototype.valueOf
Number.prototype.valueOf
Symbol.prototype.valueOf
Date.prototype.valueOf
参考:
ECMAscript标准文档