Javascript權威指南之類型、變量和表達式

整型直接量

在ES6的嚴格模式下,八進制是被嚴格禁止的。
在之前的版本雖然不支持,但是javascript的某些實現使得可以使用八進制數作爲整型數。

算術運算

Number.POSITIVE_INFINITY === Infinity;  //tue
Number.NEGATIVE_INFINITY === -Infinity;  //tue
isFinite()Infinity-InfinityNaN的時候返回true
isNaN()NaN、非數字類型值的時候返回true

ES6 
Number.isNaN()只在NaN的情況返回true

二進制浮點數和四捨五入

由於二進制無法精確表示0.1等小數,在舍入誤差的情況下,或出現不相相等。

0.3 - 0.2 === 0.2 - 0.1; //false

字符串直接量

在ES3,字符串必須寫在一行;在ES5中,字符串可以拆分成多行寫,每行必須以(\)結尾;如果想另起一行,可以使用(\n)進行換行;

"xiao \
ming"

//字符串多行寫法
"xiao \n ming"  
`xiao
ming`

轉義字符

'xiaoming: I\'m'

字符串的使用

字符串屬於基本類型值,是固定不變,所有字符串的方法都是返回一個新的字符串,原字符串本身並沒有改變。

布爾值

falsy假值,以下在轉換爲布爾值,會轉成false

undefined
null
NaN
0
-0
""        //空字符串

null和undefined

undefined表示系統級的、出乎意料的或類似錯誤的值得空缺;
null表示程序級的、正常的或在意料之中的值得空缺。

typeof null === 'object';
//typeof 操作符檢測 null 的類型標籤位時發現是 000
//000: object - 當前存儲的數據指向一個對象

全局對象

//瀏覽器 window
//node環境  global

包裝對象

字符串,數字,布爾值等基本類型值和對象一樣,擁有方法和屬性
null和undefined沒有包裝對象,訪問他們的屬性將會報錯

let str = 'abcde';
str.substring();

//其實會通過new String(str)轉換成對象,進而繼承原型上的方法和屬性
//一旦對方法或者屬性的引用結束,這個包裝對象就會馬上銷燬(大致可以理解成這個一個過程)

包裝對象的屬性是隻讀的,不能給其賦值

let s = "test";
s.len = 4;
console.log(s.len);  //undefined  臨時對象在引用完就被銷燬了

不可變的原始值和可變的對象引用

字符串雖然可以向數組通過下標獲取值,但是給其賦值是無法,基本類型值是不可改變。數字和布爾值就顯而易見了。

原始值的複製被拷貝出一個副本,但是對象的複製都是指向同一個基對象。(原始值得比較是比較值本身,而對象的比較是其引用地址)

類型轉換

幾個可能需要注意的轉換:

undefined => "undefined"(字符串) => NaN(數字)
null => "null"(字符串) => 0(數字)
[]=> ""(字符串) => 0(數字)
['a']=> "a"(字符串) => NaN(數字)

"=="運算符從不試圖將其操作數轉換爲布爾值;
原始值到對象的轉換調用各自的構造函數,生成對應的包裝對象;

顯式類型轉換

調用Number()、Boolean()、String()、Object()進行轉換

隱式類型轉換

1.如果“+”運算符的一個操作數是字符串,則將另外一個操作數轉換爲字符串;
2.一元“+”運算符則是將操作數轉換爲數字
3."!"操作符則是將操作數轉換爲布爾值並取反

Number.toString(n);  //n代表轉換的進制數
對象轉換爲原始值

以下的轉換規則僅僅適用於本地對象(也就是自己定義的對象)
1.所有對象轉換布爾值都爲true
2.轉換爲數字,則是將先調用valueOf(),t如果不存在,則調用toString(),最後再轉化爲數字,否則,則拋出一個類型異常錯誤。
3.轉換爲字符串,則是將先調用toString(),如果不存在,則調用valueOf(),最後再轉化爲字符串,否則,則拋出一個類型異常錯誤。

變量作用域

var定義的變量會進行變量提升,在賦值之前訪問該變量的話,會返回undefined;
let定義的變量不會進行變量提升,在定義賦值之前訪問該變量的話,會拋出引用類型錯誤;

作用域鏈

作用域鏈是一個對象列表或者鏈表,這組對象定義了這段代碼“作用域中”的變量。
在JavaScript在最頂層的代碼中(也就是不包含任何函數定義內的代碼),作用域鏈是由一個全局對象組成。
在不包含嵌套的函數體內,作用域鏈對象有兩層。第一層是定義函數參數和局部變量的對象,第二層是全局對象。
在包含嵌套的函數體內,作用域鏈有三層。

eval

eval的字符串在執行時的上下文環境和調用函數的上下文環境是一致的。
eval在直接調用時,它總是在的上下文作用域內執行。間接調用(通過別名調用)時,它在全局作用域下執行,並且無法讀寫、定義局部變量和函數。
在嚴格模式下,eval執行的代碼段可以查詢和更改局部變量,但不能再局部作用域定義新的變量或者函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章