JS数据类型的判断主要有四种方法:typeof、instanceof、constructor、Object.prototype.toString.call()。
数据类型的包括:number、boolean、string、symbol、object、array、undefined、null、function等9种数据类型
7种数据类型有包含:基本类型值和引用类型值 。 基本数据类型指的是简单的数据段,而引用数据类型指那些可能有多个值组成的对。
基本类型(值类型)
- Undefined 在使用var声明变量但未对其初始化时,或者使用了一个并未声明的变量时,又或者使用了一个并不存在的对象属性时,这个变量的值就是undefined。
- Null 从逻辑上看,null值表示一个空对象指针,独一无二。
- Boolean true、false
- Number NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)
- String 字符串可以由’’ 或 “” 表示。 ES中字符串是不可改变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
这五种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。
复杂类型(引用类型)
- Object 对象其实就是一组数据和功能的集合。对象可以通过new操作符后跟要创建的对象类型的名称来创建。 而创建Object的实例并为其添加属性和方法,就可以自定义对象。
- Object类型
- Array类型
- Date类型
- RegExp类型
- Function类型
引用类型的值是保存在内存中的对象。与其他语言不同,js不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。 操作对象时,实际上是在操作对象的引用而不是实际的对象。(这种说法不太严谨,为对象添加属性时,操作的是实际的对象)。
值类型与引用类型的差别
- 基本类型在内存中占据固定大小的空间,因此被保存在栈内存中
- 从一个变量向另一个变量复制基本类型的值,复制的是值的副本
- 引用类型的值是对象,保存在堆内存
- 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针
- 从一个变量向另一个变量复制引用类型的值的时候,复制是引用指针,因此两个变量最终都指向同一个对象
1.typeof
检测基本数据类型的最佳选择是使用typeof
eg:
typeof Symbol(); // symbol 有效
typeof ‘’; // string 有效
typeof 1; // number 有效
typeof true; // boolean 有效
typeof undefined; // undefined 有效
typeof new Function(); // function 有效
typeof null; // object 无效
typeof [] ; // object 无效
typeof new Date(); // object 无效
typeof new RegExp(); // object 无效
返回一个表示数据类型的字符串,返回结果包括:number、boolean、string、symbol、object、undefined、function等7种数据类型,但不能判断null、array等
由结果可知,除了在检测null时返回 object 和检测function时放回function。对于引用类型返回均为object
2.instanceof
检测引用型数据类型时的最佳选择是instanceof
eg:
[] instanceof Array; // true
{} instanceof Object; // true
new Boolean instanceof Boolean; // true
new Date() instanceof Date; // true
new RegExp() instanceof RegExp; // true
null instanceof Null; // 报错
undefined instanceof undefined; // 报错
用来判断A是否为B的实例,A instanceof B, 返回 boolean 值。instanceof 用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性,但它不能检测 null 和 undefined
3.constructor
查看对象对应的构造函数
object的每个实例都具有属性constructor,保存着用于创建当前对象的函数。
eg:
console.log(bool.constructor === Boolean); // true
console.log(num.constructor === Number); // true
console.log(str.constructor === String); // true
console.log(arr.constructor === Array); // true
console.log(obj.constructor === Object); // true
console.log(fun.constructor === Function); // true
undefined和null没有contructor属性
constructor不能判断undefined和null,并且使用它是不安全的,因为contructor的指向是可以改变的。
4.Object.prototype.toString.call()
一般数据类型都能够判断,最准确最常用的一种
eg:
console.log(Object.prototype.toString.call(bool)); // [object Boolean]
console.log(Object.prototype.toString.call(num)); // [object Number]
console.log(Object.prototype.toString.call(str)); // [object String]
console.log(Object.prototype.toString.call(und)); // [object Undefined]
console.log(Object.prototype.toString.call(nul)); // [object Null]
console.log(Object.prototype.toString.call(arr)); // [object Array]
console.log(Object.prototype.toString.call(obj)); // [object Object]
console.log(Object.prototype.toString.call(fun)); // [object Function]
console.log(Object.prototype.toString.call(new Date())) ; // [object Date]
console.log(Object.prototype.toString.call(new RegExp())) ; // [object RegExp]
console.log(Object.prototype.toString.call(new Error())) ; // [object Error]