摘要:我們再用復(fù)合條件來檢測一下值的類型由此我們知道,隱式強(qiáng)制類型轉(zhuǎn)換成了反值為說明的布爾值為,并對它的類型做出全等比較,最后返回。
我的第一篇文章
從開始學(xué)前端直至現(xiàn)在已有一年的時間了,期間遇見了很多事情,也經(jīng)歷了各式各樣的技術(shù)問題,為了讓自己擺脫這些這些問題,最后養(yǎng)成了看書的習(xí)慣。因?yàn)槊看慰赐昕傆X得自己內(nèi)功又增了,哪怕只是一點(diǎn)??上У氖敲看慰赐甓紩粢恍绕涫菦]有自己的實(shí)踐和知識點(diǎn)太多時總會遺忘一些,但我不希望這種事情發(fā)生,
可能只是因?yàn)檫@一點(diǎn),以后就會找?guī)滋斓腷ug,這是每個程序員都不敢預(yù)想的場景。最后我決定把我每天對知識的累積,用我理解的角度去記錄下來。筆記和文章唯一的不同前者是私有,后者是公開的,希望通過我對它理解可以幫助他人,也請大家能指出文章中的問題,感激不盡。
類型
內(nèi)置類型ECMAScript語言中所有的值都對應(yīng)一個類型。語言類型包括:Undefined,Null,Boolean,String,Number,Object。對于語言引擎和開發(fā)人員來說,類型是值的內(nèi)部特征,它定義了值的行為,是所有編程語言的共有的概念,并使其區(qū)別于其他值。
拋開學(xué)術(shù)界對類型定義的分歧,為什么說JavaScript是否有類型也很重要呢?讓我們來詳細(xì)介紹一下,關(guān)于JavaScript類型這部分的知識。
首先JavaScript有七種內(nèi)置類型:
空值(Null)
未賦值(Undefined)
字符串(String)
數(shù)字(Number)
對象(Object)
布爾值(Boolean)
符號(Symbol ES6中新增)
注: 除對象以外其他統(tǒng)稱為基本類型.
下面我們用typeof查看這七種類型值,但是結(jié)果卻和它們的類型名稱不盡相同。
typeof {community:"sf"} // "Object" typeof undefined // "undefined" typeof 12 // "number" typeof "javascript" // "string" typeof true // "boolean" typeof Symbol // "symbol"
上面的這六種類型都和我typeof出來的字符串互相對應(yīng)。
咦? null 哪去了?現(xiàn)在我門來多帶帶看案它的類型.
typeof null === "object" //true
你可能會看到null并不是"null",這是JavaScript一個歷史悠久的bug,但是由于web系統(tǒng)對其的依賴,很難修復(fù),這個bug也許會一直存在雨javascript中。我們需要銘記在心,避免以后程序出現(xiàn)問題。我們再用復(fù)合條件來檢測一下null值的類型:
var a = null; (!a && typeof a === "object" ) // true
由此我們知道,null隱式強(qiáng)制類型轉(zhuǎn)換成了反值為true(說明null的布爾值為false),并對它的類型做出全等比較,最后返回true。
typeof function(){} // "function"
這樣看來,function也是JavaScript的一個內(nèi)置類型吧?可以去查閱一下ECMAScript規(guī)范,它其實(shí)是Object類型中的子類型,也就是說它屬于Object類型范疇之內(nèi),具體來說,函數(shù)是可調(diào)用對象,它有一個內(nèi)部屬性[[call]]使其可以被調(diào)用。
那么它有什么對象的特征呢?讓我們來在控制臺中打印出來看一下.
可以看到,函數(shù)當(dāng)中有一些可讀取屬性,就比如 .length屬性,代表的是其聲明的參數(shù)個數(shù),
var fun = function(a,b){} fun.length //2
查看了function,讓我們再來查看一下Array類型.
typeof [1,2,3] === "object" //true
它們都同屬于Object子類型, 數(shù)組的元素按數(shù)字順序來進(jìn)行索引(非字符串那樣通過字符串鍵值),其length屬性是其數(shù)組元素個數(shù)。
值和類型JavaScript中的類型是相對于他的值來定義的,也就是說衡量類型的永遠(yuǎn)都是值本身,與變量無關(guān),變量只是儲存值的一個容器,在這個容器中有不確定的值類型
JavaScript 不做類型強(qiáng)制,也就是說,語言引擎不要求變量總是與初始化值同類型的值。
var a = 10; typeof a // "number" a = true; typeof a //"boolean"
typeof 總會返回一個字符串
typeof typeof 10 //string
typeof 10 返回為 "number" 之后再次使用typeof "number" 結(jié)果為 ”string“
Undeclared與Undefined我們都知道undefined代表未被復(fù)制,它也是我們七大類型中的一種,如下:
var a; typeof a //"undefined" var b = 20; var c; b = c; typeof b // "undefined" typeof c // "undefined"
可能有些朋友對Undeclared有些陌生,讓我們來看一下它與Undefined的定義:
在作用域中未被聲明過的變量為 Undeclared。
作用域中聲明了且未被賦值的為Undefined。
遺憾的是我們在js環(huán)境下測試時,兩種情況卻并沒有出現(xiàn)Undeclared,這是為什么呢?
var a ; a; //undefined b; //ReferenceError : b is not defined
"b is not defined " 容易讓人誤解為與undefined的性質(zhì)一樣,其它們兩個是兩碼事此時瀏覽器如果報(bào)成 b is not found 或者 b is not declared會更加準(zhǔn)確。
雖然JS當(dāng)中沒有Undeclared的顯式概念,但是我們要知道它是存在的,Undefined 與 Undeclared 是完全兩種不同的場景;
var a ; typeof a //undefined typeof b //undefined
對于Undeclared照樣返回了undefined。這里b雖然是一個Undeclared變量,但typeof b 它并沒有報(bào)錯,這是因?yàn)閠ypeof有一套安全防范機(jī)制。
typeof Undeclared該安全機(jī)制在瀏覽器運(yùn)行時的JavaScript代碼來說是很有幫助的,因?yàn)槎鄠€腳本文件會在共享的全局命名空間中加載變量。
舉個例子 ,如果我們在布爾環(huán)境下為一個值做非空判斷。
if(DETELE){} // ReferenceError: detele is not defined
拋出了錯誤,上面已經(jīng)解釋過,此處不再強(qiáng)調(diào)它的準(zhǔn)確意義。為了避免程序出現(xiàn)這種促五,我們可以使用 typeof 來對它進(jìn)行改造。
if(typeof DETELE === "undefined"){ }
同樣屬于非空條件判斷,后者的優(yōu)勢,我想大家已經(jīng)看到了,不論何時它都不會報(bào)錯,只是淡出的返回布爾值。
可以看到 typeof 的安全防范機(jī)制為我們提供了非常便捷的方式,還有一種方式如下:
if(window.DETELE){}
如果這個變量存在于全局中,我們可以利用它,全局變量中默認(rèn)為全局屬性的特性,來通過查找對象屬性的方式去查看它,當(dāng)然這只是在全局條件下,當(dāng)非全局條件下,我們可以繼續(xù)使用typeof去判斷。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/82079.html
摘要:以和為例,說明中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。對象用來表示通用的固定長度的原始二進(jìn)制數(shù)據(jù)緩沖區(qū)。中的數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)對和有了一個大概的了解,下面讓我們來看下它是如何進(jìn)行二進(jìn)制數(shù)據(jù)操作的。 概述 本文主要通過對JavaScript中數(shù)字?jǐn)?shù)據(jù)與二進(jìn)制數(shù)據(jù)之間的轉(zhuǎn)換,讓讀者能夠了解在JavaScript中如何對數(shù)字類型(包括但不限于Number類型)進(jìn)行處理。 二進(jìn)制數(shù)據(jù)在日常...
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊?,否則只會讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識只有分享才有存在的意義。 是時候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:總結(jié)通過使用和,我們能夠在數(shù)據(jù)和二進(jìn)制數(shù)據(jù)中進(jìn)行互相轉(zhuǎn)換。下一篇系列相關(guān)的博客,將會介紹如何通過來向后端傳遞二進(jìn)制數(shù)據(jù),以及如何處理通過收到的二進(jìn)制數(shù)據(jù)。 概述 上一篇博客我們說到了如何進(jìn)行數(shù)字類型(如Short、Int、Long類型)如何在JavaScript中進(jìn)行二進(jìn)制轉(zhuǎn)換,如果感興趣的可以可以閱讀本系列第二篇博客——WebSocket系列之JavaScript中數(shù)字?jǐn)?shù)據(jù)如何轉(zhuǎn)換為...
CSS介紹 學(xué)前端必備掌握CSS樣式,css為層疊樣式表,用來定義頁面的顯示效果,加強(qiáng)用戶的體驗(yàn)樂趣,那么如何用css到html中呢? style屬性方式 利用標(biāo)簽中的style屬性來改變顯示樣式 p標(biāo)簽 在head中加入style標(biāo)簽 p { color: #FFF000;} 鏈接方式 總結(jié)CSS 選擇器名稱 { 屬性名:屬性值; ……. } 屬性與屬性之間用 分號...
摘要:的代碼采用另外一套編譯器,將代碼預(yù)先編譯成機(jī)器指令,在編譯過程或運(yùn)行過程中,一旦發(fā)現(xiàn)語法錯誤或違反類型標(biāo)記的情況出現(xiàn),便重新將代碼交予引擎解析執(zhí)行。 Asm.js簡介 早前流行的JavaScript將會統(tǒng)治世界這個梗,很好的說明了JavaScript的將來,能用JavaScript書寫的都會用JavaScript來進(jìn)行書寫,不過JavaScript的弱類型是其被黑性能的很大不一部分,而...
閱讀 2566·2021-10-11 10:58
閱讀 1063·2019-08-29 13:58
閱讀 1686·2019-08-26 13:32
閱讀 852·2019-08-26 10:40
閱讀 3288·2019-08-26 10:18
閱讀 1776·2019-08-23 14:18
閱讀 1130·2019-08-23 10:54
閱讀 458·2019-08-22 18:39