等于判断,number 是否要转为 string 再判断

254 阅读2分钟

Number or String

背景

字典在项目中经常用到,字典值是数值,名称是字符。无论是简单的swtich查阅,还是find一个对象数组。都需要相等匹配一个值。

  • switch配置用的是全等
  • find可以自己去定义,但推荐的还是全等

问题就来了: 字典值是数值,数据库存的是int也就是返回的是number,那字典里的数值存number去匹配还是string去匹配呢?

用全等匹配

  • 全等并不是为了性能

通常以为===会比==性能更快,其实不然,还是的看情况。具体参考stackflow

  • 全等为了避免类型转换问题 ==强制类型转换机制是javascript的双刃剑,能不用就不用

匹配性能:number快还是string快

  • ===两端都是number:则直接进行数字比较,如同><
  • ===两端都是string:则比较string字符的character code(Unicode 码点(code points)的范围从 0 到 1114111 (0x10FFFF))

所以匹配number明显更快

所以选择string

为什么?因为在做===匹配时,传入的值要进行值类型检查转换,就要用到 String()(undefined、null用toString()会报错)Number()

  • String()
    • 如果值是 undefined,返回 undefined
    • 如果值是 null,返回 null。
    • 如果值是 bealoon,返回 true or false
    • 如果值是 number,返回对应数字字符串,NaN 返回 NaN
    • 如果值是 Object,则调用 toString()方法
  • Number()
    • 如果值是 undefined,返回 NaN
    • 如果值是 null,返回 0
    • 如果值是 bealoontrue 转换为 1,false 转换为 0。
    • 如果值是 string,应用以下规则:
      • 如果字符串包含数值字符,包括数值字符前面带加、减号的情况,则转换为一个十进制数值
      • 如果字符串包含有效的浮点值格式如"1.1",则会转换为相应的浮点值
      • 如果字符串包含有效的十六进制格式如"0xf",则会转换为与该十六进制值对应的十进制整数值
      • 如果是空字符串(不包含字符),则返回 0
      • 如果字符串包含除上述情况之外的其他字符,则返回 NaN。
    • 如果值是 Object,调用 valueOf()方法,并按照上述规则转换返回的值。如果转换结果是 NaN,则调用toString()方法,再按照转换字符串的规则转换

所以字符串总能匹配想要的结果,而数字则有nullbeanloon、空字符等干扰。

选择字符串,性能怎么办?

调用vue/react、lodash、babel...想过性能没,也不差这个匹配了。