---
# System prepended metadata

title: 你所不知道的 JS 讀書筆記-01-入門-值與型別
tags: [你所不知道的JS, javascript]

---

# 你所不知道的 JS 讀書筆記-01-入門-值與型別
p.33 ~ p.43
![封面](https://i.imgur.com/XgGEzWR.jpg)
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`