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