zoukankan      html  css  js  c++  java
  • js你不是的那些基础问题-数据类型的转换

    1 强制转换

    1.1 Number()

      (1)原始类型值

      Number函数将字符串转为数值,要比parseInt函数严格很多。

      基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN

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

      另外,parseIntNumber函数都会自动过滤一个字符串前导和后缀的空格。

    parseInt('	v
    12.34
    ') // 12
    Number('	v
    12.34
    ') // 12.34
    

      (2)对象

      简单的规则是,Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组。

    Number({a: 1}) // NaN
    Number([1, 2, 3]) // NaN
    Number([5]) // 5

    之所以会这样,是因为Number背后的转换规则比较复杂。

    第一步,调用对象自身的valueOf方法。如果返回原始类型的值,

    则直接对该值使用Number函数,不再进行后续步骤。

    第二步,如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。

    如果toString方法返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。

    第三步,如果toString方法返回的是对象,就报错。

    var obj = {x: 1};
    Number(obj) // NaN
    
    // 等同于
    if (typeof obj.valueOf() === 'object') {
      Number(obj.toString());
    } else {
      Number(obj.valueOf());
    }
    

      上面代码中,Number函数将obj对象转为数值。背后发生了一连串的操作,

      首先调用obj.valueOf方法, 结果返回对象本身;

      于是,继续调用obj.toString方法,这时返回字符串[object Object]

      对这个字符串使用Number函数,得到NaN

      如果toString方法返回的不是原始类型的值,结果就会报错。

    var obj = {
      valueOf: function () {
        return {};
      },
      toString: function () {
        return {};
      }
    };
    
    Number(obj)
    // TypeError: Cannot convert object to primitive value
    

      上面代码的valueOftoString方法,返回的都是对象,所以转成数值时会报错。

    1.2 String()

    (1)原始类型值

    • 数值:转为相应的字符串。
    • 字符串:转换后还是原来的值。
    • 布尔值:true转为字符串"true"false转为字符串"false"
    • undefined:转为字符串"undefined"
    • null:转为字符串"null"
    String(123) // "123"
    String('abc') // "abc"
    String(true) // "true"
    String(undefined) // "undefined"
    String(null) // "null"
    

      (2)对象

      String方法的参数如果是对象,返回一个类型字符串;

      如果是数组,返回该数组的字符串形式。

    String({a: 1}) // "[object Object]"
    String([1, 2, 3]) // "1,2,3"
    

      String方法背后的转换规则,与Number方法基本相同,

      只是互换了valueOf方法和toString方法的执行顺序。

    1. 先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。

    2. 如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数,不再进行以下步骤。

    3. 如果valueOf方法返回的是对象,就报错。

     

    文章内容转自 阮一峰老师 JavaScript教程 https://wangdoc.com/javascript/index.html

     

  • 相关阅读:
    1094. Car Pooling
    121. Best Time to Buy and Sell Stock
    58. Length of Last Word
    510. Inorder Successor in BST II
    198. House Robber
    57. Insert Interval
    15. 3Sum java solutions
    79. Word Search java solutions
    80. Remove Duplicates from Sorted Array II java solutions
    34. Search for a Range java solutions
  • 原文地址:https://www.cnblogs.com/WernerWu/p/11352649.html
Copyright © 2011-2022 走看看