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 - 如果值是
bealoon,true转换为 1,false转换为 0。 - 如果值是
string,应用以下规则:- 如果字符串包含数值字符,包括数值字符前面带加、减号的情况,则转换为一个十进制数值
- 如果字符串包含有效的浮点值格式如"1.1",则会转换为相应的浮点值
- 如果字符串包含有效的十六进制格式如"0xf",则会转换为与该十六进制值对应的十进制整数值
- 如果是空字符串(不包含字符),则返回 0
- 如果字符串包含除上述情况之外的其他字符,则返回 NaN。
- 如果值是
Object,调用 valueOf()方法,并按照上述规则转换返回的值。如果转换结果是 NaN,则调用toString()方法,再按照转换字符串的规则转换
- 如果值是
所以字符串总能匹配想要的结果,而数字则有null、beanloon、空字符等干扰。
选择字符串,性能怎么办?
调用vue/react、lodash、babel...想过性能没,也不差这个匹配了。