JavaScript中都知道有6个简单数据类型(也叫做原始类型)
1.Number 数字类型
2.String 字符串类型
3. symbol 符号类型 (ECMAScript6新增)
4.Boolean 布尔类型
5. Undefined 未定义
6.Null 空
对象Object 是复杂数据类型
<script>
let bar
console.log(typeof bar) //undefined
bar = 12
console.log(typeof bar) //number
bar = " 我是字符串 "
console.log(typeof bar)//string
bar = true
console.log(typeof bar) //boolean
bar = null
console.log(typeof bar) //object
bar = { name: "我是一个对象" }
console.log(typeof bar) //object
</script>
然而当我们调用 typeof(null) 返回的值却是object
所以常常有人对此混淆不清
null本身实际上是基本类型,但是JavaScript在存储数据的时候,会把不同的对象在底层存储的时候都转为二进制,
而JavaScript判断数据类型的时候根据 数据的二进制判断,如果二进制的前三位都为0就会被判断为object.
但是null代表的是空,所以存储的表示形式是全为0,前三位肯定也为0 因此执行typeof时会返回object
这个bug是第一版Javascript留下来的。在这个版本,数值是以32字节存储的,由标志位(1~3个字节)和数值组成。标志位存储的是低位的数据
。 这里有五种标志位:
(1) 000:对象,数据是对象的应用。
(2) 1:整型,数据是31位带符号整数。
(3) 010:浮点数。
(4) 100:字符串,数据是字符串。
(5) 110:布尔类型,数据是布尔值。
有二个值比较特别
undefined:用 (-2^{30})表示.
null :对应机器码的 NULL 指针 ,一般是全零
在 ES6 中曾有关于修复此 bug 的提议,提议中称应该让 typeofnull==='null'
但是该提议被无情的否决了,自此 typeofnull
终于不再是一个 bug,而是一个 特点,并且永远不会被修复。