一、缘起
1、alert(null instanceof Object); 返回值为false。
2、typeof(null) == 'object'
这是为什么?按我们正常的理解,应该为true才对。
二、简单粗暴的解释
1、null表示为空的引用;instanceof 表示某个变量是否是某个对象的实例 ;object则是对象界里的“原始天尊”……万物始祖
undefined和null比较特殊,虽然null的类型是object,但是null不具有任何对象的特性,就是说我们并不能执行()、等对象实例的默认调用。所以从这个意义上来说,null和undefined有最大的相似性。看看null == undefined的结果(true)也就更加能说明这点。不过相似归相似,还是有区别的,就是和数字运算时,10 + null结果为:10;10 + undefined结果为:NaN(非数字值)。故null instanceof Object判读为false。
pg:isNaN() 函数用于检查其参数是否是非数字值,参数值为 NaN 或字符串、对象、undefined等非数字值则返回 true, 否则返回 false。
2、typeof 返回一个表达式的数据类型的字符串,返回结果为javascript中的基本数据类型,包括:number、boolean、string、object、undefined、function等6种数据类型。
null肯定不是undefined,当然是object。
三、历史渊源
No.1、
javascript 中的 null
:既是对象,又不是对象,史称「薛定谔的对象」。
-
typeof null === 'object';
-
null instanceof Object === false
而
-
null instanceof null
会抛出异常:
-
Uncaught TypeError: Right-hand side of 'instanceof' is not an object
这是一个历史遗留下来的 feature(特征or bug?),The history of “typeof null”
在 javascript 的最初版本中,使用的 32 位系统,为了性能考虑使用低位存储了变量的类型信息:
-
000:对象
-
1:整数
-
010:浮点数
-
100:字符串
-
110:布尔
有 2 个值比较特殊:
-
undefined
:用 -2^{30} (−2^30)表示。 -
null
:对应机器码的NULL
指针,一般是全零。
在第一版的 javascript 实现中,判断类型的代码是这么写的(代码还是下面的那段好理解一些):
-
if (JSVAL_IS_VOID(v)) { // (1)
-
type = JSTYPE_VOID;
-
} else if (JSVAL_IS_OBJECT(v)) { // (2)
-
obj = JSVAL_TO_OBJECT(v);
-
if (obj &&
-
(ops = obj->map->ops,
-
ops == &js_ObjectOps
-
? (clasp = OBJ_GET_CLASS(cx, obj),
-
clasp->call || clasp == &js_FunctionClass) // (3,4)
-
: ops->call != 0)) { // (3)
-
type = JSTYPE_FUNCTION;
-
} else {
-
type = JSTYPE_OBJECT;
-
}
-
} else if (JSVAL_IS_NUMBER(v)) {
-
type = JSTYPE_NUMBER;
-
} else if (JSVAL_IS_STRING(v)) {
-
type = JSTYPE_STRING;
-
} else if (JSVAL_IS_BOOLEAN(v)) {
-
type = JSTYPE_BOOLEAN;
-
}
javascript
(1):判断是否为 undefined
(2):如果不是 undefined,判断是否为对象
(3):如果不是对象,判断是否为数字
(4):…………
这样一来, null
就出了一个 bug。根据 type tags 信息,低位是000
,因此null
被判断成了一个对象。这就是为什么typeofnull
的返回值是 "object"
。
关于 null
的类型在 MDN 文档中也有简单的描述:typeof - javascript | MDN
在 ES6 中曾有关于修复此 bug 的提议,提议中称应该让 typeofnull==='null'
/?id=harmony:typeof_null 但是该提议被无情的否决了,自此 typeofnull
终于不再是一个 bug,而是一个 feature,并且永远不会被修复。
No2、
Javascript规范规定的,Null和Object都是javascript中的数据类型。Null数据类型只有一个值:null。就像undefined数据类型只有一个值:undefined。问题出在typeof操作符的定义规范,如下:
11.4.3 The typeof Operator
The production UnaryExpression : typeof UnaryExpression is evaluated as follows:
1. Evaluate UnaryExpression.
2. If Type(Result(1)) is not Reference, go to step 4.
3. If GetBase(Result(1)) is null, return "undefined".
4. Call GetValue(Result(1)).
5. Return a string determined by Type(Result(4)) according to the following table:
Type Result
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Object (native and
doesn’t implement
[[Call]])
"object"
Object (native and
implements [[Call]])
"function"
Object (host) Implementation-dependent
可以看到,对于Null类型的值(只有null),规范就是定义返回"object"这个字符串。但是本质上Null和Object不是一个数据类型,null值并不是以Object为原型创建出来的。所以null instanceof Object是false。但从这里也可以看到,null确实是javascript中用来表示空引用的一个特殊值。使得它不是instanceof Ojbect,而typeof null是“object”。在语义上也是可以理解的。
四、总结
看似二者有些矛盾,但null返回object这个其实是最初JavaScript的实现的一个错误,然后被ECMAScript沿用了,成为了现在的标准,不过我们把null可以理解为尚未存在的对象的占位符,这样就不矛盾了 。虽然这是一种“狡辩”,但这种“语言特性”也算是将错就错吧。语言是人类创造的,正因为有故事才有生命力,对吧。
五、扩展知识
解决了上述问题,又浮出来了JavaScript类型检测之typeof 和 instanceof 的区别。
1、typeof 和 instanceof 是用来判断数据类型比较通用的两个方法,有什么区别呢?
2、解释
2. 返回一个表达式的数据类型的字符串,返回结果为javascript中的基本数据类型,包括:number、boolean、string、object、undefined、function等6种数据类型。
1 2 3 4 5 6 7 8 |
|
可以看出,typeof 可以准确的判断除object以外的基础数据类型,但不能区分object类型的具体类型,比如 Array 、Date 以及自定义类。
2. 本意是用来判断 A 是否为 B 的实例对象,表达式为:A instanceof B,如果A是B的实例,则返回true,否则返回false。 在这里需要特别注意的是:instanceof检测的是原型。详细的追根溯源,要用javascript的原型链的知识(《浅谈javascript原型和原型链》)来理解。
3、用途上的区别
JavaScript中判断函数参数类型是什么时候用typeof还是instanceof?
3.1. typeof只能判断js已有的几个类型,如function,object,number。使用 typeof 来获取一个变量是否存在,如 if(typeof a!="undefined"){alert("ok")},而不要去使用 if(a) 因为如果 a 不存在(未声明)则会出错
3.2. 语法-->instance:实例,例子
a instanceof b?alert("true"):alert("false"); //a是b的实例?真:假
instanceof可以判断对象是由哪个函数实例化出来的,如:
1 2 3 4 |
|
c instanceof a为true而d instanceof b为false。
而用typeof c和typeof d的结果都是object。
六、感谢
资料来源:/woshinidedege/article/details/78659183?locationNum=10&fps=1
/xuan52rock/p/
https:///article/