大家好,我是程序员_随心,希望能够通过自己的学习输出给你带来帮助。
前言
JavaScript内置的类型检测机制并不是完全可靠。比如说typeof操作符来判断引用类型时,经常会得到不符合预期的记结果。本文章为了帮助大家在js中进行安全的数据类型检测,在这里我们会列举出一些常见的类型引用时的错误判断,然后再告诉大家如何安全的进行数据类型检测。
首先我们来看typeof操作符,先看mdn上的介绍:
typeof操作符返回一个字符串,表示未经计算的操作数的类型。
首先我们先看下typeof对基本数据类型以及高级数据类型的返回结果
// 基础数据类型
console.log(typeof undefined);
// "undefined"
console.log(typeof null);
// "object"
console.log(typeof '');
// "string"
console.log(typeof 12);
// "number"
console.log(typeof Infinity);
// "number"
console.log(typeof false);
// "boolean"
console.log(typeof (typeof 1) === "number")
// 这里返回什么呢?请看mdn介绍,哈哈哈,是不是第一感觉是true呢
// 引用数据类型
console.log(typeof []);
// "object"
// 上边的我们预期其实是"array",但是却返回了"object",这该如何判断呢,我们不急,下面会讲到
console.log(typeof {});
// "object"
console.log(typeof /123/);
// "object"
// 上边的我们预期其实是"RegExp",但是却返回了"object",这该如何判断呢,我们不急,下面会讲到
console.log(typeof Func)
// 除 Function 外的所有构造函数的类型都是 'object'
var str = new String('String');
var num = new Number(100);
typeof str; // 返回 'object'
typeof num; // 返回 'object'
var func = new Function();
typeof func; // 返回 'function'
我们在判断某一个构造函数的实例对象是否出现在该原型链上时,常会使用instanceof运算符来判断。
function People(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
const Tom = new People('Tom', 18, 'man');
console.log(Tom instanceof People);
// true
console.log(Tom instanceof Object);
// true
针对上述情况,我们可以这样进行判断数据类型,分两种:
-
基础数据类型(除了
null外),都可以使用typeof操作符 -
引用数据类型和null,我们可以利用调用Object原生的toString()方法,都会返回一个
[object NativeConstructorName]格式的字符串。每个类在内部都有一个[[Class]]属性,这个属性就制定了上述字符串中的构造函数名。 const Arr = []; Object.prototype.toString.call(Arr); // "[object Array]" const Reg = /123/; Object.prototype.toString.call(Reg); // "[object RegExp]" const Func = function() {}; Object.prototype.toString.call(Func); // "[object Function]"
最后
您的每一个点赞及评论都是对我坚持写作最大的支持! 另外希望各位朋友和我交流讨论,如有不对的地方,更希望批评指正!
我是程序员_随心,希望能够通过自己的学习输出给你带来帮助。