检验数据类型的几个方法 ,如有不对,请大佬指点
- typeof 可以检测一些基本的数据类型,语法上可以选择加括号不加都可以的。但是注意 在检验 数组、对象、正则、null 的时候返回的都是Object,所以有时要针对对象或数组做些判断就不是很好了。
请看示例:
console.log(typeof "你好呀"); 输出结果 String
console.log(typeof 1); 输出结果 Number
console.log(typeof false); 输出结果 Boolean
console.log(typeof undefined); 输出结果 undefined
console.log(typeof /$/); 输出结果 Object
console.log(typeof null); 输出结果 Object
console.log(typeof []); 输出结果 Object
console.log(typeof {}); 输出结果 Object
console.log(typeof function () {}); 输出结果 function
- constructor 构造函数,
请看示例:
console.log(("你好").constructor === String); 输出结果 true
console.log(([]).constructor === Array); 输出结果 true
console.log(({}).constructor === Object); 输出结果 true
console.log((1).constructor === Number); 输出结果 true
console.log((true).constructor === Boolean); 输出结果 true
console.log((function () {}).constructor === Function); 输出结果 true
console.log((/$/).constructor === RegExp); 输出结果 true
// console.log((null).constructor === null); 输出结果 报错
// console.log((undefined).constructor === undefined); 输出结果 报错
如果不算 null 与 undefined 的话 constructor基本可以应对基本数据类型与引用数据类型的数据类型是啥,但 事实还是有些偏差,constructor并不可靠,容易被修改 即使被修改了,也不会影响代码的正常运行。
正常开发的时候,constructor不小心被修改了,为了方便维护,和开发,可以手动更正constructor的指向。
请看示例:
function fn() {}
let f = new fn;
console.log(f.constructor.name); 输出结果 'fn'
console.log(fn.constructor); 输出结果 Function(){}
console.log(Function.constructor); 输出结果 Function(){}
- instanceof 检测当前实例是否隶属于某各类。双目运算符 a instanceof b ,判断a的构造器是否为 b,返回值为布尔值
但是 如果直接对对象字面量创建的基础数据类型做验证 返回的却不是所属类型,而引用数据类型的验证却是正常的。如果我们以new字符去创建基础数据类型,此时的结果才是所属数据类型。对于null 和 undefined 这两个 我的理解是反正这两个怎么玩都是报错 o(╯□╰)o
请看示例:
console.log(("你好") instanceof String); 输出结果 false
console.log((1) instanceof Number); 输出结果 false
console.log((true) instanceof Boolean); 输出结果 false
console.log(([]) instanceof Array); 输出结果 true
console.log(({}) instanceof Object); 输出结果 true
console.log((function () {}) instanceof Function); 输出结果 true
console.log((/$/) instanceof RegExp); 输出结果 true
console.log(new String("你好") instanceof String); 输出结果 true
console.log(new Number(1) instanceof Number); 输出结果 true
console.log(new Boolean(true) instanceof Boolean); 输出结果 true
//console.log((null) instanceof null); 输出结果 报错
//console.log(new(null) instanceof null); 输出结果 报错
//console.log((undefined) instanceof undefined); 输出结果 报错
//console.log(new(undefined) instanceof undefined); 输出结果 报错
- Object.prototype.toString.call() 我认为这个是最强大的方法(个人看法,不喜轻喷),就是长了点,当然 如果简单地就随意了。并且 我们改变原型也不会有任何影响
请看示例:
let isType = (type) => {
return Object.prototype.toString.call(type);
}
console.log(isType('111')); 输出结果 [object String]
console.log(isType(111)); 输出结果 [object Number]
console.log(isType(true)); 输出结果 [object Boolean]
console.log(isType(['111'])); 输出结果 [object Array]
console.log(isType({a: '111'})); 输出结果 [object Object]
console.log(isType(/$/)); 输出结果 [object RegExp]
console.log(isType(function () {})); 输出结果 [object Function]
function abc() {};
abc.prototype = new Array();
console.log(isType(abc)); 输出结果 [object Function]
- isArray 判断是否为数组、 isNaN() 判断是否是NaN,这两个就简单示范一下了。
请看示例
console.log(Array.isArray([])); 输出结果 true
console.log(Array.isArray(new Array())); 输出结果 true
console.log(isNaN(NaN)); 输出结果 true
console.log(isNaN(+"12ab")); 输出结果 true
- hasOwnporperty 检测当前属性是否为对象的私有属性。语法: obj.hasOwnporperty(“属性名(K值)”)
请看示例:
let obj = {
name:"xx"
};
console.log(obj.hasOwnProperty('name')); 输出结果 true
console.log(obj.hasOwnProperty('xxxx')); 输出结果 false
小汪还是一个小白,如有大佬指点,万分感谢。