原始(Primitive)类型
在 JS 中,存在着 6 种原始值,分别是:
boolean
null
undefined
number
string
symbol
首先原始类型存储的都是值,是没有函数可以调用的。但注意有的基本类型会在调用函数时被强制转换!例如:‘1’.toString()。
原始类型中存在的一些坑:
-
JS 的
number
类型是浮点类型的,在使用中会遇到某些 Bug,比如 0.1 + 0.2 !== 0.3 ,因为所有的小数都只是一个近似值。 -
string
类型是不可变的,无论你在string
类型上调用何种方法,都不会对值有改变。 -
对于
null
来说,很多人会认为他是个对象类型,其实这是错误的。虽然typeof null
会输出object
。那是因为在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000
开头代表是对象,然而null
表示为全零,所以将它错误的判断为object
。
对象(Object)类型
对象类型和原始类型不同的是,原始类型存储的是值,对象类型存储的是地址(指针)。当我们将变量赋值给另外一个变量时,复制的是原本变量的地址(指针),若修改其中一个,则另一个也是相同的变化。
若函数参数是对象的话:
-
首先,函数传参是传递对象指针的副本
-
到函数内部修改参数的属性这步,原本的对象值也会发生相应的改变
类型判断之 typeof vs instanceof
typeof
对于原始类型来说,除了 null
都可以显示正确的类型。typeof
对于对象来说,除了函数都会显示 object
,所以说 typeof
并不能准确判断变量到底是什么类型。
typeof null //“object”
typeof console.log // ‘function’
想判断一个对象的正确类型,这时候可以考虑使用 instanceof
,因为内部机制是通过原型链来判断的。但instanceof
也不是百分之百可信的,特别是当存在多个frame或多个window之间的交互时,instanceof所给出的结果有可能是错误的。