JavaScript 数据类型转换

  • JavaScript数据类型

    在JavaScript中,有5种不同的数据类型可以包含值:
    • string
    • number
    • boolean
    • object
    • function
    有3种类型的对象:
    • Object
    • Date
    • Array
    2种不能包含值的数据类型:
    • null
    • undefined
  • 操作符的类型

    您可以使用typeof运算符查找JavaScript变量的数据类型。
    语法:
    typeof "John"                 // 返回 "string" 
    typeof 3.14                   // 返回 "number"
    typeof NaN                    // 返回 "number"
    typeof false                  // 返回 "boolean"
    typeof [1,2,3,4]              // 返回 "object"
    typeof {name:'John', age:34}  // 返回 "object"
    typeof new Date()             // 返回 "object"
    typeof function () {}         // 返回 "function"
    typeof myCar                  // 返回 "undefined" *
    typeof null                   // 返回 "object"
    
    尝试一下
    请注意:
    • NaN的数据类型是数字
    • 数组的数据类型是object
    • 日期的数据类型是object
    • null的数据类型是object
    • 未定义的变量的数据类型undefine *
    • 尚未赋值的变量的数据类型也undefine *
    您不能typeof用来确定JavaScript对象是否是数组(或日期)。
  • typeof的数据类型

    typeof操作符不是一个变量。这是一个运算符。运算符(+ - * /)没有任何数据类型。但是,typeof运算符(包含操作数的类型)总是返回一个字符串。
  • constructor属性

    constructor属性返回JavaScript变量所有的构造函数。
    "John".constructor                // 返回函数 String()  {[native code]}
    (3.14).constructor                // 返回函数  Number()  {[native code]}
    false.constructor                 // 返回函数  Boolean() {[native code]}
    [1,2,3,4].constructor             // 返回函数  Array()   {[native code]}
    {name:'John',age:34}.constructor  // 返回函数  Object()  {[native code]}
    new Date().constructor            // 返回函数  Date()    {[native code]}
    function () {}.constructor        // 返回函数  Function(){[native code]}
    
    尝试一下
  • constructor属性

    constructor属性返回JavaScript变量所有的构造函数。
    "John".constructor                // 返回函数 String()  {[native code]}
    (3.14).constructor                // 返回函数  Number()  {[native code]}
    false.constructor                 // 返回函数  Boolean() {[native code]}
    [1,2,3,4].constructor             // 返回函数  Array()   {[native code]}
    {name:'John',age:34}.constructor  // 返回函数  Object()  {[native code]}
    new Date().constructor            // 返回函数  Date()    {[native code]}
    function () {}.constructor        // 返回函数  Function(){[native code]}
    
    尝试一下
    您可以检查构造函数属性以查明对象是否为Array (包含单词“Array”):
    function isArray(myArray) {
      return myArray.constructor.toString().indexOf("Array") > -1;
    }
    
    尝试一下
    或者甚至更简单,您可以检查对象是否是数组函数:
    function isArray(myArray) {
      return myArray.constructor === Array;
    }
    
    尝试一下
    您可以检查constructor属性以查明对象是否为 Date(包含单词“Date”):
    function isDate(myDate) {
      return myDate.constructor.toString().indexOf("Date") > -1;
    }
    
    尝试一下
    或者甚至更简单,您可以检查对象是否是Date函数:
    function isDate(myDate) {
      return myDate.constructor === Date;
    }
    
    尝试一下
  • constructor属性

    JavaScript变量可以转换为新变量和另一种数据类型:
    • 通过使用JavaScript函数
    • 由JavaScript本身自动完成
  • 将数字转换为字符串

    全局方法String()可以将数字转换为字符串。它可以用于任何类型的数字,文字,变量或表达式:
    • 通过使用JavaScript函数
    • 由JavaScript本身自动完成
    String(x)         // 从数字变量x返回一个字符串
    String(123)       // 从数字文字123返回一个字符串
    String(100 + 23)  // 从表达式中的数字返回一个字符串
    
    尝试一下
    方法toString()也是如此。
    x.toString()
    (123).toString()
    (100 + 23).toString()
    
    尝试一下
    数字转成字符串方法还有:
    方法 描述
    toExponential() 返回一个字符串,其数字为近似值并使用指数表示法编写。
    toFixed() 返回一个字符串,其数字已四舍五入,并以指定的小数位数写入。
    toPrecision() 返回一个字符串,其中的数字以指定的长度写入
  • 将布尔值转换为字符串

    全局方法String()可以将布尔值转换为字符串。
    String(false)      // 返回 "false"
    String(true)       // 返回 "true"
    
    toString()也是如此。
    false.toString()   // 返回 "false"
    true.toString()    // 返回 "true"
    
  • 将布尔值转换为字符串

    全局方法String()可以将日期转换为字符串
    String(Date())  // 返回 "Thu Jul 17 2018 15:38:19 GMT+0200 (W.欧洲夏令时)"
    
    toString()也是如此。
    Date().toString()  // returns "Thu Jul 17 2014 15:38:19 GMT+0200 (W.欧洲夏令时)"
    
    日期方法一章中,您将找到更多可用于将日期转换为字符串的方法:
  • 将字符串转换为数字

    全局方法Number()可以将字符串转换为数字。包含数字的字符串(如“3.14”)将转换为数字(如3.14)。空字符串转换为0。其他任何东西都转换为NaN(Not a Number)。
    Number("3.14")    // 返回 3.14
    Number(" ")       // 返回 0 
    Number("")        // 返回 0
    Number("99 88")   // 返回 NaN
    
    数字方法一章中,您将找到更多可用于将字符串转换为数字的方法
  • 一元+算子

    一元运算符+可用于一个变量转换为一个数字:
    var y = "5";      // y是一个字符串
    var x = + y;      // x 是一个数字
    
    尝试一下
    如果变量无法转换,它仍将成为number类型,但值为NaN (Not a Number):
    var y = "John";   // y 是一个字符串
    var x = + y;      // x 是一个number类型 (NaN)
    
    尝试一下
  • 将布尔值转换为数字

    全局方法Number()还可以将布尔值转换为数字。
    Number(false)     // 返回 0
    Number(true)      // 返回 1
    
  • 将日期转换为数字

    全局方法Number()可用于将日期转换为数字。
    d = new Date();
    Number(d)          // 返回 1404568027739
    
    日期方法getTime()也是如此。
    d = new Date();
    d.getTime()        // 返回 1404568027739
    
  • 自动类型转换

    当JavaScript尝试对“错误”数据类型进行操作时,它会尝试将值转换为“正确”类型。结果并不总是您所期望的:
    5 + null    // 返回 5         因为null转换为0
    "5" + null  // 返回 "5null"   因为null转换为“null”
    "5" + 2     // 返回 "52"      因为2被转换为“2”
    "5" - 2     // 返回 3         因为“5”被转换为5
    "5" * "2"   // 返回 10        因为“5”和“2”被转换为5和2
    
    日期方法getTime()也是如此。
    d = new Date();
    d.getTime()        // 返回 1404568027739
    
    尝试一下
  • 自动字符串转换

    当您尝试“输出”对象或变量时,JavaScript会自动调用变量的函数toString()
    document.getElementById("demo").innerHTML = myVar;
    
    // if myVar = {name:"Fjohn"}  // toString转换为“[object Object]”
    // if myVar = [1,2,3,4]       // toString转换为“1,2,3,4”
    // if myVar = new Date()      // toString将转换为“Fri Jul 18 2018 09:08:55 GMT+0200”
    
    数字和布尔值也被转换,但这不是很明显:
    // if myVar = 123             // toString 转换为 "123"
    // if myVar = true            // toString 转换为 "true"
    // if myVar = false           // toString 转换为 "false"
    
  • 一些令人迷糊的转换结果

    原始值 转换为数字 转换为字符串 转换为布尔
    false 0 "false" false
    true 1 "true" true
    0 0 "0" false
    1 1 "1" true
    "0" 0 "0" true
    "000" 0 "000" true
    "1" 1 "1" true
    NaN NaN "NaN" false
    Infinity Infinity "Infinity" true
    -Infinity -Infinity "-Infinity" true
    "" 0 "" false
    "20" 20 "20" true
    "twenty" NaN "twenty" true
    [ ] 0 "" true
    [20] 20 "20" true
    [10,20] NaN "10,20" true
    ["twenty"] NaN "twenty" true
    ["ten","twenty"] NaN "ten,twenty" true
    function(){} NaN "function(){}" true
    { } NaN "[object Object]" true
    null 0 "null" false
    undefined NaN "undefined" false