你给翻译翻译,什么叫JS黑话

JS黑话到底好不好?

       JS的语法具有简单灵活的特点,因此出现了很多利用JS语言特性整活的取巧写法,也就是所谓的”黑话“。但是作为业务开发,编写业务代码时极度不建议使用”黑话“,原因有三:

  • 降低可读性:代码不仅是给机器运行的,也是给人看的,越是偏向应用层的代码可读性要求越高,而黑话基本只考虑了简略性
  • 水太深:很多黑话是基于JS的隐式类型转换机制,这玩意是个同心圆中圆,很少有人敢肯定自己完全掌握,导致乱用黑话很容易考虑不全面,存在部分特殊值偏移黑话的原始意图
  • 增加学习成本:黑话不是语法糖,它本质还是基于JS现有的语言特性衍生的含义,一个优秀易学的语言设计时会尽力避免让一个语法同时兼具多种毫无关联的含义,这会成为困惑的来源。例如!是布尔值取反的含义,但是黑话中!!还能做强制类型转换,可能有点反人类的感觉

常见黑话及其问题

!!

黑话原理

!a表示取反,作用于非布尔类型时会先将其隐式转换为布尔类型再取反,
!!a两次取反即表示仅做隐式类型转换,实现强制转换为布尔类型的目的,与Boolean(a)的效果完全一致

问题所在

       这个很容易让人误解它可以拿去做判空,的确null、undefined、NaN都是false,但0、空字符串也是false,而0与空字符串到底算不算空是要根据业务场景来定的。很多时候0就是个正常的业务数据,与1、2、3没啥区别;空字符串也可以是界面输入的正常数据。同理还有更省略版的if(a) {}的写法,在不确定a一定是布尔值的情况下也存在同样的问题

替换方式

  • 如果想判断变量是否有值,可以直接使用a == null,对于undefined也同样适用,或者使用ObjectUtils.isNullOrUndefined
  • 如果想单独判断空字符串、空数组、空对象,可以使用ObjectUtils.isEmptyString、ObjectUtils.isEmptyArray、ObjectUtils.isEmptyObject、ObjectUtils.isStringAndNotEmpty、ObjectUtils.isArrayAndNotEmpty、ObjectUtils.isObjectAndNotEmpty
  • 如果想判断null + undefined + 空字符串 + 空数组 + 空对象,可以使用ObjectUtils.isEmpty
  • 强制转换为布尔类型时直接用Boolean(),效果一样,但是没人会认为这是在做判空

||

黑话原理

||表示或操作,因为其返回值是最后执行的表达式的执行结果,因此黑话中可以用来设置参数默认值。例如var a = options.b || ‘default’,如果 options.b是空的,隐式转换为false则执行后面的表达式并返回默认值’default’;如果 options.b有值且隐式转换为true,则无需执行后面的表示式,返回 options.b

问题所在

       问题除了上面所说的0与空字符串的问题外,还容易让人认为其放之四海而皆准,比如var a = options.b || true,这里传入的option.b如果是false,返回的却是true

替换方式

       明确类型约束,var a = options.b || true改写为var a = fish.isBoolean(option.b)? option.b : true,这样写甭管传进来什么幺蛾子都不会出问题。嫌写起来麻烦的可以用ObjectUtils.setDefaultValue,传入参数与默认值,会自动根据默认值的数据类型判断参数是否符合要求,还有一次设置多个值的ObjectUtils.setDefaultValueByObj及其递归版本ObjectUtils.deepSetDefaultValueByObj

&&

黑话原理

       利用逻辑运算符执行短路的原理,用来替换if条件。如if(a > 1) { go(); }用黑话写就是a > 1 && go()

问题所在

       要是第一个表达式是明确的条件语句还好,但要是写成!!a && go()或者干脆a && go()就又回到了!!的问题上了,甚至还有buff叠满的var b = a && go();
       原本设想是这样:

var b = null;
if (a != null) {
    
    
    b = go();
}

       但完整翻译过来是这样:

var b = null;
if (a) {
    
    
    b = go();
}
else {
    
    
    b = a;
}

       但凡a传个妖魔鬼怪过来,就偏离了最初的设想。

替换方式

       好好写if,多不了几句话。在明确第一个表达式执行结果为布尔类型时也可以用,但是千万不要利用其返回值搞事。

+

黑话原理

       +用于拼接字符串或数值计算,但是只作用于单一变量时默认是做数值计算,所以可以实现强制数值类型转换,如+‘2’,与Number(‘2’)效果完全一致

问题所在

       首先就是空字符串,它的转换结果是0,这个到底符不符合要求需要看业务场景。如果是类似金额之类的场景,空字符串默认0也算合理;如果是ID之类的场景,空字符串应该视为空。
       其次就是空值的问题,+null的结果是0,但+undefined的结果确是NaN。我们大多数业务场景下应该没有区别对待过null和undefined,这种数值转换上的差别会引起一些意想不到的情况。
       同样的问题对于Number()也是一样的。

替换方式

       明确字符串且非空的情况下做数值转换,建议直接使用ObjectUtils.strictStringToNumber,其只有传入明确表示数值的字符串才可以转换成功,第二个参数支持设定科学计数法字符串是否合法,非法字符一律NaN。

都看到这里了 不妨点个赞吧!!!
你还知道哪些JS黑话呢?欢迎在评论区一起分享交流!!!

猜你喜欢

转载自blog.csdn.net/qq_34577234/article/details/125274032