💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 一、概述 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 ~~~