zoukankan      html  css  js  c++  java
  • 聊聊js中的typeof

    内容:

    1.typeof

    2.值类型和引用类型

    3.强制类型转换

    typeof

    官方文档:typeof

    1.作用:

    操作符返回一个字符串,指示未经计算的操作数的类型。

    2.语法:

              typeof operand

    参数:operand 是一个表达式,表示对象或原始值,其类型将被返回。

    3.返回值:

    类型结果
    Undefined "undefined"
    Null "object"(见下文)
    Boolean "boolean"
    Number "number"
    String "string"
    Symbol (ECMAScript 6 新增) "symbol"
    宿主对象(由JS环境提供) Implementation-dependent
    函数对象([[Call]] 在ECMA-262条款中实现了) "function"
    任何其他对象 "object"

    4.示例:

     1 <!DOCTYPE html>
     2 <html>
     3 
     4 <head>
     5     <meta charset="utf-8">
     6     <title>typeof返回值有哪些类型</title>
     7     <script type="text/javascript">
     8     // Numbers
     9     console.log(typeof 37); //number
    10     console.log(typeof Math.LN2); //number
    11     console.log(typeof NaN); // number   尽管NaN是"Not-A-Number"的缩写
    12     // Strings
    13     console.log(typeof "bla"); // string
    14     console.log(typeof ""); // string
    15     console.log(typeof(typeof 1)); // string typeof总是返回一个字符串
    16     // Booleans
    17     console.log(typeof true); //boolean
    18     // // Symbols
    19     console.log(typeof Symbol()); //symbol
    20     console.log(typeof Symbol('foo')); //symbol
    21     // Undefined
    22     console.log(typeof undefined); //undefined
    23     // Objects
    24     console.log(typeof { a: 1 }); //object
    25     console.log(typeof null);     //object 从一开始出现JavaScript就是这样的
    26     // 使用Array.isArray 或者 Object.prototype.toString.call
    27     // 区分数组,普通对象
    28     console.log(typeof [1, 2, 4]);           //object
    29     console.log(typeof new Date());          //object
    30     // 下面的容易令人迷惑,不要使用!
    31     console.log(typeof new Boolean(true));   //object
    32     console.log(typeof new Number(1));       //object
    33     console.log(typeof new String("abc"));   //object
    34     // 函数
    35     console.log(typeof function() {});     //function
    36     console.log(typeof class C {});        //function
    37     console.log(typeof new Function());    //function
    38     </script>
    39 </head>
    40 
    41 <body>
    42 </body>
    43 
    44 </html>

    从上面的示例得出:

    js中使用typeof能得到的类型有:undefined、string、number、boolean、object、function。

    typeof只能区分值类型的详细类型,而对于引用类型就不行了。

    看完typeof我们顺便来聊聊值类型和引用类型:

    数据类型基本/引用类型
    undefined 基本类型
    null 基本类型
    number 基本类型
    boolean 基本类型
    string 基本类型
    function 引用类型
    object 引用类型

    1.示例:

        var a=1,b=a;
        a=2;
        console.log('a:'+a);//a:2
        console.log('b:'+b);//b:1
        //上面,b获取值是a值的一份拷贝,虽然,两个变量的值是相等,但是两个变量保存两不同的基本数据类型值。b只是保存了a复制的一个副本。所以,当a的值改变时,b的值依然是1;
        var a={'age':20},b=a;
        a.age=22;
        console.log('a:'+JSON.stringify(a));//a:{"age":22}
        console.log('b:'+JSON.stringify(b));//b:{"age":22}
        b.age=11;
        console.log('a:'+JSON.stringify(a));//a:{"age":11}
        console.log('b:'+JSON.stringify(b));//b:{"age":11}
        // 我们声明了一个引用数据类型变量a,并把它赋值给了另外一个引用数据类型变量b。当我们任意改变a、b其中一个的age属性值时,a、b的age属性都会发生变化。说明这两个引用数据类型变量指向同一个堆内存对象。a赋值给b,实际只是把这个堆内存对象在栈内存的引用地址复制了一份给了b,但它们本质上共同指向了同一个堆内存对象。

    学习:JavaScript 是传值调用还是传引用调用?

    顺带说说强制类型转换

    1.字符串拼接

        var a=100+10;
        console.log(a); //110
        var b=100+'10';
        console.log(b);//10010

    2.==运算符

        console.log(100=='100');//true
        console.log(0=='');//true
        console.log(null==undefined);//true

    3.if语句

        var c=true;
        if(c){
            console.log('is true');//执行
        }else {
            console.log('is false');
        }
        var d=100;
        if(d){
            console.log('is true');//执行
        }else {
            console.log('is false');
        }
        var d='';
        if(d){
            console.log('is true');
        }else {
            console.log('is false');//执行
        }

    4.逻辑运算

        console.log(10&&0);//0
        console.log(''||'ab');//'ab'
        console.log(!window.abc);//true  window.abc  undefined  取反则为true
        //判断一个变量是 true还是false可以给其前面加  !!
        var a=100;
        console.log(!!a);//true 

    以下内容来此:ECMAScript 类型转换

    5.Boolean() 函数

    当要转换的值是至少有一个字符的字符串、非 0 数字或对象时,Boolean() 函数将返回 true。如果该值是空字符串、数字 0、undefined 或 null,它将返回 false。

    var b1 = Boolean("");        //false - 空字符串
    var b2 = Boolean("hello");        //true - 非空字符串
    var b1 = Boolean(50);        //true - 非零数字
    var b1 = Boolean(null);        //false - null
    var b1 = Boolean(0);        //false - 零
    var b1 = Boolean(new object());    //true - 对象

    6.Number() 函数

    Number() 函数的强制类型转换与 parseInt() 和 parseFloat() 方法的处理方式相似,只是它转换的是整个值,而不是部分值。

    还记得吗,parseInt() 和 parseFloat() 方法只转换第一个无效字符之前的字符串,因此 "1.2.3" 将分别被转换为 "1" 和 "1.2"。

    用 Number() 进行强制类型转换,"1.2.3" 将返回 NaN,因为整个字符串值不能转换成数字。如果字符串值能被完整地转换,Number() 将判断是调用 parseInt() 方法还是 parseFloat() 方法。

    下表说明了对不同的值调用 Number() 方法会发生的情况:

    用法结果
    Number(false) 0
    Number(true) 1
    Number(undefined) NaN
    Number(null) 0
    Number("1.2") 1.2
    Number("12") 12
    Number("1.2.3") NaN
    Number(new object()) NaN
    Number(50) 50

    7.String() 函数

    最后一种强制类型转换方法 String() 是最简单的,因为它可把任何值转换成字符串。

    要执行这种强制类型转换,只需要调用作为参数传递进来的值的 toString() 方法,即把 12 转换成 "12",把 true 转换成 "true",把 false 转换成 "false",以此类推。

    强制转换成字符串和调用 toString() 方法的唯一不同之处在于,对 null 和 undefined 值强制类型转换可以生成字符串而不引发错误:

    var s1 = String(null);    //"null"
    var oNull = null;
    var s2 = oNull.toString();    //会引发错误
  • 相关阅读:
    debug和release转载
    坐标系与基本图元(8)
    坐标系与基本图元(7)
    坐标系与基本图元(5)
    坐标系与基本图元(6)
    坐标系与基本图元(4)
    坐标系与基本图元(3)
    坐标系与基本图元(2)
    BZOJ 1090
    Xor
  • 原文地址:https://www.cnblogs.com/yingzi1028/p/8119614.html
Copyright © 2011-2022 走看看