個人第一篇文章
從開始學前端直至如今已有一年的時間了,期間碰見了不少事情,也經歷了各式各樣的技術問題,爲了讓本身擺脫這些這些問題,最後養成了看書的習慣。由於每次看完總以爲本身內功又增了,哪怕只是一點。惋惜的是每次看完都會忘掉一些,尤爲是沒有本身的實踐和知識點太多時總會遺忘一些,但我不但願這種事情發生,javascript
可能只是由於這一點,之後就會找幾天的bug,這是每一個程序員都不敢預想的場景。最後我決定把我天天對知識的累積,用我理解的角度去記錄下來。筆記和文章惟一的不一樣前者是私有,後者是公開的,但願經過我對它理解能夠幫助他人,也請你們能指出文章中的問題,感激涕零。前端
ECMAScript語言中全部的值都對應一個類型。語言類型包括:Undefined,Null,Boolean,String,Number,Object。對於語言引擎和開發人員來講,類型是值的內部特徵,它定義了值的行爲,是全部編程語言的共有的概念,並使其區別於其餘值。java
拋開學術界對類型定義的分歧,爲何說JavaScript是否有類型也很重要呢?讓咱們來詳細介紹一下,關於JavaScript類型這部分的知識。程序員
首先JavaScript有七種內置類型:web
空值(Null)
編程
未賦值(Undefined)
數組
字符串(String)
瀏覽器
數字(Number)
安全
對象(Object)
編程語言
布爾值(Boolean)
符號(Symbol ES6中新增)
注: 除對象之外其餘統稱爲基本類型
.
下面咱們用typeof查看這七種類型值,可是結果卻和它們的類型名稱不盡相同。
typeof {community:"sf"} // "Object" typeof undefined // "undefined" typeof 12 // "number" typeof "javascript" // "string" typeof true // "boolean" typeof Symbol // "symbol"
上面的這六種類型都和我typeof出來的字符串互相對應。
咦? null 哪去了?如今我門來單獨看案它的類型.
typeof null === "object" //true
你可能會看到null並非"null",這是JavaScript一個歷史悠久的bug,可是因爲web系統對其的依賴,很難修復,這個bug也許會一直存在雨javascript中。咱們須要銘記在心,避免之後程序出現問題。咱們再用複合條件來檢測一下null值的類型:
var a = null; (!a && typeof a === "object" ) // true
由此咱們知道,null隱式強制類型轉換成了反值爲true(說明null的布爾值爲false),並對它的類型作出全等比較,最後返回true。
typeof function(){} // "function"
這樣看來,function也是JavaScript的一個內置類型吧?能夠去查閱一下ECMAScript規範,它實際上是Object
類型中的子類型
,也就是說它屬於Object類型範疇以內,具體來講,函數是可調用對象
,它有一個內部屬性[[call]]使其能夠被調用。
那麼它有什麼對象的特徵呢?讓咱們來在控制檯中打印出來看一下.
能夠看到,函數當中有一些可讀取屬性,就好比 .length屬性,表明的是其聲明的參數個數,
var fun = function(a,b){} fun.length //2
查看了function,讓咱們再來查看一下Array類型.
typeof [1,2,3] === "object" //true
它們都同屬於Object子類型
, 數組的元素按數字順序來進行索引(非字符串那樣經過字符串鍵值),其length
屬性是其數組元素個數。
JavaScript中的類型是相對於他的值
來定義的,也就是說衡量類型的永遠都是值自己,與變量無關,變量只是儲存值的一個容器,在這個容器中有不肯定的值類型
JavaScript 不作類型強制
,也就是說,語言引擎不要求變量老是與初始化值同類型
的值。
var a = 10; typeof a // "number" a = true; typeof a //"boolean"
typeof 總會返回一個字符串
typeof typeof 10 //string
typeof 10 返回爲 "number" 以後再次使用typeof "number" 結果爲 」string「
咱們都知道undefined表明未被複制
,它也是咱們七大類型中的一種,以下:
var a; typeof a //"undefined" var b = 20; var c; b = c; typeof b // "undefined" typeof c // "undefined"
可能有些朋友對Undeclared有些陌生,讓咱們來看一下它與Undefined的定義:在做用域中未被聲明過
的變量爲 Undeclared。
做用域中聲明瞭且未被賦值的爲Undefined
。
遺憾的是咱們在js環境下測試時,兩種狀況卻並無出現Undeclared,這是爲何呢?
var a ; a; //undefined b; //ReferenceError : b is not defined
"b is not defined " 容易讓人誤解爲與undefined的性質同樣,其它們兩個是兩碼事
此時瀏覽器若是報成 b is not found
或者 b is not declared
會更加準確。
雖然JS當中沒有Undeclared的顯式概念
,可是咱們要知道它是存在的,Undefined 與 Undeclared 是徹底兩種不一樣的場景
;
var a ; typeof a //undefined typeof b //undefined
對於Undeclared照樣返回了undefined。這裏b雖然是一個Undeclared變量,但typeof b 它並無報錯,這是由於typeof有一套安全防範機制。
該安全機制在瀏覽器運行時的JavaScript代碼來講是頗有幫助的,由於多個腳本文件會在共享的全局命名空間中加載變量。
舉個例子 ,若是咱們在布爾環境下爲一個值作非空判斷。
if(DETELE){} // ReferenceError: detele is not defined
拋出了錯誤,上面已經解釋過,此處再也不強調它的準確意義。爲了不程序出現這種促五,咱們可使用 typeof 來對它進行改造。
if(typeof DETELE === "undefined"){ }
一樣屬於非空條件判斷,後者的優點,我想你們已經看到了,不論什麼時候它都不會報錯,只是淡出的返回布爾值
。
能夠看到 typeof 的安全防範機制爲咱們提供了很是便捷的方式,還有一種方式以下:
if(window.DETELE){}
若是這個變量存在於全局中,咱們能夠利用它,全局變量中默認爲全局屬性的特性,來經過查找對象屬性的方式去查看它,固然這只是在全局條件下,當非全局條件下,咱們能夠繼續使用typeof去判斷。