你不知道的JavaScript(一)

charliemei發表於2018-03-12

從名字上看可能會覺得JS應該和Java是有很緊密的聯絡的吧,實際上它們是兩種完全不同的語言,JS是ECMAScript的瀏覽器規範,是一種弱型別的語言,不同於Java這種強型別語言。JS簡單易用,可是它的語言機制又是十分複雜的,我們通常對它是一知半解,深入理解其執行機制和原理,才能得心應手,避免各種令人抓狂問題,例如回撥地獄等。

第一章 型別

JS有七大型別,string,number,boolean,object,null,undefine,symbol(es6新增),除了object,其他都是基本型別,可以用typeof運算子檢視其對應型別。除了typeof null === “object”//true,以外,其他六種型別都有同名的字串值一一對應,我們常用的陣列和函式,他們的typeof分別是”object”和”function”,他們都有length屬性,陣列的length屬性是元素的個數,而函式的length屬性則是引數的個數。最容易混淆的是undefined和undecleare的情況,前者是已經定義了的但沒賦值的變數,而後者則是從沒定義過的變數,雖然在typeof中都返回undefined,但是這個區別還是值得注意。

第二章 值

JS的陣列不需要預設陣列大小,可以直接向陣列新增任何型別的值,如果形成了稀疏陣列,那麼未賦值的部分將會是undefined。與陣列有關的方法有push,pop,shift,unshift,sort,reverse,every,some,filter,forEach,map,concat,slice,splice等。某些不是陣列的物件,如果其有length屬性,就是類陣列,例如DOM元素列表,arguments,通常用[].slice.call()這個將其轉化為陣列,而es6為我們提供了一種新途徑——Array.from()。字串也是類陣列,有length屬性,也有indexof和concat等方法,和陣列很相似,在JS中字串是不可變的,而陣列是可變的,不過我們可以借用陣列的非變更方法來處理字串。

JS中只有一種數值型別——number,使用64位二進位制的雙精度格式,數字最前面的0和小數點中最後的0是可以省略的,特別大或者特別小的數字用指數形式表示,常用的方法有tofixed(X)——將數字保留X位小數,不足用0補齊,toPresicion(X)——保留X位有效數字。二進位制浮點數最大的問題就是0.1和0.2並不是十分精確,因此有0.1+0.2==0.3//false,最常見的判斷小數相等的做法是設定一個誤差範圍值(機器精度),對JS來說是2^-52,最大安全整數是2^53-1,我們可以用a|0來將變數a中的數值轉換為32位有符號整數。數字型別中有幾個特殊的值我們需要注意,NaN——不是一個數字,可以理解為無效值,它和本身不相等,即NaN===NaN//false,無窮數——+Infinity和-Infinity,計算結果溢位時出現。

簡單的基本型別通過值複製來賦值或者傳遞,而複合值(物件等)則會通過引用複製來複制或傳遞,值複製相當於是處理原值的一個副本,而引用複製相當於是將原值的地址傳給了新的引用。

相關文章