zoukankan      html  css  js  c++  java
  • javascript 变量类型判断

    一、typeof 操作符

    对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时

    var arr=new Array("1","2","3","4","5");
    typeof arr //object

    二、instanceof

    JavaScript中instanceof运算符会返回一个 Boolean 值,指出对象是否是特定类的一个实例。

    var arrayStr=new Array("1","2","3","4","5");
    arrayStr instanceof Array//true

    三、Object.prototype.toString( )

    ECMA-262 :Object.prototype.toString( ) When the toString method is called, the following steps are taken:

    1.Get the [[Class]] property of this object.

    2.Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.

    3.Return Result (2)

    上面的规范定义了Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。
    function isArray(obj) {  
        return Object.prototype.toString.call(obj) === '[object Array]';   
    }

    call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。也许你要问了,为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则很少有人敢去碰它,所以能一定程度保证其“纯洁性”。

    这里我们调用了 Object 对象原型的 toString 方法,如果对象是数组,则该函数返回’[object Array]‘。这种方法也可以用来获得任何其他变量的类型,不管变量的实际类型是什么,返回值都是以 object 开头,因为 Nunmber,String,Boolean,Array,Function 都继承自 JavaScript 内置的 Object 对象,而每一个变量,都是与其类型相应的对象的一个实例。

    var num = 1;
    alert(Object.prototype.toString.call(num)); // [object Number]
    var str = 'hudidit.com';
    alert(Object.prototype.toString.call(str)); // [object String]
    var boo = true;
    alert(Object.prototype.toString.call(boo)); // [object Boolean]
    var fun = function(){};
    alert(Object.prototype.toString.call(fun)); // [object Function]
    var obj = {};
    alert(Object.prototype.toString.call(obj)); // [object Object]
    var arr = [];
    alert(Object.prototype.toString.call(arr)); // [object Array]

    四、jQuery.isArray([]),源码如下:

    isArray: Array.isArray || function( obj ) {
        return jQuery.type(obj) === "array";
    }
    //jQuery.type源码
    var class2type = {};
    var toString = class2type.toString;
    jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
        class2type[ "[object " + name + "]" ] = name.toLowerCase();
    });
    type: function( obj ) {
        if ( obj == null ) {
            return obj + "";
        }
        return typeof obj === "object" || typeof obj === "function" ?
            class2type[ toString.call(obj) ] || "object" :
            typeof obj;
    }
    所以当传入的是字符串,数字,undefined的时直接返回 typeof obj。当传入的是对象、数组、函数时则直接返回 ( class2type[ toString.call(obj) ] || "object" )。
    jQuery定义了class2type的一个对象,并将其初始化为如下的格式:
    {
        "[object Array]" : "array",
        "[object Boolean]" : "boolean",
        "[object Date]" : "date",
        "[object Error]" : "error",
        "[object Function]" : "function",
        "[object Number]" : "number",
        "[object Object]" : "object",
        "[object RegExp]" : "regexp",
        "[object String]" : "string"
    }

    toString方法的返回值正好是class2type对象的key值。所以class2type[ toString.call(obj) ]正好得到我们需要的返回类型字符串。

    isFunction: function( obj ) {
        return jQuery.type(obj) === "function"; 
    }
  • 相关阅读:
    NYOJ232 How to eat more Banana
    NYOJ716 River Crossing(第六届河南省程序设计大赛)
    HDOJ1847 Good Luck in CET4 Everybody!
    NYOJ234 吃土豆
    HDOJ1850Being a Good Boy in Spring Festival
    HDOJ2176 取(m堆)石子游戏
    NYOJ78 圈水池(简单凸包)
    POJ1656 Counting Black (二维树状数组)
    HDOJ1892 See you~(二维树状数组)
    取石子问题 – 1堆
  • 原文地址:https://www.cnblogs.com/chenlogin/p/5287598.html
Copyright © 2011-2022 走看看