首页 > 技术文章 > JavaScript中四种数据类型检测的方法

yznotes 2020-02-29 21:35 原文

js中有七大数据类型,分别是:字符串(String)、数字(Number)、布尔值(Boolean)、undefined、null、Object、Symbol。

Symbol是ES6引入的一种新的原始数据类型,表示独一无二的值。(一般用来给对象做属性名)

1 let s1 = Symbol(1);
2 let s2 = Symbol(1);
3 
4 console.log(s1);  //Symbol(1)
5 console.log(s2);  //Symbol(1)
6 console.log(s1 == s2);  //false

数据类型的检测,可以用typeof、instanceof、constructor、toString()。

1、typeof

1 console.log(typeof 1);//number
2 console.log(typeof '你好');//string
3 console.log(typeof true);//boolean
4 console.log(typeof undefined);//undefined
5 console.log(typeof null);//object
6 console.log(typeof function () { });//function
7 console.log(typeof {});//object
8 console.log(typeof []);//object
9 console.log(typeof /\d/);//object

2、instanceof

instanceof运算符,用来判断一个构造函数的prototype属性指向的对象是否存在另外一个要检测对象的原型链上。

null和undefined会报错。

1 console.log(new Number(1) instanceof Number);//true
2 console.log(new String('你好') instanceof String);//true
3 console.log(new Boolean(true) instanceof Boolean);//true
4 console.log(function () { } instanceof Function);//true
5 console.log({} instanceof Object);//true
6 console.log([] instanceof Array);//true
7 console.log(/\d/ instanceof RegExp);//true

3、constructor

constructor 原型对象的一个默认属性存在,表示创建实例的构造函数的引用。

1 console.log((1).constructor);//function Number()
2 console.log(('你好').constructor);//function String()
3 console.log((true).constructor);//function Boolean()
4 console.log((function () { }).constructor );//function Function()
5 console.log(({}).constructor);//function Object()
6 console.log(([]).constructor);//function Array()
7 console.log((/\d/).constructor);//function RegExp()

4、toString

 1 console.log(Object.prototype.toString.call(123).slice(8, - 1));//Number
 2 console.log(Object.prototype.toString.call(123));//[object Number]
 3 console.log(Object.prototype.toString.call('你好'));//[object String]
 4 console.log(Object.prototype.toString.call(undefined));//[object Undefined]
 5 console.log(Object.prototype.toString.call(null));//[object Null]
 6 console.log(Object.prototype.toString.call(function () { }));
 7 //[object Function]
 8 console.log(Object.prototype.toString.call([]));//[object Array]
 9 console.log(Object.prototype.toString.call({}));//[object Object]
10 console.log(Object.prototype.toString.call(/\d/));//[object RegExp]

 注释:ES3中,Object.prototype.toString方法会执行下面的操作步骤:

1.获取this对象的[[Class]]属性的值;

2.计算出三个字符串"[object" + 第一步的操作结果 + "]" 连接后的新字符串;

3.返回第二部的操作结果;

其中[[Class]]是一个内部属性,所有的对象都拥有该属性。是一个字符串值,表明了该对象的类型。有且只有Object.prototype.toString能调用。

null和undefined并不属于[[Class]]属性的值,那么为什么会输出[object Undefined]和[object Null]呢?

是因为ES5中对Object.prototype.toString的规范中,先判断,如果this值为undefined,返回[object Undefined];其次,如果this的值为null,则返回[object Null];

返回的类型也比ES3多了两种--->arguments对象的[[Class]]成为了"Arguments",而不是之前的"object";全局对象JSON,他的[[Class]]值为"JSON"。

 

推荐阅读