zoukankan      html  css  js  c++  java
  • instanceof, typeof, & Object.prototype.toString

    instanceof: 


      1、左操作数是一个对象,右操作数是标识对象的类,如果左侧的对象是右侧类的实例,则表达式返回true,否则返回false

      2、如果左边的操作数不是对象,返回false

      3、如果右边的操作数不是函数,抛出类型错误异常

      4、在计算obj instanceof f 时, 会先计算f.prototype, 然后在原型链中查找obj,如果找到则obj是f或者是f父类的实例,则返回true

    eg:注意原始值与对象的区别

    //instanceof
    var  data = [1, 2, 3, 4, 5];
    data instanceof Array; //true
    data instanceof Object; //true
    data instanceof Number; //false
    1 instanceof Number; //false
    1 instanceof Object; //false
    
    var num = 1;
    num instanceof Number; //false
    num instanceof Object; //false
    
    var num = Number(1);  
    num instanceof Number;  //false
    num instanceof Object; //false
    
    Number(1) instanceof Number; //false
    Number(1) instanceof Object;  //false
    
    var num1 = new Number(1);
    num1 instanceof Number; //true
    num1 instanceof object; //true
    null instanceof Object; //false;
    undefined instanceof Object; //false;
    
    var  data = [1, 2, 3, 4, 5];
    var bb = {};
    var cc = function(){};
    data instanceof bb; //TypeError: Expecting a function in instanceof check, but got #<Object>
    data instanceof cc; //false

     typeof


     typeof a : typeof 后的操作数可以是任意类型,返回值为操作数类型的字符串

    //typeof
    
    typeof undefined;  // "undefined"
    typeof null;  // "object"
    
    typeof ture;  // "boolean"
    typeof false; // "boolean"
    
    typeof NaN; // "number"
    typeof Infinity // "number"
    typeof 1  //"number"
    typeof "abc"; //"string"
    
    typeof function(){}; // "function"
    typeof RegExp; //"function"
    typeof Math; //"object"

    Object.prototype.toString


    默认的toString方法:Object.prototype.toString()返回[object class], 我们可以通过它获取对象的类型信息

    eg:

    var data = [1, 2, 3, 4, 5];
    Object.prototype.toString.call(data);  //"[object Array]"

    我们可以定义如下的函数返回对象的类型信息

    function classof(obj){
        if(obj === null){
            return "Null";
        }
        if(obj === undefined){
            return "Undefined";
        }
        return Object.prototype.toString.call(obj).slice(8, -1);
    }

    测试:

    classof(null); // "Null"
    classof(undefined) // "Undefined"
    classof("abc"); // "String"
    classof([]); // "Array"
    classof({}); //"Object"
    classof(//); // SyntaxError: Unexpected token }
    classof(/,/); //"RegExp"
    classof(new Date()); //"Date"
    
    classof(window); // "global"
    classof(function(){}); // "Function"
    function f(){}; classof(new f()); //"Object"

    需要注意的:


     1、javascript中除了原始值(数字、字符串、布尔值、null、undefined)之外的都是对象

    2、javascript不区分整数值和浮点数值

    3、任何Javascript值都可以转换为布尔值,下面的都会被转换为false

    undefined
    
    null
    
    0 / -0
    
    NaN
    
    ""

    因而如需检测对象是不是null应该采用如下方式而不是直接if(obj):

    if(obj !== null)

    4、null是关键字可以理解为一个特殊的对象值,但是对 typeof null 返回"object"

    5、undefined用于表示未定义,不是关键字,typeof undefined 返回 "undefined"

      查询时如果不存在返回undefined,函数没有返回值返回undefined;

      undefined是预定义的全局变量;在ECMAScript3中是可读写变量,ECMAScript5中是只读变量

    null == undefined; //true
    
    null === undefined;  //false;

    另外null和undefined不包含任何属性和方法,因而使用用null和undefined做. 或者 [] 操作会报类型错误

    6、null和undefined在任何期望是一个对象的地方都会造成类型错误异常,区别于字符串、数字、布尔值,详细见下一条

    7、字符串,数字和布尔值虽然不是对象,但是在读取它们的属性或者方法时,表现的和对象一样,使用它们的方法和属性时会通过其对应的构造函数创建一个临时对象,例如:

    var string = "wish you happy";
    var words = string.split(" ");
    
    我们在引用string的属性时javascript会调用new String(string);

     但是,如果我们给他们的属性赋值则会忽略相关操作,例如:

    var string = "wish you happy";
    string.length = 17;
    string.len = 14;
    console.log(string.length);  //14
    console.log(string.len);  //undefined

    8、需要注意的类型转换:

    //转化为字符串
    
    undefined: "undefined"
    
    null: "null"
    
    true: "true"
    
    false: "false"
    
    0: "0"
    
    -0: "0"
    
    NaN: "NaN"
    
    Infinity: "Infinity"
    
    -Infinity: "-Infinity"
    
    []: ""
    
    [1, 2, 3]: "1,2,3"
    //转化为数字
    
    undefined: NaN
    
    null: 0
    
    "": 0
    
    "1.2": 1.2
    
    "wish": NaN
  • 相关阅读:
    201521123088《JAVA程序设计》第8周学习总结
    201521123088《Java程序设计》第七周学习总结
    201521123088《Java程序设计》第6周学习总结
    201521123088《JAVA程序设计》第5周学习总结
    网络15软工个人作业5——软件工程总结
    alpha阶段个人总结
    软件工程网络15个人作业3--案例分析
    结对编程 201521123027
    软件工程网络15个人阅读作业2--提出问题(201521123027 陈龙)
    软件工程网络15个人阅读作业1(201521123027 陈龙)
  • 原文地址:https://www.cnblogs.com/wishyouhappy/p/3801048.html
Copyright © 2011-2022 走看看