Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.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 为什么getPrototypeOf';空';给一个错误?_Javascript_Object_Null_Instanceof - Fatal编程技术网

Javascript 为什么getPrototypeOf';空';给一个错误?

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

所以我知道“null”是“object”的一种类型

但是,当我执行Object.getProtoTypeOf(null)时,我会得到一个错误。instanceof也是如此,这有点像一回事

如果null是对象的一种类型…它应该在它的原型链中,对吗

// '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:
    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)
    不是
    对象
    抛出
    类型错误
    异常
  • 返回
    O
    [[Prototype]]
    内部属性的值
然而,在ES2015中,他们:

当使用参数
O
调用
getPrototypeOf
函数时 采取了以下步骤:

  • obj
    be
    ToObject(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)
    不是
    对象
    抛出
    类型错误
    异常
  • 返回