JavaScript資料型別(細數)
阿新 • • 發佈:2018-11-11
JavaScript資料型別
前言 只有深入學精一門語言,學其他語言才能更好地舉一反三,觸類旁聽。 從接觸前端開發到現在已經將近 2 年了,最近又看了阮一鋒寫的: 《JavaScript 語言入門教程》 一書,重溫 JavaScript 。 小汪將工作和麵試遇到過的,沒多少人知道的 JavaScript 技巧,卻十分實用的技巧都總結在這裡面,分享給大家 。 溫故而知新,我們對技術應該有的態度是: Stay hungry ! Stay young ! 1. 標籤(label) JavaScript 語言允許,語句的前面有標籤(label),相當於定位符,用於跳轉到程式的任意位置,標籤的格式如下。 label: 語句 標籤可以是任意的識別符號,但不能是保留字,語句部分可以是任意語句。 標籤通常與 break 語句和 continue 語句配合使用,跳出特定的迴圈。 top: for (var i = 0; i < 3; i++){ for (var j = 0; j < 3; j++){ if (i === 1 && j === 1) break top; console.log(‘i=’ + i + ‘, j=’ + j); } } // i=0, j=0 // i=0, j=1 // i=0, j=2 // i=1, j=0 上面程式碼為一個雙重迴圈區塊,break 命令後面加上了 top 標籤(注意,top 不用加引號),滿足條件時,直接跳出雙層迴圈。如果 break 語句後面不使用標籤,則只能跳出內層迴圈,進入下一次的外層迴圈。 標籤也可以用於跳出程式碼塊。 foo: { console.log(1); break foo; // 注意要加 break 才能退出 console.log(‘本行不會輸出’); } console.log(2); // 1 // 2 上面程式碼執行到 break foo,就會跳出區塊。 continue 語句也可以與標籤配合使用。 top: for (var i = 0; i < 3; i++){ for (var j = 0; j < 3; j++){ if (i === 1 && j === 1) continue top; console.log(‘i=’ + i + ‘, j=’ + j); } } // i=0, j=0 // i=0, j=1 // i=0, j=2 // i=1, j=0 // i=2, j=0 // i=2, j=1 // i=2, j=2 上面程式碼中,continue 命令後面有一個標籤名,滿足條件時,會跳過當前迴圈,直接進入下一輪 外層迴圈。 如果 continue 語句後面不使用標籤,則只能進入下一輪的 內層迴圈。 小汪經過實踐得出以下用途。 用途: 可以跳出迴圈。 對於多層迴圈也同樣適用。 特別是兩層或者多層迴圈,只是為了找到想要的某個值時,而迴圈的資料是大量的,用標籤就非常高效。 2. 區分陣列和物件 先來道面試題: console.log(typeof window) console.log(typeof {}) console.log(typeof []) console.log(typeof null) 答案: “object” “object” “object” “object” 上面程式碼中,null 返回 object 。這是由於歷史原因造成的,且一切原型鏈的終點都是 null。空陣列( [] )的型別也是 object,這表示在 JavaScript 內部,陣列本質上只是一種特殊的物件。而 instanceof 運算子可以區分陣列和物件。 var o = {}; var a = []; o instanceof Array // false a instanceof Array // true 3. null, undefined 和布林值 經常會有面試官問:null 與 undefined 的區別 ? 區別: null 是一個表示“空”的物件,轉為數值時為 0 。 undefined 是一個表示”此處無定義”的原始值,轉為數值時為 NaN。 Number(null) // 0 5 + null // 5 Number(undefined) // NaN 5 + undefined // NaN 3.1 用法和含義 對於 null 和 undefined,大致可以像下面這樣理解。 null 表示空值,即該處的值現在為空。呼叫函式時,某個引數未設定任何值,這時就可以傳入 null,表示該引數為空。比如,某個函式接受引擎丟擲的錯誤作為引數,如果執行過程中未出錯,那麼這個引數就會傳入 null ,表示未發生錯誤。 undefined 表示“未定義”,下面是返回 undefined 的典型場景。 // 變數聲明瞭,但沒有賦值 var i; i // undefined // 呼叫函式時,應該提供的引數沒有提供,該引數等於 undefined function f(x) { return x; } f() // undefined // 物件沒有賦值的屬性 var o = new Object(); o.p // undefined // 函式沒有返回值時,預設返回 undefined function f() {} f() // undefined 注意,布林值轉換的時候,空陣列([])和空物件({})對應的布林值,都是true。 if ([]) { console.log(‘true’); } // true if ({}) { console.log(‘true’); } // true 4. 數值 JavaScript 內部,所有數字都是以 64 位浮點數形式儲存,即使整數也是如此。所以,1 與 1.0 是相同的,是同一個數。 1 === 1.0 // true JavaScript 語言的底層根本沒有整數,所有數字都是小數( 64 位浮點數)。容易造成混淆的是,某些運算只有整數才能完成,此時 JavaScript 會自動把 64 位浮點數,轉成 32 位整數,然後再進行運算。 由於浮點數不是精確的值,所以涉及小數的比較和運算要特別小心。 例如: 0.1 + 0.2 === 0.3 // false 0.3 / 0.1 // 2.9999999999999996 (0.3 – 0.2) === (0.2 – 0.1) // false 2.22 + 2.21 // 4.43 3.45 + 1.11 // 4.5600000000000005 2.22 + 2.24 // 4.460000000000001 但是商品計算金額的時候,金額的結果一般都是保留兩倍小數點的,那怎麼辦呢? 可以用 toFixed 解決: var a = 2.22 + 2.24 // 4.460000000000001 var result = (a).toFixed(2) // 4.46 5. Object 屬性的遍歷 for…in 迴圈用來遍歷一個物件的全部屬性(包括可遍歷的繼承的屬性)。但是,一般情況下,都是隻想遍歷物件自身的屬性,所以使用 for…in 的時候,應該結合使用 hasOwnProperty 方法,在迴圈內部判斷一下,某個屬性是否為物件自身的屬性。 var person = { name: ‘老張’ }; for (var key in person) { if (person.hasOwnProperty(key)) { console.log(key); } } // name 最後 重大事件:2017年11月,所有主流瀏覽器全部支援 WebAssembly,這意味著任何語言都可以編譯成 JavaScript,在瀏覽器執行。 前端還是很有未來的 !!! 下節內容:細數 JavaScript 實用黑科技(二) 。 如果你覺得該文章對你有幫助,歡迎到我的 github star 一下,謝謝。 github 地址 參考教程: 《JavaScript 語言入門教程》 你以為本文就這麼結束了 ? 精彩在後面 !!!