1.javaScirpt的数据类型有哪些?
基本数据类型:(5种)
- Undefined
- Null
- Boolean
- String
- Number
引用数据类型:(1种)
- Object
(注意:array,function,object都属于Object)
Es6新增的数据类型:(1种)
- symbol
2.常用的检测数据类型的方法有哪些呢?
typeof
- typeof可以判断的类型: number、boolean、symbol、string、object、undefined、function
- 优点: 可以区分function和object
- 缺点:
- type null 返回 object,可以理解为空对象,但其实我们想要的是Null
- 数组(Array),日期(Date),正则(RegExp)都会返回object,但其实我们想要更加详细的区分 (检测null的类型是显示为object)
let m=null;
console.log(typeof m);//object
出现null检测为object原因:
在JS的最初版本中使用的是32位系统,为了性能考虑使用低位存储变量的类型信息,000开头的是对象,null是全0,所以将null误判为Object了,虽然现在的内部类型判断代码已经改变了,但bug永久的遗留下来了
let str="abcdefg";
let num=123;
let bol=true;
let n=undefined;
console.log(typeof str);//string
console.log(typeof num);//number
console.log(typeof bol);//boolean
console.log(typeof n); //undefined
typeof检测引用数据类型
let arr=[1,2,3]
function show(){
return "show"
}
let obj={
name:"jack",
age:"18"
}
console.log(typeof arr);//object
console.log(typeof show);//function
console.log(typeof obj);//object
instanceof
instanceof检测数据类型,可以用instanceof判断对象的正确类型,它的内部机制是通过原型链来判断的。
- 功能: 用于判断两个对象是否属于实例关系(可以借此判断数据类型)
- 缺点: 无法判断某一对象具体属于哪种类型
//判断对象
const Person=function(){};
const p1=new Person();
console.log(p1 instanceof Person);//true
// 判断基本数据类型
const str="string";
console.log(str instanceof String);//false
const num=123;
console.log(num instanceof Number);//false
const bol=false;
console.log(bol instanceof Boolean);//false
const sym=Symbol();
console.log(sym instanceof Symbol);//false
// 如何让instanceof检测基本数据类型呢?
const num1=new Number(123);
console.log(num1 instanceof Number);//true
console.log(num1 instanceof Object);//true
const str1=new String("abcdef");
console.log(str1 instanceof String);//true
console.log(num1 instanceof Object);//true
constructor
- 功能: constructor是原型prototype的一个属性,可以通过一个对象的constructor属性比对对象的数据类型
- 缺点: null 和 undefined 没有constructor
false.constructor == Boolean; // true
"123".constructor == String; // true
new Number(123).constructor == Number; // true
[].constructor == Array; // true
new Function().constructor == Function; // true
new Date().constructor == Date; // true
document.constructor == HTMLDocument; // true
window.constructor == Window; // true
new Error().constructor == Error; // true
Object.prototype.toString.call()
- 功能: toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]]
Object.prototype.toString.call('123') ; // [object String]
Object.prototype.toString.call(123) ; // [object Number]
Object.prototype.toString.call(false) ; // [object Boolean]
3、小结
最常用的还是前面两种检测数据类型的方法,需要注意的是要区分这两种方法的利弊,用在合适的地方,typeof一般用在将基础的数据类型做一个简单的判断,instanceof一般是用在检测原型上面,其他两种方法做一个简单的了解即可!