內容:
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,但它們本質上共同指向了同一個堆內存對象。
順帶說說強制類型轉換
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(); //會引發錯誤
