一、typeof
typeof
运算符返回一个字符串,表示操作数的类型。
console.log(typeof 42); //输出:number
console.log(typeof 'blubber'); //输出:string
console.log(typeof true); //输出:boolean
console.log(typeof undeclaredVariable); //输出:undefined
语法:
typeof operand //operand表示要返回类型的对象或基本类型的表达式。
二、instanceof
instanceof
运算符用于检测构造函数的 prototype
属性是否出现在某个实例对象的原型链上。
(就是可以判断对象是否为某个构造函数的实例)
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
//实例对象auto
const auto = new Car('Honda', 'Accord', 1998);
console.log(auto instanceof Car); //输出:true
console.log(auto instanceof Object); //输出:true
语法:
object instanceof constructor
// object :某个实例对象
// constructor:某个构造函数
三、Object.protype.toString.call()
使用Object对象的原型方法toString来判断数据类型
- 优点:可以判断复杂的数据类型,包括数组、正则表达式等
- 缺点:需要调用Object.protype.toString.call()方法,语法较复杂
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
var a=Object.prototype.toString
console.log(a.call('abc')); //输出:[object String]
console.log(a.call(2)); //输出:[object Number]
</script>
</body>
</html>
四、Array.isArray()
Array.isArray()
静态方法用于确定传递的值是否是一个数组。
- 优点:语法简单,只需调用Array.isArray()方法即可判断。
- 缺点:只能判断数组类型,有局限性
console.log(Array.isArray([1, 3, 5])); //输出:true
console.log(Array.isArray('[]')); //输出:false
console.log(Array.isArray(new Array(5))); //输出:true
console.log(Array.isArray(new Int16Array([15, 33]))); //输出:false
五、constructor 属性
constructor有两个作用:
- 判断数据类型
- 对象实例通过
constructor访问它的构造函数。注意,如果创建一个对象来改变它的原型,constructor就不能来判断数据类型了
- 优点:语法简单,只需访问变量的constructor属性即可判断。
- 缺点:当变量被重新赋值时,可能会出现问题,无法判断null和undefined类型
function Fn(){}
Fn.prototype = new Array();
var f = new Fn()
console.log(f.constructor === Fn) //false
console.log(f.constructor === Array) //true