JavaScript類型介紹

個人第一篇文章

從開始學前端直至如今已有一年的時間了,期間碰見了不少事情,也經歷了各式各樣的技術問題,爲了讓本身擺脫這些這些問題,最後養成了看書的習慣。由於每次看完總以爲本身內功又增了,哪怕只是一點。惋惜的是每次看完都會忘掉一些,尤爲是沒有本身的實踐和知識點太多時總會遺忘一些,但我不但願這種事情發生,javascript

可能只是由於這一點,之後就會找幾天的bug,這是每一個程序員都不敢預想的場景。最後我決定把我天天對知識的累積,用我理解的角度去記錄下來。筆記和文章惟一的不一樣前者是私有,後者是公開的,但願經過我對它理解能夠幫助他人,也請你們能指出文章中的問題,感激涕零。前端

  1. 類型

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「


Undeclared與Undefined

咱們都知道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有一套安全防範機制。


typeof Undeclared

該安全機制在瀏覽器運行時的JavaScript代碼來講是頗有幫助的,由於多個腳本文件會在共享的全局命名空間中加載變量。

舉個例子 ,若是咱們在布爾環境下爲一個值作非空判斷。

if(DETELE){}  // ReferenceError: detele is not defined

拋出了錯誤,上面已經解釋過,此處再也不強調它的準確意義。爲了不程序出現這種促五,咱們可使用 typeof 來對它進行改造。

if(typeof DETELE === "undefined"){  }

一樣屬於非空條件判斷,後者的優點,我想你們已經看到了,不論什麼時候它都不會報錯,只是淡出的返回布爾值

能夠看到 typeof 的安全防範機制爲咱們提供了很是便捷的方式,還有一種方式以下:

if(window.DETELE){}

若是這個變量存在於全局中,咱們能夠利用它,全局變量中默認爲全局屬性的特性,來經過查找對象屬性的方式去查看它,固然這只是在全局條件下,當非全局條件下,咱們能夠繼續使用typeof去判斷。

相關文章
相關標籤/搜索