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"。