js判断⼀个数据奇偶性_JS中判断数据类型的四种⽅法
前⾔JS中,数据的类型分为基本类型和复杂类型(也叫引⽤类型)。基本数据类型有6种:string、number、boolean、undefined、null、Symbol(ES6开始引⼊的);复杂类型统称object类型,包括Object、Array、Function 、Date等等。以下我们就来讲述判断数据类型的四种⽅法。 typeof 众所周知, typeof只能判断基本数据类型中除null外的、引⽤类型中的function,对于其他的数据类型,返回的都是object。直接上代码:
console.log(typeof 1);console.log(typeof NaN);console.log(typeof Infinity);console.log(typeof 'lester');console.log(typeof true);console.log(typeof undefined 输⼊结果如下:
与我们讲述的⼀致,也不做过多解释了。 instanceof 语法是: instance (实例)  instanceof  constructor (构造函数) , 即判断某构造
函数的原型对象( constructor.prototype )是否出现在实例的原型链上。且先看⼀段代码:
const Person = function (name) {this.name = name;};
const person = new Person();
console.log(person instanceof Person);console.log(person instanceof Object);Person.prototype = {};console.log(person instanceof Person);console.log(pe 输出结果如下:
已经发现这种⽅法的⼀个缺点,就是 构造函数的 prototype属性是可以被修改的,会导致判断是否是其实例的时候会不准。再看⼀段代
码:
const obj = {};const arr = [];
const fn = function () {};
console.log(obj instanceof Object);
console.log(arr instanceof Array);
console.log(arr instanceof Object);
console.log(fn instanceof Function);console.log(fn instanceof Object);
console.log('-----');
console.log('' instanceof String);console.log(1 instanceof Number);console.log(true instanceof Boolean);
console.log(Symbol() instanceof Symbol);
console.log('-----');
console.log(new String('') instanceof String);console.log(new Number(1) instanceof Number);console.log(new Boolean(true) instanceof Boolean);输出结果如下:
也不难知道它的另外⼀个缺点,没法判断基本的数据类型,因为基本数据类型不存在原型链⼀说。instanceof还有⼀个缺点就是它假定只有
⼀个 全局执⾏环境,如果⽹页中包含多个框架,那实际上就存在多个不同全局执⾏环境,从⽽存在两个不同版本的构造函数,如果从⼀个
框架向另⼀个框架传⼊数组,那么传⼊的数组与在第⼆个框架中原⽣态创建的数组分别具有各⾃不同的构造函数。代码如下:
const iframe = ateElement("iframe");document.body.appendChild(iframe);iframeArray = window.frames[0].Array;const arr = new iframeArray
打印结果如下:
针对这个问题,可以⽤ES5提供的 Array.isArray()⽅法,它不会区分对象是在哪个环境下创建的。Array.isArray()的底层原理是⽤的还是
我们后⾯会说到的⼀种⽅法—— String 。 constructor  这种⽅法就是判断某个对象是否是由某个构造函数创建的,
且先看代码:
const Person = function (name) {this.name = name;};const person = new Person();console.structor === Person);console.structor ==
输⼊结果如下:
看起来是可以判断是否是某个构造函数的实例、Object、Array、String、Boolean等类型,但是数字、null、undfined没有constructor
属性,会报错,其实字符串、布尔、Symbol本⾝也没有constructor属性,只是js⾃动帮你转成了对应类型的对象。还有个和instanceof
同样的问题,就是constructor属性是可以被篡改的,可能会导致结果不是我们想要的,所以这种办法也不怎么靠谱。
typeof array
String.call() String.call(data) 是我们判断数据类型最常⽤也是最准确的⽅法。直接上代码:console.log(String.call());console.log(String.call(undefined));console.log(String.call(null));console
打印结果如下:
可以看到,⽤此⽅法基本可以准确地判断各数据类型, String.call ⽅法的原理简单来说就是调⽤的时候,会获取this
的内部属性[[Class]]/[[NativeBrand]](可以⽤来判断⼀个原⽣对象属于哪种内置类型),然后按照格式拼接成字符串return。 结语 以上我
们讲述了判断数据类型的4种⽅法,当在判断⾮null基本数据类型或者或者函数的时候,可以⽤ typeof ;当其他类型,或者判断任何数据类
型的时候,我们就⽤ String.call() 。你get了吗? 点个在看你最好看

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。