null是原始类型还是对象类型?

4
在JavaScript中,原始值(原始数据类型)是指不是对象且没有方法的数据。有6种原始数据类型:字符串、数字、大整数、布尔值、未定义和符号。还有null,它看起来是原始的,但实际上对于每个对象都是一种特殊情况:任何结构化类型都是通过原型链从null派生而来。
但是在《JavaScript权威指南》中,它说任何不是数字、字符串、布尔值、符号、null或未定义的Javascript值都是对象。
那么哪一个是正确的?null是对象还是不是对象?

这个回答解决了你的问题吗?在JavaScript中检查一个值是否为对象 - Tân
我还是很困惑。上面的链接(有1500个赞)说null是一个对象,而下面的答案说它是一个原始类型。 - Rick
3
虽然 typeof null 会返回 "object",但是 null 是一种原始类型的值,类型为 "null"(也是该类型唯一的值)。查看此问题以了解 typeof 运算符的问题:https://dev59.com/NWMk5IYBdhLWcg3w-Ciq - Cat
3个回答

8

当你不确定时,可以阅读官方规范,这基本上是 JavaScript 的神谕。

原始值是以下内置类型之一的成员:Undefined、Null、Boolean、Number、BigInt、String 和 Symbol;对象是内置类型 Object 的成员;而函数是一个可调用的对象。通过属性与对象相关联的函数称为方法。

所以,是的,null 是一个原始值。


2

As you can see null, Arrays, and Objects all output type 'object' when passed to typeof.

console.log(typeof null); console.log(typeof []); console.log(typeof {});

然而,这与 Object type 不同。

如果你想要测试像 ECMAScript 定义的类型一样的类型,你可能需要检查一下这个。

function getType(mixed){
  if(mixed === null){
    return 'null';
  }
  else if(mixed instanceof Array){
    return 'array';
  }
  return typeof mixed;
}

class Test{
  constructor(){
  }
  method(){
    return this;
  }
}
function ConstructorTest(){
  let privateVarsOk;
  this.method = ()=>{
    return this;
  }
}
const test = new Test; constructorTest = new ConstructorTest;

console.log(getType(null));
console.log(getType('4'));
console.log(getType(4));
console.log(getType(['a', 2, 'c']));
console.log(getType({}));
console.log(getType(getType));
console.log(getType(function(){}));
console.log(getType(()=>{}));
console.log(getType(Test));
console.log(getType(test));
console.log(getType(ConstructorTest));
console.log(getType(constructorTest));
console.log(getType());

请注意,class实际上是函数,因为它们不引入新的层次结构。

1
小写的 object 是通过 typeof 得到的,而大写的 Object 则是内置的 constructor 函数。例如,null instanceof Object 的结果为 false,而 [].constructor 的结果为 Array - Bryan Grace
@BryanGrace,注意我只测试了 mixed === null,因为我有那个参数,所以它会返回 OP 想要的结果。我知道 instanceof 不同于 typeof。顺便说一下,一个 constructor 是一个 function - StackSlave

0
var nullVar=null;
console.log("Data type of nullVar is :"+ (typeof nullVar));

输出:nullVar 的数据类型是:object

null 是原始数据类型,但它返回对象... 因此,null 返回虚假的返回值..


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接