1. 程式人生 > >JavaScript資料型別(細數)

JavaScript資料型別(細數)

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 語言入門教程》
你以為本文就這麼結束了 ? 精彩在後面 !!!