JS - 数据转换和运算

转字符串类型

其他类型转成字符串类型的方法: String(),toString()

除了基础对象外, 其他类型转字符串, 都是字符串的什么
String({name:'Tenderness'}); //结果是 "[object Object]"
({name:'Tenderness'}).toString(); //结果是 "[object Object]"
String(['a',1]); //结果是 "a,1"
['a',1].toString(); //结果是 "a,1"
String(null); //结果是 "null"
String(undefined); //结果是 "undefined"
String(100); //结果是 "100"
(100).toString(); //结果是 "100"

注意点

  1. ()括号的另一种用法 — 表达式, 让浏览器正确识别数据类型
  2. nullundefined没有toString()方法
  3. 数字的toString()方法还可以接受一个number类型的参数, 表示转进制, 如(100).toString(2)表示数字100(十进制)转成二进制的1100100

转数字类型

其他类型转数字类型的方法: Number(), parseInt(),parseFloat()

三种方法的区别

  1. parseInt()parseFloat()一般用于将字符串(string类型)(如<input>标签的value属性)转成数字

  2. Number()转数字的机制: 先调用内置的toString()方法将参数转成字符串, 再将字符串转成数字, 非空且含有非数字字符的字符串转数字永远是NaN, 因此number([])结果是0, Number({})结果是NaN

  3. parseInt()parseFloat会将参数字符串从左到右读取, 如果先读取到数字就转成对应精准度的数字, 先遇到其他则转成NaN

    Number('12px'); //结果是NaN
    parseInt('12px'); //结果是12
    parseInt('px12'); //结果是NaN
    

Number() 转数字的特殊情况

Number(''); //结果是0
Number(' '); //结果是0
Number([]); //结果是0
Number({}); //结果是NaN
Number(null); //结果是0
Number(undefined); //结果是undefined
Number(true); //结果是1
Number(false); //结果是0

转布尔类型

其他类型转布尔类型的方法: Boolean()

注意点

  1. 除了'',0,null,undefined,NaN转布尔类型为false外, 其他数据类型转布尔类型都是true
  2. if语句的条件表达中如果不使用比较运算符, 会默认调用Boolean()方法将表达式中数据转成布尔类型, 如果结果是true则条件成立

数据运算

在提及数据运算前, 先说一下运算时2个特殊的数据

  1. NaN特殊的数字类型, 全称 Not a Number, 和任何数据( 包括本身 )作比较时永远为false, 和任何数字相加永远是NaN
  2. 字面量形式书写的基础对象, 如{}, 在浏览器控制台开头进行运算时, 会被认为是 代码块(block statement), 所以{}就表示什么都没有; 如果在其他位置, 如({}), 才会被识别成基础对象

本节代码均书写在浏览器控制台

算术运算

  1. +加号的作用: a) 数字求和 b) 字符串拼接

    1 + 2 //数字求和 结果是 3
    NaN + 1 //数字求和 结果是 NaN, 任何数字和NaN相加都是NaN
    "I am "+"Tenderness" //字符串拼接 结果是 "I am Tenderness"
    

    当一个数字和一个字符串进行相加时, 会将数字转成字符串然后进行拼接

    "str" + 123 //结果是 "str123"
    

    当一个数字和一个基本类型数据进行相加时, 会把基本类型数据转成数字后进行相加

    null + 123 //结果是 123
    undefined + 123 //结果是 NaN
    true + 123 //结果是124
    false + 123 //结果是123
    

    当一个数字和一个引用类型数据进行相加时, 会把引用类型数据转成字符串后进行拼接

    [] + 123 //结果是 "123"
    [1,2,3] + 123 //结果是 "1,2,3123"
    {} + 123 //结果是 123, {}放在开头, 表示什么都没有
    ({}) + 123 //结果是 "[object Object]123"
    123 + {} //结果是 "123[object Object]"
    NaN + {} //结果是 "NaN[object Object]"
    

    当2个非数字基本类型数据进行相加时, 会把基本类型数据转成数字后进行相加

    null + undefined //结果是 NaN
    true + false //结果是 1
    

    当2个引用类型数据进行相加时, 会把引用类型数据转成字符串后进行拼接

    ["a",1] + {} //结果是 "a,1[object Object]"
    

    当一个非数字基本类型数据和一个引用类型数据进行向加时, 会把2个数据转成字符串后进行拼接

    null + {} //结果是 "null[object Object]"
    undefined + {} //结果是 "undefined[object Object]"
    true + {} //结果是 "true[object Object]"
    false + {} //结果是 "false[object Object]"
    

  2. -减号, *乘号, /除号, %取余的作用: a) 数字对应运算 b) 将纯数字字符串转成运算后的数字

    "1314" * 1 //结果是 1314, 利用这个特性, 可以快速的将纯数字字符串转成数字
    

    一个数字和其他类型数据进行减、乘、除、取余运算, 会把其他类型数据转成数字后进行运算

    "Tenderness" - 1 //结果是 NaN
    "" * 1 //结果是 0
    true / 1 //结果是 1
    false % 1 //结果是 0
    [] - 1 //结果是 0
    [123] - 1 //结果是 122
    [123,456] - 1 //结果是 NaN
    ({}) - 1 //结果是 NaN
    

比较运算

大小比较

  1. 2个数字比较, 比较的是他们的数值

  2. 数字与其他数据比较, 会将其他数据转成数字, 再作比较

  3. 2个字符串比较, 从左到右依次比较每个字符的Unicode数值, 直到出现差值或者其中一个字符串结束

  4. 字符串与非数字数据比较, 会将非数字数据转成字符串, 再作比较

  5. 任何数据和NaN比较结果都是false

    123 > 122 //数值比较, 结果是 true
    123 > "abc" //"abc"转数字NaN, 结果是 false
    "a" > "b" //unicode值比较, 结果是 false
    "ab" > "b" //"a"和"b"的unicode值比较, 结果是 false
    "ab" > "ac" //"b"和"c"的unicode值比较, 结果是 false
    "abc123" > "abc" //"abc"字符串结束仍没有unicode差值, 比较字符串长度, 结果为 true
    "abc" > function fn () {} //函数转成字符串"function fn () {}", "a"和"f"的unicode值比较, 结果是 false
    

相等比较

  1. ===!==会先比较数据类型, 再比较数据值

  2. ==!=只比较数据值, 涉及隐性转换(数据转类型)

    a) 布尔类型会先转成数字再比较, true转为1, false转为0

    b) 数字和字符串比较, 字符串会转成数字后再作比较

    c) 引用类型和基本类型作比较时, 引用类型会转成字符串再作比较

  3. 2个引用类型数据比较的是引用值( 堆内存中的地址 )

  4. null或者undefined与其他数据作比较时, 不会发生转换

  5. null == undefined 结果为true, null === undefined结果为false

  6. NaN和任何数据比较都不相等, 包括本身, 即NaN == NaN结果为false


   转载规则


《JS - 数据转换和运算》 Tenderness 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录