JS的数据类型
总体来说,JS的数据类型可以分为两大类
基本数据类型:
string: 任意字符串
number: 任意数字(整数、小数)
boolean: false/ true
undefined: undefined
null: null
引入数据类型
object: 任意对象
Array: 一种特别的对象(数值下标属性,内部数据是有序的)
Function:一种特别的对象(可以执行)
以上就是JS的全部的基本数据类型,但是怎么判断一个值是什么数据类型呢??? 接下来将会详细讲解
首先,可以通过typeof、instanceof、=== 来进行判断,但是,他们之间有什么区别呢? 每一种数据类型需要怎么判断呢?
在判断数据类型的时候,你需要知道,typeof 返回的是数据类型的字符串表达,而instanceof返回的是一个boolean值,用于判断对象的具体类型
首先,先对基本数据类型进行判断。
undefined
var a
console.log(a, typeof a, typeof a === 'undefined', a === undefined) //undefined 'undefined' true true
console.log(undefined === 'undefined') // false
这里注意,我们声明一个a,但是没有给他赋值,他的默认值为undefined。typeof a 返回的是'undefined',注意:这里是数据类型的字符串表达。 因为undefined的值只有一个,所以可以使用===进行直接比较。
string、number、boolean
a = 3
console.log(typeof a === 'number') // true
a = 'hello'
console.log(typeof a === 'string') // true
a = true
console.log(typeof a === 'boolean') // true
通过以上代码发现,string、number、boolean数据类型,只能通过typeof 进行判断
null
a = null
console.log(typeof a, a === null) //object true
在基本数据类型中,undefined和null很特殊,因为他们的值只有一个。但是typeof 判断null的类型,会返回object(后序会讲解为什么),通过===是可以判断null的数据类型的。
对象类型的判断
首先,先创建一个这样的对象
var b = {
b1: [1, 'abc', console.log],
b2: function() {
console.log('b3')
return function () {
return 'hello word'
}
}
}
这里大家可以思考一下,console.log是一个什么类型的数据(可以将自己的想法评论在下方)
console.log(b instanceof Object, b instanceof Array) // true false
通过instanceof可以判断b是对象类型,这里的Object和Array都是构造函数
console.log(b.b1 instanceof Array, b.b1 instanceof Object) // true true
console.log(typeof b.b1) // object
b.b1是一个数组,可以看出数组也属于Object类型,数组是一种特殊的对象。但是不能通过typeof 来判断是否为数组
console.log(b.b2 instanceof Function, b.b2 instanceof Object) // true true
console.log( typeof b.b2 ==='function') // true
b.b2 是一个函数,可以通过typeof来进行判断
总结:经过以上代码研究,可以发现,typeof可以判断的数据类型有:string、number、boolean、function、undefined,但是不能判断null与object 、 Array和object。===可以判断undefined和null ,因为他们都只有一种值。
基本数据类型中,undefined和null 都表示一个空值,那么他们有什么区别呢?????
var data;
console.log(data === undefined); //true
当我们声明了一个变量,没有对其进行初始化时,他的值为undefined
那么我们是否可以将一个值初始为undefined呢?
var data = undefined;
console.log(data === undefined); //true
显然是可以的! 一般而言,我们不存在需要显式地把一个变量设置为undefined值的情况,因为对于未经初始化的值默认就会取得undefined值,而已经初始化的值再将其赋值为undefined来表示空值是没有意义且不可取的。
window.undefined
从上面的例子我们可以看出,无论我们是否初始化过变量,都可以把变量赋值为undefined。
其实这里用于赋值的undefined不是一个值,它是一个属性名,undefined是全局对象的一个属性,也就是说,它是全局作用域的一个变量,即window.undefined
,而window.undefined
这个属性的值才是前面所说的原始值undefined。
data = undefined;
这就相当于把一个变量window.undefined
的值赋值给另一个变量data
,这个值就是原始值undefined。
console.log(window.undefined); //原始值undefined
undefined的判断
如何判断一个变量是否为undefined呢? 这里有两种方法
1. 就是前面所说的使用严格相等符 ===
2. 使用typeof,严格来说,需要以下方式
var data;
console.log(data === void 0); //true
因为void运算符,会对给定的表达式求值,然后返回undefined,因此我们可以使用void 0,来代替undefined来进行判断。
(function() {
var undefined = 'not is undefined';
console.log(undefined); //"not is undefined"
console.log(typeof undefined) // "string"
})()
undefined的值是可以改变的,所以直接使用undefined会不安全。
Null类型
Null类型是第二个只有一个值的数据类型,这个特殊的值就是null。值 null 是一个字面量,它不像undefined 是全局对象的一个属性。
但是为什么typeof null 的返回类型确实object呢? 原因有两个:
一方面从逻辑角度来看,null值表示一个空对象指针,它代表的其实就是一个空对象,所以使用typeof操作符检测时返回”object”也是可以理解的。
另一方面,其实在JavaScript 最初的实现中,JavaScript 中的值是由一个表示类型的标签和实际数据值表示的。对象的类型标签是 0。由于 null 代表的是空指针(大多数平台下值为 0x00),因此,null的类型标签也成为了 0,typeof null就错误的返回了”object”。在ES6中,当时曾经有提案为历史平凡, 将type null的值纠正为null, 但最后提案被拒了,所以还是保持”object”类型。
null使用
一般会在两个地方使用:
初始赋值为null,表示该声明的变量将要赋值为对象
结束前为null,表示将该对象变成垃圾对象,被垃圾回收器回收。