• 判断数据类型


    1、toString()

     1 var arr = [1,2,3];
     2 console.log(arr.toString());//1,2,3
     3 
     4 var bo = true;
     5 console.log(bo.toString());//true
     6 
     7 var date = new Date();
     8 console.log(date.toString());//Fri Nov 17 2017 15:18:18 GMT+0800 (中国标准时间)
     9 
    10 var m = function(){
    11     return false;
    12 }
    13 console.log(m.toString());//function (){return false;}
    14 
    15 var num = 123;
    16 console.log(num.toString());//123
    17 
    18 var s = "abc";
    19 console.log(s.toString());//abc
    20 
    21 var a={"name":"zhangsan"};
    22 console.log(a.toString());//[object Object]
    23 
    24 console.log(typeof(arr));//object
    25 console.log(typeof(null));//object
    26 console.log(typeof(a));//object
    27 console.log(Object.prototype.toString.call(arr));//[object Array]
    28 console.log(Object.prototype.toString.call(null));//[object Null]
    29 console.log(Object.prototype.toString.call(a));//[object Object]

    通过上面例子我们则可以看到toString()为何能区分数组,null以及对象。typeof对数组,null以及对象判断的结果都是object,所以区分它们三者的一种办法即使用Object的原型上的方法toString

    此处加一知识点:call和apply。

    call和apply都可以改变this的指向,apply方法,它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。call和apply不同的是——apply()把参数打包成Array再传入;call()把参数按顺序传入;

    比如调用Math.max(3, 5, 4),分别用apply()call()实现如下:

    Math.max.apply(null, [3, 5, 4]); // 5
    Math.max.call(null, 3, 5, 4); // 5

    对普通函数调用,我们通常把this绑定为null

    所以Object.prototype.toString.call(arr))是将this指定到这个arr上了。

    下面系统说一下判断数据是否为数组的方法:

    2、数组的判断

    法一:

    function isArray(obj){
        if(Array.isArray){
            return Array.isArray(obj);
        }else{
            return Object.prototype.toString.call(obj)==="[object Array]";
        }
    }

    法二:

    Array.isArray(obj);   //obj是待检测的对象 

    法三:

    • 通过instanceof运算符来判断

    注意:instanceof运算符左边是子对象(待测对象),右边是父构造函数(这里是Array),

    即:子对象 instanceof  父构造函数 

    instance: 实例:凡是用new 构造函数()创建出的对象,都称为是构造函数的实例

    arr instanceof Array

    法四:

    • 使用isPrototypeOf()函数

    原理:检测一个对象是否是Array的原型(或处于原型链中,不但可检测直接父对象,还可检测整个原型链上的所有父对象)

    使用方法: parent.isPrototypeOf(child)来检测parent是否为child的原型;

    需注意的是isPrototypeOf()函数实现的功能和instancof运算符非常类似;

    Array.prototype.isPrototypeOf(arr) //true表示是数组,false不是数组 

    法五:

    利用构造函数constructor

    obj.constructor == Array
  • 相关阅读:
    window.location.href无法跳转的解决办法
    HTTP 错误 405.0
    C# 浅拷贝与深拷贝
    C# .ToString() 格式化
    深入理解AsyncTask
    【转】Android子线程真的不能更新UI么
    深入理解Activity的启动模式
    Android7.0,剪裁后提示“无法保存经过裁剪的图片”
    Android工程改包名
    javah命令,提示“找不到类文件”
  • 原文地址:https://www.cnblogs.com/gtlm/p/7852111.html
Copyright © 2020-2023  润新知