JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值;

强制转换(显式转换)

Number()

使用 Number 函数,可以将任意类型的值转化成数值;

原始类型值

  1. 原始类型值的转换规则如下:

    // 数值:转换后还是原来的值
    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
    
  2. Number 函数将字符串转为数值,要比 parseInt 函数严格很多,只要有一个字符无法转成数值,整个字符串就会被转为 NaNparseInt 逐个解析字符,而 Number 函数整体转换字符串的类型

    parseInt('42 cats') // 42
    Number('42 cats') // NaN
    

对象

  1. 对象的转换规则如下:

    Number({a: 1}) // NaN
    Number([1, 2, 3]) // NaN
    Number([5, 6]) // NaN
    Number([5]) // 5
    
  2. 包含单个数值的数组转换为数字,之所以会这样,是因为 Number 背后的转换规则比较复杂:

    • 第一步,调用对象自身的 valueOf 方法,如果返回原始类型的值,则直接对该值使用 Number 函数,不再进行后续步骤;
    • 第二步,如果 valueOf 方法返回的还是对象,则改为调用对象自身的 toString 方法,如果 toString 方法返回原始类型的值,则对该值使用 Number 函数,不再进行后续步骤;
    • 第三步,如果 toString 方法返回的是对象,就报错;
    var obj = {
      valueOf: function () {
        return {};
      },
      toString: function () {
        return {};
      }
    };
    
    Number(obj)
    // TypeError: Cannot convert object to primitive value
    

String()

String 函数可以将任意类型的值转化成字符串;

原始类型值

String(123) // "123"
String('abc') // "abc"
String(true) // "true"
String(undefined) // "undefined"
String(null) // "null"

对象

  1. String 方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式;

    String({a: 1}) // "[object Object]"
    String([1, 2, 3]) // "1,2,3"
    
  2. String 方法背后的转换规则,与 Number 方法基本相同,只是互换了 valueOf 方法和 toString 方法的执行顺序;

    • 第一步:先调用对象自身的 toString 方法,如果返回原始类型的值,则对该值使用 String 函数,不再进行以下步骤;
    • 第二步:如果 toString 方法返回的是对象,再调用原对象的 valueOf 方法,如果 valueOf 方法返回原始类型的值,则对该值使用 String 函数,不再进行以下步骤;
    • 第三步:如果 valueOf 方法返回的是对象,就报错;
    var obj = {
      valueOf: function () {
        return {};
      },
      toString: function () {
        return {};
      }
    };
    
    String(obj)
    // TypeError: Cannot convert object to primitive value
    

Boolean()

Boolean 函数可以将任意类型的值转为布尔值;

原始值类型

  1. 它的转换规则相对简单:除了以下五个值的转换结果为 false ,其他的值全部为 true

    Boolean(undefined) // false
    Boolean(null) // false
    Boolean(0) // false
    Boolean(NaN) // false
    Boolean('') // false
    
  2. 当然 truefalse 这两个布尔值不会发生变化;

    Boolean(true) // true
    Boolean(false) // false
    

对象

  1. 注意,所有对象(包括空对象)的转换结果都是 true ,甚至连 false 对应的布尔对象 new Boolean(false) 也是 true

    Boolean({}) // true
    Boolean([]) // true
    Boolean(new Boolean(false)) // true
    
  2. 所有对象的布尔值都是 true ,这是因为 JavaScript 语言设计的时候,出于性能的考虑,如果对象需要计算才能得到布尔值,对于 obj1 && obj2 这样的场景,可能会需要较多的计算,为了保证性能,就统一规定,对象的布尔值为 true

自动转换(隐式转换)

  1. 自动转换,它是以强制转换为基础的;

  2. 遇到以下三种情况时,JavaScript 会自动转换数据类型,即转换是自动完成的,用户不可见。

    • 第一种情况,不同类型的数据互相运算;
    • 第二种情况,对非布尔值类型的数据求布尔值;
    • 第三种情况,对非数值类型的值使用一元运算符(即+-);
  3. 由于自动转换具有不确定性,而且不易除错,建议在预期为布尔值、数值、字符串的地方,全部使用 Boolean()Number()String() 函数进行显式转换;

自动转换为布尔值

  1. JavaScript 遇到预期为布尔值的地方(if 的条件部分),就会将非布尔值的参数自动转换为布尔值,系统内部会自动调用 Boolean() 函数,因此除了 undefinednull0NaN'' 五个值,其他都是自动转为 true

  2. 下面两种写法,有时也用于将一个表达式转为布尔值,它们内部调用的也是 Boolean() 函数;

    // 写法一
    expression ? true : false
    
    // 写法二
    !! expression
    

自动转换为字符串

  1. JavaScript 遇到预期为字符串的地方,就会将非字符串的值自动转为字符串,具体规则是,先将复合类型的值转为原始类型的值,再将原始类型的值转为字符串;

  2. 字符串的自动转换,主要发生在字符串的加法运算时,当一个值为字符串,另一个值为非字符串,则后者转为字符串;

    '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. 这种自动转换很容易出错,开发者可能期望返回 120 ,但是由于自动转换,实际上返回了一个字符 10020

    var obj = {
      width: '100'
    };
    
    obj.width + 20 // "10020"
    

自动转换为数值

  1. JavaScript 遇到预期为数值的地方,就会将参数值自动转换为数值,系统内部会自动调用 Number() 函数;

  2. 除了加法运算符有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值;

    '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
    

    注意:null转为数值时为0,而undefined转为数值时为NaN

  3. 一元运算符也会把运算子转成数值;

    +'abc' // NaN
    -'abc' // NaN
    +true // 1
    -false // 0
    
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于产品、设计、开发的问题和看法,还有技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程

了解更多

目录

  1. 1. 强制转换(显式转换)
    1. 1.1. Number()
      1. 1.1.1. 原始类型值
      2. 1.1.2. 对象
    2. 1.2. String()
      1. 1.2.1. 原始类型值
      2. 1.2.2. 对象
    3. 1.3. Boolean()
      1. 1.3.1. 原始值类型
      2. 1.3.2. 对象
  2. 2. 自动转换(隐式转换)
    1. 2.1. 自动转换为布尔值
    2. 2.2. 自动转换为字符串
    3. 2.3. 自动转换为数值