# 你所不知道的 JS 讀書筆記-01-入門-值與型別 p.33 ~ p.43  Javascript 只有**值有型別;變數沒有**,只是個容器。可用 `typeof` 檢視該變數的值是什麼型別。 * `string` * `number` * `boolean` * `null` 與 `undefined` * `object` * `symbol`(ES6) `typeof null` 型別應為 `null` 不是 `object`,但這個 BUG 已經不容許修正。 ## 物件 object(物件)為複合值,可以設定一些帶有值的特性(properties)。 ```javascript var object = { property1: value1, property2: value2 }; ``` 存取的值可以用點記號法`obj.property1`或方括號記號法`obj["property1"]`存取,如果特性名含有特殊字元,僅能使用方括號記號法。 陣列與函式是特化的`object`子型別。 ### 陣列 不以具名的特性儲存值,取而代之的是**索引**位置。 ```javascript var array = [ value1, value2]; array[0]; // value1; array[1]; // value2; /* Javascript 從 0 開始計數 */ ``` ### 函式 可以擁有特性,但很少使用。 ## 內建方法 ```javascript var a = "hello world"; a.toUpperCase(); // "HELLO WORLD" ``` Javascript 把值當作一個物件,在幕後**封裝**(boxes)進對應的**物件包裹器**(例如`string`值被 String 的物件包裹器所包裹,`number`被 Number 包裹,`boolean`亦然),而物件包裹器在原型(prototype)上定義了內建方法以供使用,例如`toUpperCase()`。 ## 比較值 兩個值進行互相比較的結果,依據相等性與不等性,會是一個 boolean 值(true 或 false) ### 強制轉型 分為**明確的**強制轉型與**隱含的**強制轉型。 明確的強制轉型: ```javascript var a = "42"; var b = Number(a); // 明確地告訴程式將 b 從 a 得來的字串改為數字 ``` 隱含的強制轉型: ```javascript var a = "42"; var b = a * 1; // 偷偷地將 b 從 a 得來的字串改為數字再進行四則運算 ``` ### Truthy & Falsy 不是 boolean 值卻被強制轉型成 boolean 值,依據原值判斷 truthy 或 falsy 來決定 boolean 值為 true 還是 false。 只有這些值為 falsy 值,會被強制轉型成 false * ``""`` (空字串) * `0` 、 `-0` 、 `NaN` (Not a Number) * `null` 、 `undefined` * `false` 其他值的都是 truthy。 ### 相等性 `==`、`!=`寬鬆相等性:檢查值的相等性,允許強制轉型。 `===`、`!==`嚴格相等性:檢查值的相等性,不允許強制轉型。 ```javascript var a = "42"; var b = 42; a == b; // true a === b; // false ``` 在`a == b;`中,`"42"`會被強制轉型成`42`。 ```javascript var a = [1,2,3]; var b = [1,2,3]; var c = "1,2,3"; a == c; // true b == c; // true a == b; // false ``` 物件、陣列、函式與字串的相較會強制轉型成字串。但同樣**非基型值**(non-primitive values)的物件、陣列、函式的相較,不會像基型值判斷值(by value)是否相等,只會依據**參考**(by reference)是否相等,沒辦法判斷底層的參考的內容是否相同。故`a == b;`為`false`。 ### 不等性 `<`、`>`、`<=`、`>=`是不等性比較運算子。除了數字外,string 值也能以字母順序比較不等性。例如`"bar" < "foo"`,嚴格度類似`==`的寬鬆條件,且不存在嚴格不等性。 ```javascript var a = 41; var b = "42"; var c = "43"; a < b; // true b < c; // true ``` 字串會被強制轉型成數字,但如果沒有適用的數字,會被強制轉型成`NaN`,`NaN`不大於也不小於任何其他的值,任何與其他值的比較都是 `false`。 ###### tags: `javascript` `你所不知道的JS`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up