JavaScript中判断数据类型的方法

JavaScript中判断数据类型的方法

1.instanceof操作符

instanceof是一个二元操作符,其左侧的操作数是一个对象,右侧的操作数是一个(构造)函数。如果左侧的对象是右侧构造函数的实例,instanceof操作符将返回true。事实上,只要构造函数的原型对象位于该对象的原型链上,instanceof操作符就会返回true。如果用 instanceof 检测原始值,则始终会返回 false,因为原始值不是对象。

1 const obj = {a : 1};
2 const func = function () {
3     console.log("Hello");
4 }
5 
6 console.log(obj instanceof Object); // true
7 console.log(func instanceof Object); // true
8 console.log("Hello" instanceof String); // false
9 console.log(new String("Hello") instanceof String); // true

2.typeof操作符

typeof操作符用于检测任意变量的数据类型。typeof操作符对null返回object属于历史遗留的bug,我们可以将null视为对空对象的引用。typeof操作符对除null之外的所有基本数据类型的变量都将返回对应的类型,而对除函数以外的所有对象将返回object,对函数将返回function。

 1 console.log(typeof 1); // number
 2 console.log(typeof "Hello"); // string
 3 console.log(typeof null); // object
 4 console.log(typeof {a : 1}); // object
 5 console.log(typeof function () {
 6     console.log("Hello");
 7 } ); // function
 8 console.log(typeof Symbol()); // symbol
 9 console.log(typeof undefined); // undefined
10 console.log(typeof true); // boolean

3.constructor

在通过new操作符调用构造函数创建一个新对象时,这个新对象的[[Prototype]]会被设置为构造函数的prototype属性的值,这个值即为构造函数的原型对象的引用。通过new操作符创建的新对象可以通过其[[Prototype]]的constructor属性访问其构造函数。通过构造函数,我们可以获得关于某个对象的类型信息,但如果手动更改了对象的[[Prototype]],则我们得到的构造函数信息也会发生改变。

 1 const Person = function (name, age) {
 2     this.name = name;
 3     this.age = age;
 4 }
 5 
 6 const person = new Person("Alex", 18);
 7 console.log(person.__proto__ === Person.prototype); // true
 8 console.log(person.__proto__.constructor); // [Function: Person]
 9 
10 const Person2 = function (name, age) {
11     this.name = name;
12     this.age = age;
13 }
14 
15 person.__proto__ = Person2.prototype;
16 console.log(person.constructor); // [Function: Person2]

4.调用Object.prototype.toString方法

Object.prototype.toString方法为Object的原型方法,该方法返回当前对象的[[Class]],我们可以通过这个方法获得任意变量的类型信息。

 1 console.log(Object.prototype.toString({a:1})); //[object Object]
 2 console.log(Object.prototype.toString.call(1)); // [object Number]
 3 console.log(Object.prototype.toString.call("Hello")); // [object String]
 4 console.log(Object.prototype.toString.call(Symbol())); // [object Symbol]
 5 console.log(Object.prototype.toString.call(null)); // [object Null]
 6 console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
 7 console.log(Object.prototype.toString.call([1,2,3])); // [object Array]
 8 console.log(Object.prototype.toString.call(true)); // [object Boolean]
 9 console.log(Object.prototype.toString.call(function () {})); // [object Function]
10 console.log(Object.prototype.toString.call(new RegExp())); // [object RegExp]
11 console.log(Object.prototype.toString.call(new Date())); // [object Date]
12 console.log(Object.prototype.toString.call(new Error())); // [object Error]
13 console.log(Object.prototype.toString.call(global)); // [object global]
posted @ 2021-05-03 14:25  曹冲字仓舒  阅读(161)  评论(0)    收藏  举报