聊聊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();    //會引發錯誤

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM