简单基本类型(主要类型/语言类型)
6种
string
number
boolean
null
undefined
object
其中前五种string
、number
、boolean
、null
、undefined
本身并不是对象
显然 JavaScript中万物皆对象
是错的
只有 null
、undefined
没有对应的构造形式,只有文字形式
复杂基本类型(对象子类型/内置对象)
9种
String
Number
Boolean
Object
Function
Array
Date
RegExp
Error
实际上只是一些内置函数,这些内置函数可以当作构造函数来使用,从而可以构造一个对应子类型的新对象
先来看看我们比较熟悉的一些对象
'use strict';
var obj = {
name: 'xiaoming',
age: 17
};
console.log(obj); // Object { name="xiaoming", age=17 }
String复杂基本对象
'use strict';
var s = new String( 'hello' );
console.log( s ); // String { 0="h", 1="e", 2="l", 3="l", 4="0" }
console.log( typeof s ); // object
console.log( s instanceof String ); // true
喔哦,s是对象,不是字面量
Date只有构造,没有文字形式
对于Object、Array、Function、RegExp来说,无论是用文字形式还是构造形式,他们都是对象,不是字面量
'use strict';
var s = 'hello';
var n = 123;
var b = true;
var f = function(){
console.log('I am a function');
}
var a = [1,2,3];
var o = {
1:2
}
var r = /\s/;
console.log(typeof s); // string
console.log(typeof n); // number
console.log(typeof b); // boolean
console.log(typeof f); // function
console.log(typeof a); // object
console.log(typeof o); // object
console.log(typeof r); // object
console.log(typeof null); // object
console.log(typeof f); // function
稀里糊涂用了这么久才发现typeof
这货居然能检查是不是function
,可是function
和array
一样都是对象的子类型,但它无视了array
,只检查出了function
console.log(typeof null); // object
这是语言本身的一个bug,null本身就是基本类型
不同的对象在底层都表示为二进制,在JavaScript中二进制前三位都为0的话会被判为object类型,null的二进制表示是全0,自然前三位也是0,所以
console.log(typeof null); // object