## 一、概述
JavaScript 是一種動態類型語言,變量沒有類型限制,可以隨時賦予任意值。
~~~
var x = y ? 1 : 'a';
~~~
上面代碼中,變量`x`到底是數值還是字符串,取決于另一個變量`y`的值。`y`為`true`時,`x`是一個數值;`y`為`false`時,`x`是一個字符串。這意味著,`x`的類型沒法在編譯階段就知道,必須等到運行時才能知道。
雖然變量的數據類型是不確定的,但是各種運算符對數據類型是有要求的。如果運算符發現,運算子的類型與預期不符,就會自動轉換類型。比如,減法運算符預期左右兩側的運算子應該是數值,如果不是,就會自動將它們轉為數值。
~~~
'4' - '3' // 1
~~~
## 二、強制轉換
強制轉換主要指使用`Number()`、`String()`和`Boolean()`三個函數,手動將各種類型的值,分別轉換成數字、字符串或者布爾值。
### 2.1 Number()
使用`Number`函數,可以將任意類型的值轉化成數值。
* 原始類型值的轉換規則如下
~~~
// 數值:轉換后還是原來的值
Number(324) // 324
// 字符串:如果可以被解析為數值,則轉換為相應的數值
Number('324') // 324
// 字符串:如果不可以被解析為數值,返回 NaN
Number('324abc') // NaN
// 空字符串轉為0
Number('') // 0
// 布爾值:true 轉成 1,false 轉成 0
Number(true) // 1
Number(false) // 0
// undefined:轉成 NaN
Number(undefined) // NaN
// null:轉成0
Number(null) // 0
~~~
* `Number`方法的參數是對象時,將返回`NaN`,除非是包含單個數值的數組。
~~~
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5
~~~
### 2.2 String()
`String`函數可以將任意類型的值轉化成字符串,轉換規則如下。
1. 原始類型值
**數值**:轉為相應的字符串。
**字符串**:轉換后還是原來的值。
**布爾值**:`true`轉為字符串`"true"`,`false`轉為字符串`"false"`。
**undefined**:轉為字符串`"undefined"`。
**null**:轉為字符串`"null"`。
2. 對象
`String`方法的參數如果是對象,返回一個類型字符串;如果是數組,返回該數組的字符串形式。
~~~
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
~~~
### 2.3 Boolean()
`Boolean()`函數可以將任意類型的值轉為布爾值。它的轉換規則相對簡單:除了以下五個值的轉換結果為`false`,其他的值全部為`true`。
* `undefined`
* `null`
* `0`(包含`-0`和`+0`)
* `NaN`
* `''`(空字符串)
~~~
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false
~~~
## 三、自動轉換
遇到以下三種情況時,JavaScript 會自動轉換數據類型,即轉換是自動完成的,用戶不可見。
* 第一種情況,不同類型的數據互相運算。
~~~
123 + 'abc' // "123abc"
~~~
* 第二種情況,對非布爾值類型的數據求布爾值。
~~~
if ('abc') {
console.log('hello')
} // "hello"
~~~
* 第三種情況,對非數值類型的值使用一元運算符(即`+`和`-`)。
~~~
+ {foo: 'bar'} // NaN
- [1, 2, 3] // NaN
~~~
自動轉換的規則是這樣的:預期什么類型的值,就調用該類型的轉換函數。比如,某個位置預期為字符串,就調用`String`函數進行轉換。如果該位置即可以是字符串,也可能是數值,那么默認轉為數值。
### 3.1自動轉換為布爾值
除了以下五個值,其他都是自動轉為`true`。
* `undefined`
* `null`
* `+0`或`-0`
* `NaN`
* `''`(空字符串)
~~~
if (!undefined && !null && !0 && !NaN && !'') {
console.log('true');
} // true
~~~
### 3.2 自動轉換為字符串
JavaScript 遇到預期為字符串的地方,就會將非字符串的值自動轉為字符串。具體規則是,先將復合類型的值轉為原始類型的值,再將原始類型的值轉為字符串。
~~~
'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
~~~
### 3.3 自動轉換為數值
JavaScript 遇到預期為數值的地方,就會將參數值自動轉換為數值。系統內部會自動調用`Number`函數。
~~~
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
false - 1 // -1
'1' - 1 // 0
'5' * [] // 0
false / '5' // 0
'abc' - 1 ? // NaN
null + 1 // 1
undefined + 1 // NaN
~~~
- 階段一 Java 零基礎入門
- 步驟1:基礎語法
- 第01課 初識
- 第02課 常量與變量
- 第03課 運算符
- 第04課 選擇結構
- 第05課 循環結構
- 第06課 一維數組
- 第08課 方法
- 第09課 數組移位與統計
- 第10課 基礎語法測試
- 第09課 基礎語法測試(含答案)
- 步驟2:面向對象
- 第01課 類和對象
- 第02課 封裝
- 第03課 學生信息管理
- 第04課 繼承
- 第05課 單例模式
- 第06課 多態
- 第07課 抽象類
- 第08課 接口
- 第09課 內部類
- 第10課 面向對象測試
- 第10課 面向對象測試(含答案)
- 步驟3:常用工具類
- 第01課 異常
- 第02課 包裝類
- 第03課 字符串
- 第04課 集合
- 第05課 集合排序
- 第06課 泛型
- 第07課 多線程
- 第08課 輸入輸出流
- 第09課 案例:播放器
- 第10課 常用工具測試(一)
- 第10課 常用工具測試(一)(答案)
- 第10課 常用工具測試(二)
- 第10課 常用工具測試(二)(答案)
- 階段二 從網頁搭建入門 JavaWeb
- 步驟1:HTML 與 CSS
- 第01課 HTML 入門
- 第01課 HTML 入門(作業)
- 第02課 CSS 入門
- 第02課 CSS 入門(作業)
- 第03課 CSS 布局
- 第03課 CSS 布局(作業)
- 步驟2:JavaScript 與前端案例
- 第01課 JavaScript 入門
- 第01課 JavaScript 入門(作業)
- 第02課 仿計算器
- 第03課 前端油畫商城案例
- 第04課 輪播圖
- 第05課 網頁搭建測試
- 第05課 網頁搭建測試(含答案)
- 步驟3:JavaScript 教程
- 入門
- 概述
- 基本語法
- 數據類型
- 概述
- 數值
- 字符串
- undefined, null 和布爾值
- 對象
- 函數
- 數組
- 運算符
- 算術運算符
- 比較運算符
- 布爾運算符
- 位運算符
- 運算順序
- 語法專題
- 數據類型的轉換
- 錯誤處理機制
- 標準庫
- String
- Date
- Math
- DOM
- 概述
- Document 節點
- 事件
- EventTarget 接口
- 事件模型
- 常見事件
- 階段三 數據庫開發與實戰
- 步驟1:初始數據庫操作
- 第01課 數據類型
- 第02課 表的管理
- 第03課 數據管理
- 第04課 常用函數
- 第05課 JDBC 入門
- 第06課 Java 反射
- 第07課 油畫商城
- 第08課 數據庫基礎測試
- 步驟2:MyBatis 從入門到進階
- 第01課 IntelliJ IDEA 開發工具入門
- 第02課 Maven 入門
- 第03課 工廠模式
- 第04課 MyBatis 入門
- 第05課 MyBatis 進階
- 第06課 商品信息管理
- 第07課 MyBatis 基礎測試
- 步驟3:Redis 數據庫與 Linux 下項目部署
- 第01課 Linux 基礎
- 第02課 Linux 下 JDK 環境搭建及項目部署
- 第03課 Redis 入門
- 階段四 SSM 到 Spring Boot 入門與綜合實戰
- 步驟1:Spring 從入門到進階
- 第01課 Spring 入門
- 第02課 Spring Bean 管理
- 第03課 Spring AOP
- 第04課 基于 AspectJ 的 AOP 開發
- 第05課 JDBC Template
- 第06課 Spring 事務管理
- 第07課 人員管理系統開發
- 第08課 Spring 從入門到進階測試
- 步驟2:Spring MVC 入門與 SSM 整合開發
- 第01課 Spring MVC 入門與數據綁定
- 第02課 Restful 風格的應用
- 第03課 SpringMVC 攔截器
- 第04課 辦公系統核心模塊
- 步驟3:Spring Boot 實戰
- 第01課 Spring Boot 入門
- 第02課 校園商鋪項目準備
- 第03課 校園商鋪店鋪管理
- 第04課 校園商鋪商品管理及前臺展示
- 第05課 校園商鋪框架大換血
- 步驟4:Java 面試
- 第01課 面試準備
- 第02課 基礎面試技巧
- 第03課 Web基礎與數據處理
- 第04課 主流框架