Javascript 为什么getPrototypeOf';空';给一个错误?
所以我知道“null”是“object”的一种类型 但是,当我执行Object.getProtoTypeOf(null)时,我会得到一个错误。instanceof也是如此,这有点像一回事 如果null是对象的一种类型…它应该在它的原型链中,对吗Javascript 为什么getPrototypeOf';空';给一个错误?,javascript,object,null,instanceof,Javascript,Object,Null,Instanceof,所以我知道“null”是“object”的一种类型 但是,当我执行Object.getProtoTypeOf(null)时,我会得到一个错误。instanceof也是如此,这有点像一回事 如果null是对象的一种类型…它应该在它的原型链中,对吗 // 'object' typeof null; // gives error - Cannot convert undefined or null to object Object.getPrototypeOf(null); // false
// 'object'
typeof null;
// gives error - Cannot convert undefined or null to object
Object.getPrototypeOf(null);
// false ---- why?
null instanceof Object
我有什么遗漏吗,或者JS太嬉皮了 请参见,
null
不是对象。诚然,typeof null
的计算结果是'object'
,但它实际上来自一个限制,可能被认为是JavaScript的一个怪癖,某种程度上是一个bug。引述:
“typeof null
”bug是从第一个版本的
JavaScript。在此版本中,值以32位单位存储,这
由一个小型类型标签(1–3位)和
价值类型标签存储在单元的低位。那里
其中有五名:
- 000:
。数据是对对象的引用李>对象
- 1:
。数据是一个31位有符号整数int
- 010:
。数据是对双浮点数的引用李>double
- 100:
。数据是对字符串的引用李>字符串
- 110:
。数据是一个布尔值李>布尔值
(JSVAL\u VOID)是整数−230(整数范围之外的数字)李>undefined
(JSVAL\u null)是机器代码null指针。或:对象类型标记加上零引用null
null
被视为基本值。这就是为什么,例如,null instanceof Object
返回false-任何原语都会返回false,因为它不能是实例。将编号的42实例
(false)与编号为42的类型进行比较
对于Object.getPrototypeOf(null)
,它有点不同。在此函数中,如果其参数是基元,则应引发异常-任何基元:
当使用参数O
调用getPrototypeOf
函数时
采取了以下步骤:
- 如果
类型(O)
不是对象
抛出类型错误
异常李>
- 返回
O
的[[Prototype]]
内部属性的值
然而,在ES2015中,他们:
当使用参数O
调用getPrototypeOf
函数时
采取了以下步骤:
- 让
obj
beToObject(O)
ReturnIfAbrupt(obj)
李>
- Return
obj。[[GetPrototypeOf]]()
。。。因此Object.getPrototypeOf(42)
现在可以工作了。但是Object.getPrototypeOf(未定义)
和Object.getPrototypeOf(null)
都会抛出相同的错误:
Uncaught TypeError: Cannot convert undefined or null to object
此异常是由ToObject()
method()引发的,这是有意义的,因为不能“框”空和未定义。在某些方面,这与尝试访问null
或undefined
属性时出现的错误类似。请参见,null
不是对象。诚然,typeof null
的计算结果是'object'
,但它实际上来自一个限制,可能被认为是JavaScript的一个怪癖,某种程度上是一个bug。引述:
“typeof null
”bug是从第一个版本的
JavaScript。在此版本中,值以32位单位存储,这
由一个小型类型标签(1–3位)和
价值类型标签存储在单元的低位。那里
其中有五名:
- 000:
对象
。数据是对对象的引用李>
- 1:
int
。数据是一个31位有符号整数
- 010:
double
。数据是对双浮点数的引用李>
- 100:
字符串
。数据是对字符串的引用李>
- 110:
布尔值
。数据是一个布尔值李>
也就是说,最低的位是一位,那么类型标记只有一位长。或者它是零,那么类型标签的长度是三位,提供两位
四种类型的附加位。有两个值是特别的:
undefined
(JSVAL\u VOID)是整数−230(整数范围之外的数字)李>
null
(JSVAL\u null)是机器代码null指针。或:对象类型标记加上零引用
现在应该很清楚为什么typeof认为null是一个对象:它检查了它的类型标签,类型标签上写着“object”
现在,对于rest操作,null
被视为基本值。这就是为什么,例如,null instanceof Object
返回false-任何原语都会返回false,因为它不能是实例。将编号的42实例
(false)与编号为42的类型进行比较
对于Object.getPrototypeOf(null)
,它有点不同。在此函数中,如果其参数是基元,则应引发异常-任何基元:
当使用参数O
调用getPrototypeOf
函数时
采取了以下步骤:
- 如果
类型(O)
不是对象
抛出类型错误
异常李>
- 返回