关于js的范例检测

javascript的变量范例分为原始范例和援用范例。

  • 原始范例又有5种:

    • number

    • string

    • boolean

    • null

    • undefined

  • 援用范例有:

    • Function

    • Array

    • Date

    • Object

    • RegExp

而检测这些范例的变量有3种要领:typeofinstanceofObject.prototype.toString.call。让我来逐一例举,空话不多说,上代码。

//首先是typeof
var obj = 1;
typeof obj; //"number"
obj = "abc"
typeof obj; //"string"
obj = false
typeof obj; //"boolean"
obj = undefined;
typeof obj; //"undefined"
obj = null;
typeof obj; //"object",WTF,实在这是js的一个bug,人艰不拆 T_T

obj = function(){};
typeof obj; //"function"
obj = [];
typeof obj; //"object"
obj = {};
typeof obj; //"object"
obj = /w/g;
typeof obj //"object"

从上面我们能够得出type能检测原始范例number,string,boolean,undefined,援用范例的function。这里容我罪恶的笑一笑。
而关于援用范例,还能够尝试下instanceof操作符。

var obj = function(){};
obj instanceof Function; //true
obj = [];
obj instanceof Array; //true
obj = {};
obj instanceof Object; //true
obj = new Date()
obj instanceof Date; //true
obj = /w/g;
obj instanceof RegExp; //true
//....桥豆麻袋, 事变实在还没完呢
obj = [];
obj instanceof Object; //true  草草嗒,一切援用范例实在都是继续自Object对象的,所以你懂的。

incetanceof 操作符能判别援用范例,惋惜有个缺憾是,假如想判别一个变量object范例而不是其他的functionarraydate什么的,依然须要花一番气力。
这里我们是不是是漏了什么,假如..

var obj = new String('abc');
typeof obj; //"object" 。 
obj instanceof String; //true 。 

天了个撸,不能兴奋游玩了。要诠释这个, 就得诠释js里变量的赋值划定规矩。

  • 原始范例的变量直接保留原始值,而不是一个只想对象的指针。假如一个变量赋值给另一个变量,那末每一个变量都它自己的一份数据拷贝,并不会相互影响。

  • 援用范例的变量保留的是一个指向内存中现实对象地点的指针(或许说援用)。因而当你将一个对象赋值给变量时,现实是赋值给这个变量一个指针。意味着将一个变量赋值给另一个变量时,两个变量指向的是内存中同一个对象。

var obj = 'abc';
obj.something = 1;
var firstChar = obj.charAt(0); //"a"
console.log(obj.something); //undefined
//现实上js做了如许的处置惩罚
var obj = 'abc';
var temp = new String(obj);
var firstChar = temp.charAt(0); //"a"
temp.something = 1;
temp = null;
console.log(obj.something); //undefined

创建了一个暂时的援用范例变量去接见属性,修正属性,然后就被释放了。阿咧,扯远了,这和我们这片的内容啥关联。。
总而言之,假如指定obj = "abc"则obj保留的现实上就是abc的值,是一个基础范例。而假如指定obj = new String('abc')那末obj现实上保留的是一个指向字符串对象的指针。所以就不难理解二者关于typeofinstanceof的差别了
额,读者:“说了这么多,你有无一种万全的手腕哇”。好吧, 我们来一个简朴又粗犷的判别手腕。

var obj = 1;
Object.prototype.toString.call(obj) === '[object Number]'; //true
obj = new Number(1);
Object.prototype.toString.call(obj) === '[object Number]'; //true

obj = [];
Object.prototype.toString.call(obj) === '[object Array]'; //true
obj = new Array();
Object.prototype.toString.call(obj) === '[object Array]'; //true
Object.prototype.toString.call(obj) === '[object Object]'; //false

这个要领是不是是很好用呢, 哇哈哈哈哈。
总结归结了下,我列举了一些校验函数:

//低版本ie中undefined变量能够被修正,所以运用void 0 猎取实在的undefined值,
var isUndefined = function(obj) {
    //or: return typeof obj === 'undefined';
    return obj === void 0;
};
//typeof null 的结果是"object"。
var isNull = function(obj) {
    return obj === null;
};
// boolean值,number值和string值须要斟酌两种状况,值为字面量时运用typeof和Object.prototype.toString能检测; 
// 值为组织函数构建的时刻须要运用Object.prototype.toString或许instanceof检测
var isBoolean = function(obj) {
    return Object.prototype.toString.call(obj) == '[object Boolean]';
};
var isNumber = function(obj) {
    return Object.prototype.toString.call(obj) == '[object Number]';
};
var isString = function(obj) {
    return Object.prototype.toString.call(obj) == '[object String]';
};
var isNaN = function(obj) {
    return obj !== obj;
};

//typeof 操作符在援用范例的变量里能对function有用。
var isFunction = function(obj) {
    //or:  return Object.prototype.toString.call(obj) == '[object Function]';
    return typeof obj === 'function';

};
var isDate = function(obj) {
    return Object.prototype.toString.call(obj) == '[object Date]';
}
var isArray = function(obj) {
    return Object.prototype.toString.call(obj) == '[object Array]';
}
var isObject = function(obj) {
    //or: return obj === Object(obj);
    return Object.prototype.toString.call(obj) == '[object Object]';
}
var isRegExp = function(obj) {
    //or: return obj === Object(obj);
    return Object.prototype.toString.call(obj) == '[object RegExp]';
}

var has = function(obj, key) {
    return Object.prototype.hasOwnProperty.call(obj, key);
};
//推断数组,字符串,对象是不是为空
var isEmpty = function(obj) {
    if (obj == null) return true;
    if (isArray(obj) || isString(obj)) return obj.length === 0;
    for (var key in obj) if (has(obj, key)) return false;
    return true;
};
    原文作者:子云兄
    原文地址: https://segmentfault.com/a/1190000003490301
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞