zoukankan      html  css  js  c++  java
  • 数据类型转换

    强制类型转换

    包括Number()、parseInt()、parseFloat()、toString()、String()、Boolean(),这几种方法都比较类似。

    Number()

    • 如果是数字,返回自身
    • 如果是布尔值,true为1,false为0
    • 如果是null,返回0
    • 如果是undefined,返回NaN
    • 如果是字符串,遵循以下规则:只包含数字(或者是0x/0X开头的十六进制数字,也可包含正负号,也可包含小数点),则将其转换成十进制;空字符串,转换为0;不是以上格式的,返回NaN
    • 如果是对象,首先调用对象的valueOf方法,如果转换为基础类型,然后依据前面的规则转换返回的值;如果valueOf方法没有转换为基础类型,会继续调用toString()方法,再次依照前面的规则转换返回对应的值
      const obj1 = {
          valueOf() {
              return 2
          },
          toString() {
              return 3
          }
      }
      const obj2 = {
          toString() {
              return 3
          }
      }
      const obj3 = {
          valueOf() {
              return 'aaa'
          },
          toString() {
              return 3
          }
      }
      console.log(Number(obj1))   //2
      console.log(Number(obj2))   //3
      console.log(Number(obj3))   //NaN

       toString()与valueOf讲解参照:https://www.cnblogs.com/lianglanlan/p/15033978.html

    parseInt()

    parseInt(string, radix)

    parseInt第二个参数可以改变数字的进制。相关链接:不同进制的转换

    如果string不是字符串,会调用toString()方法转换为字符串。

    • 如果是数字,返回数字整数部分
    • 如果是布尔值/null/undefined,返回NaN
    • 如果是字符串:
      • 以数字开头(或者是0x/0X开头的十六进制,也可包含正负,也可包含小数点),则返回整数部分
      • 以数字外的字符开头,返回NaN
        parseInt('12')      //12
        parseInt('0x123')   //291
        parseInt('12a')     //12
        parseInt('a12')     //NaN
        parseInt('-12.23')  //-12
    • 如果是对象,直接调用toString()方法,再依照前面的规则返回对应的值
      const obj1 = {
          valueOf() {
              return 2
          },
          toString() {
              return 'a3'
          }
      }
      const obj2 = {
          toString() {
              return '3a'
          }
      }
      const obj3 = {
          valueOf() {
              return 'aaa'
          },
          toString() {
              return 3
          }
      }
      console.log(parseInt(obj1))   //NaN
      console.log(parseInt(obj2))   //3
      console.log(parseInt(obj3))   //3

    parseFloat()

    与parseInt()同理

    toString()

    • 数字、布尔值、字符串直接返回变量的字符串格式
    • null/undefined调用报错
    • 如果是对象,返回'[object Object]'
    • 如果是数组,返回arr.join(',')
    • 如果是函数,返回字符串式函数体 

    String()

    其余值与toString()返回一致。

    可以将null和undefined转换为字符串。

    Boolean()

    除了undefined/null/false/''/0/NAN转换出来是false,其余都是true

    隐式类型转换

    ==

    • 如果类型相同,无须进行类型转换
    • 如果其中一个操作值为null或undefined,那么另一个操作符必须为null或undefined 才会返回true,否则为false
      console.log(undefined == null)  //true
      console.log(undefined == '')    //false
    • 两个操作值如果为string和number类型,那么会将string转换为number
      console.log('' == 0)    //true
      console.log('123' == 123)   //true
    • 两个操作值如果为boolean和number类型,那么会将boolean转换为number
      console.log(false == 0)     //true
      console.log(true == 1)      //true
      console.log(true == 123)    //false
    • 两个操作符为object和string/number,会将object转换为原始类型(先调用valueOf()再调用toString())
      var a = {
          value: 0,
          valueOf: function () {
              this.value++
              return this.value
          }
      }
      
      console.log(a == 1 && a == 2 && a == 3) //true

     +

    数字相加、字符串拼接。

    • 两边都是数字时,进行加法运算,没有类型转换
    • 两边都是字符串时,直接拼接,无需类型转换
    • 如果其中一个是字符串、一个是数字,则按照字符串规则进行拼接
      console.log(1 + '1')    //'11'
    • 如果其中一个是字符串,另一个是undefined/null/boolean,调用String()进行字符串拼接。
      console.log('1' + undefined)    //'1undefined'
      console.log('1' + null)         //'1null'
      console.log('1' + true)         //'1true'

      如果另一个是对象/数组,则先调用valueOf再调用toSring()方法将对象转换为简单类型再进行字符串拼接

      const obj = {
          a: 1
      }
      const obj1 = {
          valueOf() {
              return 2
          },
          toString() {
              return 3
          }
      }
      const obj2 = {
          toString() {
              return 3
          }
      }
      const obj3 = {
          valueOf() {
              return 'aaa'
          },
          toString() {
              return 3
          }
      }
      
      console.log('1' + obj)      //'1[object Object]'
      console.log('1' + obj1)     //'12'
      console.log('1' + obj2)     //'13'
      console.log('1' + obj3)     //'1aaa'
      const arr = [1, 2]
      console.log('1' + arr)  //'11,2'
      //arr.toString() = '1,2'
    • 如果其中有一个是数字,另外一个是undefined/null/boolean,则会将其转为数字进行加法运算
      console.log(1 + undefined)    //NaN
      console.log(1 + null)         //1
      console.log(1 + true)         //2

      如果另一个是对象/数组,则先调用valueOf再调用toSring()方法将对象转换为简单类型再进行加法运算

      const obj = {
          a: 1
      }
      const obj1 = {
          valueOf() {
              return 2
          },
          toString() {
              return 3
          }
      }
      const obj2 = {
          toString() {
              return 3
          }
      }
      const obj3 = {
          valueOf() {
              return 'aaa'
          },
          toString() {
              return 3
          }
      }
      
      console.log(1 + obj)      //'1[object Object]'
      console.log(1 + obj1)     //3
      console.log(1 + obj2)     //4
      console.log(1 + obj3)     //'1aaa'
  • 相关阅读:
    tmux 简明操作指南
    几种查看linux版本信息的方法
    安装Ruby&Rails遇到的问题
    安装DevKit
    gcc 编译选项
    EF数据操作详解
    值类型和引用类型的区别
    Class<T> where T:new() 含义
    50道高级sql练习题;大大提高自己的sql能力(附具体的sql)
    Entity framework 意外删除了表,如何在不影响其它表的情况下恢复回来
  • 原文地址:https://www.cnblogs.com/lianglanlan/p/15033662.html
Copyright © 2011-2022 走看看