zoukankan      html  css  js  c++  java
  • typeof,instanceof笔记

    typeof

    • typeof用以获取一个变量或者表达式的类型,typeof一般只能返回如下几个结果:

    number,boolean,string,function(函数),object(NULL,数组,对象),undefined。只能区分基本类型

    • 不同的对象在底层都表示为二进制,在 JavaScript 中二进制前三位都为 0 的话会被判 断为 object 类型,null 的二进制表示是全 0,自然前三位也是 0,所以执行 typeof 时会返回“object”。

    • 要想区分对象、数组、函数、单纯使用typeof是不行的。在JS中,可以通过Object.prototype.toString方法,判断某个对象之属于哪种内置类型。
      分为nullstringbooleannumberundefinedarrayfunctionobjectdatemath

    • 我们可以使用typeof来获取一个变量是否存在,如if(typeof a!="undefined"){},而不要去使用if(a)因为如果a不存在(未声明)则会出错,

    1. 判断基本类型
    
    Object.prototype.toString.call(null); // "[object Null]"
    Object.prototype.toString.call(undefined); // "[object Undefined]"
    Object.prototype.toString.call(“abc”);// "[object String]"
    Object.prototype.toString.call(123);// "[object Number]"
    Object.prototype.toString.call(true);// "[object Boolean]"
    
    2. 判断原生引用类型
    
    **函数类型**
    Function fn(){
      console.log(“test”);
    }
    Object.prototype.toString.call(fn); // "[object Function]"
    **日期类型**
    var date = new Date();
    Object.prototype.toString.call(date); // "[object Date]"
    **数组类型**
    var arr = [1,2,3];
    Object.prototype.toString.call(arr); // "[object Array]"
    **正则表达式**
    var reg = /[hbc]at/gi;
    Object.prototype.toString.call(reg); // "[object RegExp]"
    **自定义类型**
    function Person(name, age) {
        this.name = name;
        this.age = age;
    }
    var person = new Person("Rose", 18);
    Object.prototype.toString.call(arr); // "[object Object]"
    很明显这种方法不能准确判断person是Person类的实例,而只能用instanceof 操作符来进行判断,如下所示:
    
    console.log(person instanceof Person); // true
    
    3. 判断原生JSON对象
    
    var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON);
    console.log(isNativeJSON);// 输出结果为”[object JSON]”说明JSON是原生的,否则不是;
    注意:Object.prototype.toString()本身是允许被修改的,而我们目前所讨论的关于Object.prototype.toString()这个方法的应用都是假设toString()方法未被修改为前提的。
    
    4. 实例:为Array对象添加一个去除重复项的方法
    
    input
    [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN].uniq()
    output
    [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
    
    这里要注意,NaN === NaN 为false,{} === {}为false。
    
    Array.prototype.uniq = function () {
        if (!this.length || this.length == 0) return this;
        var res = [], key, hasNaN = false, temp = {};
        for (var i = 0 ; i < this.length; i++) {
            if (typeof this[i] === 'object') {
                res.push(this[i]);
            } else if (this[i] != this[i]) { // 如果当前遍历元素是NaN
                if (!hasNaN) {
                    res.push(this[i]);
                    hasNaN = true;
                }
            } else {
                key = typeof(this[i]) + this[i];
                if (!temp[key]) {
                    res.push(this[i]);
                    temp[key] = true;
                }
            }
        }
        return res;
    }
    另一种解法:
    
    Array.prototype.uniq = function () {
        var res = [];
        var flag = true;
        this.forEach(function(x) {
            if (res.indexOf(x) == -1) {
                if (x != x) {
                    if (flag) {
                        res.push(x);
                        flag = false;
                    }
                } else {
                    res.push(x);
                }
            }
        })
        return res;
    }
    
    • instanceof用于判断一个变量是否某个对象的实例,如var a=new Array();alert(a instanceof Array);会返回true,
  • 相关阅读:
    FEniCS 1.1.0 发布,计算算术模型
    Piwik 1.10 发布,增加社交网站统计
    淘宝褚霸谈做技术的心态
    CyanogenMod 10.1 M1 发布
    Druid 发布 0.2.11 版本,数据库连接池
    GNU Gatekeeper 3.2 发布
    Phalcon 0.9.0 BETA版本发布,新增大量功能
    EUGene 2.6.1 发布,UML 模型操作工具
    CVSps 3.10 发布,CVS 资料库更改收集
    Opera 移动版将采用 WebKit 引擎
  • 原文地址:https://www.cnblogs.com/yxyc/p/14716100.html
Copyright © 2011-2022 走看看