摘要:類型是第二個只有一個值的數據類型這個特殊的值是。有時會被當作一種對象類型,但是這其實只是語言本身的一個,即對執行時會返回字符串。初始化對象解除循環引用將閉包引用的外部函數中活動對象清除類型是常用的一種類型,只有兩個字面值和。
動態類型
JavaScript 是一種弱類型或者說動態語言。這意味著你不用提前聲明變量的類型,在程序運行過程中,類型會被自動確定。
數據類型最新的 ECMAScript 標準定義了 7 種數據類型:
6 種 原始類型:
Boolean
Null
Undefined
Number
String
Symbol (ECMAScript 6 新定義)
和 Object
typeof 檢測數據類型typeof用來檢測給定變量的數據類型,返回下列某個字符串:
"boolean” --- 變量是布爾值(true/false)
"undefined" --- 變量未定義
"string" --- 變量是字符串
"number" --- 變量是數值
"function" --- 變量是函數
"object" --- 變量是對象或null
"symbol" --- 變量是Symbol
有這樣一道題目,考察 typeof 返回值類型。
typeof(typeof(new Date())) //string
但是在實際項目中,typeof 也只是用來判斷變量是undefined 和 function。因為很多類型不能精確的判斷出來,例如:
Value | function | typeof |
---|---|---|
"foo" | String | string |
new String("foo") | String | object |
1.2 | Number | number |
new Number(1.2) | Number | object |
true | Boolean | boolean |
new Boolean(true) | Boolean | object |
new Date() | Date | object |
new Error() | Error | object |
[1,2,3] | Array | object |
new Array(1, 2, 3) | Array | object |
new Function("") | Function | function |
/abc/g | RegExp | object |
new RegExp("meow") | RegExp | object |
{} | Object | object |
new Object() | Object | object |
注意 typeof /s/ ===function; // Chrome 1-12 , 不符合 ECMAScript 5.1 typeof /s/ === object; // Firefox 5+ , 符合 ECMAScript 5.1
由上得出結論,當使用檢測結果是object或function時,我們并不能看出實際的數據類型。
推薦使用 Object.prototype.toString(),結合call去實現對變量類型的精準判斷。
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]”
簡單封裝如下:
function _typeof(obj){ if(typeof obj == object || typeof obj == function){ var type =Object.prototype.toString.call(obj).split("")[1].toLowerCase(); return type.match(/[a-z]/g).join(""); //正則去除字符串的] } return typeof obj; }
上面代碼在標準瀏覽器中可以完全兼容,但是IE6(雖然現在不必兼容,也要了解下)中,卻會出現以下問題:
_typeof(null); //object _typeof(undefined); //object
原因在于IE6下
Object.prototype.toString.call(undefined); //”[object Object]” Object.prototype.toString.call(null); //”[object Object]”
所以要先添加判斷,使用String()對象將 undefined,null轉為字符串。代碼如下:
function _typeof (obj){ //注意到這里是 == 而不是 === , //undefined 值是派生自 null 值的,所以null == undefined 返回true if(obj == null){ return String(obj) } if(typeof obj == "object"; || typeof obj == "function"){ var type =Object.prototype.toString.call(obj).split(" ")[1].toLowerCase(); return type.substring(0,type.length-1); } return typeof obj; }
String()函數遵循下列轉換規則:
如果值有 toString()方法,則調用該方法(沒有參數)并返回相應的結果;
如果值是 null,則返回"null";
如果值是 undefined,則返回"undefined"。
這樣對 typeof 的擴展就封裝好了。代碼還有優化空間,這里不再繼續。
Jquery已經實現了類型檢測的封裝,jquery.type()的內部實現如下:
//實例對象是能直接使用原型鏈上的方法的 var class2type = {}; var toString = class2type.toString; jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); $.type = function( obj ) { //如果是null或者undefined,直接轉成String返回 //注意到這里是==而不是===, //undefined 值是派生自 null 值的,所以null == undefined 返回true if ( obj == null ) { return String( obj ); } //當typeof 返回 object或function, 進入core_toString return typeof obj === "object" || typeof obj === "function" ? class2type[ core_toString.call(obj) ] || "object": typeof obj; }Undefined
Undefined 類型只有一個值,即特殊的 undefined。在使用 var 聲明變量但未對其加以初始化時,這個變量的值就是 undefined,例如:
var foo; alert(foo == undefined); //true
undefined表示"缺少值",就是此處應該有一個值,但是還沒有定義。
典型用法是:
變量被聲明了,但沒有賦值時,就等于 undefined。
調用函數時,應該提供的參數沒有提供,該參數等于 undefined。
對象沒有賦值的屬性,該屬性的值為 undefined。
函數沒有返回值時,默認返回 undefined。
var name; alert(name) // undefined function f(x){console.log(x)} f() // undefined var o = new Object(); alert(o.p) // undefined var x = f(); alert(x) // undefinedNull
Null 類型是第二個只有一個值的數據類型,這個特殊的值是 null。
如果定義的變量準備在將來用于保存對象,那么最好將該變量初始化為 null。
null 有時會被當作一種對象類型,但是這其實只是語言本身的一個bug,即對 null 執行 typeof null 時會返回字符串"object"。
原理是這樣的,不同的對象在底層都表示為二進制,在JavaScript中二進制前三位都為0的話會被判斷為object類型,null的二進制表示是全0,自然前三位也是0,所以執行 typeof 時會返回“object”。——《你不知道的JavaScript》
使用null的情況:
1.DOM,試圖獲取一個不存在的元素返回一個null值,而不是undefined。
2.初始化一個對象的值,一般設為null。
3.通過分配null值,有效地清除引用,并假設對象沒有引用其他代碼,指定垃圾收集,確保回收內存。
var table = document.getElementById("table"); console.log(table); // null var obj = null; //初始化對象 window.onload = function(){ var el = document.getElementById("id"); var id = el.id; //解除循環引用 el.onclick = function(){ alert(id); } el = null; // 將閉包引用的外部函數中活動對象清除 }Boolean
Boolean 類型是常用的一種類型,只有兩個字面值:true 和 false。
注意:字面值區分大小寫,True 和 False 不是 Boolean 值。
經常遇到就是其他數據類型轉為boolean的問題,只要遵循一個原則:
當值為""(空字符串)、0、NaN、null、undefined 時,都轉為false,其他情況都為true。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79992.html
摘要:基礎鞏固基礎總結使用已經好幾年了,由于工作主要是做服務端開發,在工作中逐漸發現的使用范圍原來越廣泛。這里要注意,務必將基礎部分掌握牢靠,磨刀不誤砍柴功,只有將基礎部分掌握并建立起系統的知識體系,在后面學習衍生的其他模式才能游刃有余。 基礎鞏固:JavaScript基礎總結 使用JavaScript已經好幾年了,由于工作主要是做服務端開發,在工作中逐漸發現JavaScript的使用范圍原...
摘要:一棧數據結構與不同,中并沒有嚴格意義上區分棧內存與堆內存。引用數據類型的值是保存在堆內存中的對象。不允許直接訪問堆內存中的位置,因此我們不能直接操作對象的堆內存空間。為了更好的搞懂變量對象與堆內存,我們可以結合以下例子與圖解進行理解。 showImg(https://segmentfault.com/img/remote/1460000009784102?w=1240&h=683); ...
摘要:不過讓流行起來的原因應該是是目前所有主流瀏覽器上唯一支持的腳本語言。經過測試,數字字符串布爾日期可以直接賦值,修改不會產生影響。再考慮對象類型為或者的情況。對于結果聲明其類型。判斷對象的類型是還是,結果類型更改。 轉載自我的個人博客 歡迎大家批評指正 1. 第一個頁面交互 這里最需要學習的老師的代碼中,每一部分功能都由函數控制,沒有創建一個全部變量。且最后有一個函數來控制執行代碼...
摘要:前綴規范每個局部變量都需要有一個類型前綴,按照類型可以分為表示字符串。例如,表示以上未涉及到的其他對象,例如,表示全局變量,例如,是一種區分大小寫的語言。布爾值與字符串相加將布爾值強制轉換為字符串。 基本概念 javascript是一門解釋型的語言,瀏覽器充當解釋器。js執行時,在同一個作用域內是先解釋再執行。解釋的時候會編譯function和var這兩個關鍵詞定義的變量,編譯完成后從...
摘要:類型轉換和表示一個空對象。如果有其他類型想轉換為或者類型,直接賦值就可以了。都能隱式的把數據類型轉為類型。。。時間時間二數字類型轉換為字符串默認是進制是一個對象類型,所以其他類型轉化為通常都是。 前言 javaScript是一門可以自由進行數據類型轉換的編程語言,類型轉換是javaScript很重要的特色(坑點很多!!!),大家想以后寫出更多嚴謹的代碼(少出一些莫名其妙的Bug),還是...
摘要:原始數據類型和原始數據類型實在太簡單,所以只簡單劃幾個重點原始數據類型不可改變原始數據類型一個非常重要的特征就是不可改變。引用數據類型這里的不是狹義的,包含的預定義引用類型,對,這些都是引用數據類型。 JavaScript是腳本語言 計算機語言可以分為三類,機器語言、匯編語言、高級語言。高級語言又可以簡單分為解釋類和編譯類。這個知道就夠了。 機器語言: 計算機所能識別的二進制語言,一般...
閱讀 955·2023-04-25 23:50
閱讀 1954·2021-11-19 09:40
閱讀 598·2019-08-30 13:50
閱讀 2727·2019-08-29 17:11
閱讀 1041·2019-08-29 16:37
閱讀 2986·2019-08-29 12:54
閱讀 2792·2019-08-28 18:17
閱讀 2636·2019-08-26 16:55