1. 程式人生 > >你不知道的JavaScript(中)讀書筆記(一)

你不知道的JavaScript(中)讀書筆記(一)

第一章

1、內建型別

JavaScript有七種內建型別【除了物件以外,其他統稱為“基本型別”】:

  • 空值(null)
  • 未定義(undefined)
  • 布林值(boolean)
  • 數字(number)
  • 字元竄(string)
  • 物件(object)
  • 符號(symbol,ES6新增的)

如何檢查值得型別:typeof運算子,但是不能檢測到null,typeof檢測null會顯示“object”,需要用符合條件來檢測null值得型別

1 var a = null;
2 (!a && typeof a === "object"); // true

2、JavaScript中的變數是沒有型別的,只有值才有

3、 undefined 和 undeclared

undefined:在作用域中宣告但是還沒有賦值的變數

undeclared:還沒有在作用域中宣告過的變數

第二章 值(陣列,字串,數字)

1、陣列 (length、indexOf()、concat())

  陣列可以容納任何型別的值,例如:字串、數字、物件甚至其他陣列(例如多維陣列)

2、字串(length、indexOf()、concat())【字串翻轉問題】

3、數字(包括“整數”和帶小數的十進位制數)

(1)小數點   由於數字值可以使用 Number 物件進行封裝(參見第 3 章),因此數字值可以呼叫 Number.prototype 中的方法(參見第 3 章)。例如, tofixed(..) 方法可指定小數部分的顯示位數:

 1 var a = 42.59;
 2 a.toFixed( 0 ); // "43"
 3 a.toFixed( 1 ); // "42.6"
 4 a.toFixed( 2 ); // "42.59"
 5 a.toFixed( 3 ); // "42.590"
 6 //toPrecision(..) 方法用來指定有效數位的顯示位數:
 7 a.toPrecision( 1 ); // "4e+1"
 8 a.toPrecision( 2 ); // "43"
 9 a.toPrecision( 3 ); // "42.6"
10 a.toPrecision( 4 ); // "42.59"
11 a.toPrecision( 5 ); //
"42.590"

(2)浮點數    浮點數無法做到十分精確,所以如果要判斷 0.1 + 0.2 和 0.3 是否相等,可以使用 Number.EPSILON (相當於設定一個誤差範圍,無限接近於0)

function numbersCloseEnoughToEqual(n1,n2) {
return Math.abs( n1 - n2 ) < Number.EPSILON;
}
var a = 0.1 + 0.2;
var b = 0.3;
numbersCloseEnoughToEqual( a, b ); // true
numbersCloseEnoughToEqual( 0.0000001, 0.0000002 ); // false

 (3) 檢測整數   檢測一個值是否是整數,可以使用 ES6 中的 Number.isInteger(..) 方法:

Number.isInteger( 42 ); // true
Number.isInteger( 42.000 ); // true
Number.isInteger( 42.3 ); // false

 (4)檢測一個值是否為安全的整數,可以使用 ES6 中的 Number.isSafeInteger(..) 方法:

Number.isSafeInteger( Number.MAX_SAFE_INTEGER ); // true
Number.isSafeInteger( Math.pow( 2, 53 ) ); // false
Number.isSafeInteger( Math.pow( 2, 53 ) - 1 ); // true

4、null指空值(或者指曾賦過值)   null是一個特殊關鍵字,不是標誌符,不能將其當做變數來使用和賦值

5、undefined 指沒有值(從未賦值)  undefined是一個標誌符,可以當做變數來使用賦值

6、NaN 可以理解為“無效數值” “ 失敗數值”或者“壞數值”,用於支出數字型別中的錯誤情況,即“執行數學運算沒有成功,這是失敗後返回的結果”,NaN和自身不相等,但是可以用 Number.isNaN(..)來判斷

 

if (!Number.isNaN) {
Number.isNaN = function(n) {
return n !== n;
};
}

 

7、Object.is(..) 來判斷兩個值是否絕對相等,但是能使用==或者===就是用這兩個,效率更高

 

8、值和引用

簡單值(null、undefined、字串、數字、布林值和ES6中的symbol),總是通過值的複製方式來賦值/傳遞

複合值(陣列和封裝物件、函式)總是通過引用複製方式來賦值/傳遞

例如:

var a = 2;
var b = a; // b是a的值的一個副本
b++;
a; // 2
b; // 3
var c = [1,2,3];
var d = c; // d是[1,2,3]的一個引用
d.push( 4 );
c; // [1,2,3,4]
d; // [1,2,3,4]

 考點

 1 function foo(x) {
 2 x.push( 4 );
 3 x; // [1,2,3,4]
 4 // 然後
 5 x = [4,5,6];
 6 x.push( 7 );
 7 x; // [4,5,6,7]
 8 }
 9 var a = [1,2,3];
10 foo( a );
11 a; // 是[1,2,3,4],不是[4,5,6,7]
vfunction foo(x) {
x.push( 4 );
x; // [1,2,3,4]
// 然後
x.length = 0; // 清空陣列
x.push( 4, 5, 6, 7 );
x; // [4,5,6,7]
}
var a = [1,2,3];
foo( a );
a; // 是[4,5,6,7],不是[1,2,3,4]

x.length = 0 和 x.push(4,5,6,7) 並沒有建立一個新的陣列,而是更改了當前的陣列。於是 a 指向的值變成了 [4,5,6,7] 。