zoukankan      html  css  js  c++  java
  • javascript:对象类型检查

    我们知道,javascript是一种弱类型的语言,并且,javascript中的一切实质上都是对象。那么,在javascript中如何进行对象的类型检查将是一个非常重要的话题。

    这里,我将介绍两种在js中经常使用的用于类型检测的方法。

    第一种方法是使用"typeof"操作符,这种方法可能大家都知道。使用它来进行类型检测的结果是下列六个字符串中的其中一个:"number","boolean","object","number","function","string"。不错,使用这个操作符,绝大部分的对象类型我们都可以检测到,但是,这里有一个例外:那就是在使用数组的时候。javascript本身对于数组和对象的区别是混乱的,typeof运算符报告数组和对象的类型都是"object",因此,javascript在区别数组和对象的方式上并没有yield好的机制。

    例如:

    var arr=[1,2,3,4,5]
    var obj={"name":"xiaoming","sex":"nan"};
    alert(typeof arr)//返回"object"
    alert(typeof obj)//返回"object"

    那么,我们该如何判别这种特殊的情况呢?

    这里,便是我要讲到的第二种常用的进行类型检查的方式:"constructor"属性。

    在javascript中,任何对象都有一个constructor属性,它引用的是用来构造该对象的原始函数。

    下面一段示例代码说明了这种方式的用法:

    var num=11,str="abc",obj={num:11},arr=[1,2,3];
    alert(num.constructor===Number);//true
    alert(str.constructor===String);//true
    alert(obj.constructor===Object);//true
    alert(arr.constructor===Array);//true

    可以看到,使用constructor时,数组返回的不再是object,而是具有鲜明意义的Array。

    下表展示了使用上述两种方式对不同类型对象进行类型检查的结果。

     变量                                   typeof变量                       变量.construtor


      {an:"object"}                         object                               Object

      ["an","array"]                         object                                Array

      function(){}                            function                             Function

      "a string"                                string                                 String

      55                                           number                              Number

      true                                         boolean                             Boolean

      new User()                              object                                User


    这里需要注意的是,typeof运算符返回的结果是一个字符串;而constructor属性返回的结果是一个对象

    因此,通过上面的只是,我们可以定义自己的is_array函数来进行数组的检查:

    var is_array=function(){
      return value &&
          typeof value==='object' &&
          value.constructor===Array;
    }
  • 相关阅读:
    Autofac官方文档翻译--二、解析服务--2隐式关系类型
    Verdi 不加载filelist,load design方法
    Power-Aware GateSim Debug
    simulation vs emulation
    关于SMI、MSI、SCI、INTx各种中断小结【转】
    zgrep用法
    sometimes we should use "disable fork" instead of "disable block_name"
    How to view assertions in the Verdi waveform viewer
    FIFO设计中的深度计算【zz】
    写写我的硕士三年【zz】
  • 原文地址:https://www.cnblogs.com/douglasvegas/p/4695793.html
Copyright © 2011-2022 走看看