13、JavaScript 判断变量的类型的方法
1、typeof 运算符:
可以返回一个字符串,表示变量的数据类型。例如:
let num = 123;
console.log(typeof num); // "number"
let str = "Hello";
console.log(typeof str); // "string"
2、instanceof 运算符:
可以用来判断一个变量是否是一个特定类型的实例。例如:
let arr = [1, 2, 3];
console.log(arr instanceof Array); // true
let date = new Date();
console.log(date instanceof Date); // true
3、Object.prototype.toString.call() 方法:
可以返回一个字符串,表示变量的数据类型。例如:
let num = 123;
console.log(Object.prototype.toString.call(num)); // "[object Number]"
let str = "Hello";
console.log(Object.prototype.toString.call(str)); // "[object String]"
4、constructor 属性:
每个 JavaScript 对象都有一个 constructor 属性,表示该对象的构造函数。例如:
let arr = [1, 2, 3];
console.log(arr.constructor === Array); // true
let date = new Date();
console.log(date.constructor === Date); // true
以上是 JavaScript 中判断变量类型的几种方法,使用不同的场景需要使用不同的方法。
手写instanceof()
function myInstanceof(left, right) {
// 获取对象的原型
let proto = Object.getPrototypeOf(left)
// 获取构造函数的 prototype 对象
let prototype = right.prototype;
// 判断构造函数的 prototype 对象是否在对象的原型链上
while (true) {
if (!proto) return false;
if (proto === prototype) return true;
// 如果没有找到,就继续从其原型上找,Object.getPrototypeOf方法用来获取指定对象的原型
proto = Object.getPrototypeOf(proto);
}
}
//测试1
let obj = new Object()
console.log(myInstanceof(obj, Object)); //true
//测试2
function Father() { }
function Son(){}
Son.prototype = new Father()
let obj2 = new Son()
console.log(myInstanceof(obj2,Son)); //true
console.log(myInstanceof(obj2,Father)); //true
应用场景的区别
-
typeof 运算符:
typeof
运算符是最常用的判断变量类型的方法,它可以识别出数字、字符串、布尔值、对象、函数、未定义等数据类型。但是它有一个缺点,就是对于数组和 null 对象,它都返回 “object”,因此不能很好地识别出数组和 null 类型。 -
instanceof 运算符:
instanceof
运算符是一个比较特殊的方法,它可以判断一个变量是否是某个构造函数的实例,因此能够很好地识别出数组、日期、正则表达式等类型。 -
Object.prototype.toString.call() 方法:
Object.prototype.toString.call()
方法是一个很强大的方法,它可以识别出所有的数据类型,并且返回类型的字符串标识,如 “[object Number]”、“[object String]”、“[object Array]” 等。因此使用该方法可以很好地判断出所有数据类型。 -
constructor 属性:每个 JavaScript 对象都有一个
constructor
属性,表示该对象的构造函数。可以通过判断该属性的值是否等于某个构造函数,来判断该对象的类型。但是这种方法有一个缺点,就是对于基本数据类型(如数字、字符串),它们是没有constructor
属性的,因此不能很好地识别出基本数据类型。在实际开发中,我们可以根据需要选择不同的方法来判断变量的类型,如果需要识别所有的数据类型,则可以使用
Object.prototype.toString.call()
方法;如果只需要识别基本数据类型,则可以使用typeof
运算符;如果需要识别特定的数据类型,则可以使用instanceof
运算符或constructor
属性。