03、JavaScript数据类型转换

136 阅读3分钟

数据类型转换

1. Number([value]) 把其他数据类型转换为number数据类型

 字符串转数字:空字符串是0 如果字符串中出现任意一个非有效数字字符,结果都是NaN
 布尔转换为数字: true ->1 false ->0
 null ->0   undefefined-> NaN
 symbol 值不能转换为数字 Uncaught TypeError: Cannot convert a Symbol value to a number
 bigint 可以转换为数字
 引用数据类型(对象或者函数)转换为数字: 
     1.首先获取它的[Symbol.toPrimitive]属性值
     2.如果没有这个属性,其次获取它的ValueOf值(原始值)
     3.如果还是没有原始值,最后把其转换为字符串 toString,然后再转换为数字 Number

2.parseInt/parseFloat([value]) 把其他数据类型转换为数字类型

 需要保证[value]是一个字符串,如果不是则首先‘隐式’的把其他转换为字符串 [value].toString()
 从字符串左侧第一个字符开始向右查找,把找到的有效数字字符最后转换为数字(遇到一个非有效数字字符则停止查找,不论后面是否还有有效数字字符,都不再找了)
 如果一个有效数字字符都没找到,结果是NaN
[number value].toFixed([N]):保留小数点后面N位
  • toExponential
  • toPrecision
  • ...

2.把其他数据类型转换为字符串类型[value.toString() / String(value)]

 基本上都是用双引号或者单引号包起来即可
 数组转换为字符串,是把数组中的每一项用逗号分隔
 对于普通对象来讲,转换为字符串的时候,不论对象中包含哪些信息,结果都是"[object object]"
 ...
 
 JS中的数据运算符
    "=" "*" "/"
     "%" 取余数(模)
     "+" 它在JS中比较的特殊,除了常规的数学运算,有时候属于字符串拼接
     
 “+” 加号的字符串拼接
     加号的“左右两边”,有一边出现字符串,结果就是字符串拼接
     加号的"左右两边",有一边出现对象(目的是把对象转换为数字,进行数学运算)
         首先会获取对象的[Symbol.toPrimitive]或者valueOf
         如果上述都没有获取原始值,则基于toString把对象转换为字符串
         此时出现问题"+左右两边,有一边出现字符串了"此时就不再是数学运算,而是字符串拼接了
         加号只出现一边,这样这一边即使是字符串/对象,也是数学运算
         如果是一个"{}"加内容,"{}"不参与运算,只是相当于一个代码块
    ` 
        var s = "10";
        console.log(+"10"); //10
        console.log(+[10]); //10
        console.log(s++); // 10
        console.log(s) // 11
        {} + 10 // 10 前面当作了代码块不参与运算,只处理了+10
        // 这两种都是正常运算
        ({}+10) //["object object"]10
        10 + {} //10["object object"]
    `
           console.log(10 + '10'); //'1010' 字符串拼接
           console.log(10 - '10'); //0 数学运算
           console.log(10 + [10,20]); 
           // [10, 20][Symbol.toPrimitive] undefined
           // [10, 20].valueOf() [10,20]不是原始值
           // [10,20].toString() "10,20"
           // --- 此时
           // 10 + "10,20" 这是字符串拼接了
          // => "1010,20"
          
          console.log(10 + {}); //"10[object Object]"
          console.log(10 + new Number(10));
          new Number(10)也是一个对象
          new Number(10)[Symbol.toPrimitive] undefined
          new Number(10).valueOf() 10
          10+10 => 20

字符串有很多能调用的方法

  • charAt
  • charCodeAt
  • substr
  • substring
  • slice
  • split
  • replace
  • indexOf / lastIndexOf
  • includes
  • trim
  • match
  • ... `var str = "zhufengpeixun";

str.substr(n,m); 从索引n开始截取m个字符

console.log(2,4);//"ufen"

str.substring(n,m); 从索引n开始找到索引m处(不含m),把找到的结果截取一下

console.log(2,4);//"uf"

m不写都是截取到字符串末尾

都不支持负数索引,而slice是支持的(剩下的语法和substring一样)`

3.把其他数据类型值转换为布尔类型 Boolean([value]) / !![value]

只有"0、NaN、空字符串、null undefined"变为布尔的false,其余都是true
条件判断
if(10) {
    首先会把10转换为布尔类型,然后验证真假,决定条件是否成立
}

![value]:把value转换为布尔类型,然后取反