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黑话呢?欢迎在评论区一起分享交流!!!

你给翻译翻译,什么叫JS黑话相关推荐

  1. 翻译翻译什么叫HTML5(六)“开门,js来查水表啦”

    嘿,宝儿萌,这里是阿木木,这是一篇究极精炼的blog,全是干货莫得感情,主要是木木这周要连发两篇,所以只能稍微敷衍一下啦~(翻译翻译什么叫HTML5(五)被我吃了(×)别催了,过两天就更(√)) 1. ...

  2. 翻译翻译:什么叫架构?

    以下文章来源方志朋的博客,回复"666"获面试宝典 作者:Yrion | 链接:cnblogs.com/wyq178/p/12151160.html 这个知识分享的爆炸时代,鉴于 ...

  3. 匹兹堡大学约翰斯敦计算机学院,英语翻译翻译Every human being,no matter what he is doing,gives off...

    英语翻译翻译Every human being,no matter what he is doing,gives off 英语翻译 翻译 Every human being,no matter wha ...

  4. 翻译翻译,什么叫他妈的惊喜?

    翻译翻译,什么叫他妈的惊喜? 本随笔文章,由个人博客(鸟不拉屎)转移至博客园 发布时间: 2018 年 10 月 11 日 原地址:https://niaobulashi.com/archives/N ...

  5. 计算机视觉外语论文翻译,图像处理-毕设论文外文翻译(翻译+原文)

    <图像处理-毕设论文外文翻译(翻译+原文)>由会员分享,可在线阅读,更多相关<图像处理-毕设论文外文翻译(翻译+原文)(9页珍藏版)>请在人人文库网上搜索. 1.英文资料翻译 ...

  6. 翻译翻译,什么是CAP

    翻译翻译,什么是CAP 1 CAP定理 CAP,是一致性(Consistency).可用性(Availability).分区容错性(Partition tolerance)三个英文单字首字母的缩写,是 ...

  7. 语言的翻译叫什么_翻译翻译,什么叫惊喜!

    惊喜,是一个汉语词汇,基本解释为丝毫不加节制的表露欢乐.热情和惊奇,出自<后汉书·袁敞传>.现在也可用作代指名词,指某种给人惊喜的事情. 白白今天就要给大家翻译翻译,在英雄联盟里,什么叫惊 ...

  8. 翻译翻译什么TMD叫EXPLAIN

    翻译翻译什么TMD叫EXPLAIN 你给翻译翻译,什么叫惊喜,什么他妈的叫惊喜! ​ --<让子弹飞> 哈喽,大家好,我是一条,一个梦想弃码从文的程序员! 先跟大家补一个元旦快乐!新年新气 ...

  9. 翻译翻译什么叫她妈的惊喜_妈的程序员说,翻译

    翻译翻译什么叫她妈的惊喜 我们都知道, 产品经理使用相同的术语来解释其实际含义 . 但是软件工程师对具有隐藏含义的普通方言同样有罪. 这是翻译过的最常见的八种程序员谚语. 免责声明:我是前PM. 但是 ...

最新文章

  1. 解决CSV文件中长数字以科学记数格式保存问题
  2. POJ 3070 Fibonacci
  3. 伪类 伪元素 如何区分
  4. Python学习入门基础教程(learning Python)--3.2 if-else分支语句
  5. Filter 字符编码Filter 一
  6. C++ inline
  7. CSS模块化方案分类
  8. 018.Zabbix维护时间和模板导入
  9. 魔兽世界阿拉索人数最多服务器,魔兽世界8.3哪个区人多_wow8.3服务器人数统计介绍_3DM网游...
  10. 姚班天才少年鬲融凭非凸优化研究成果获得斯隆研究奖
  11. 朋友圈新增访客记录?大众点评辟谣”被放弃”;百度 7 款 APP 进入 App Store 前十 | 极客头条...
  12. HDOJ--2087--剪花布条(BF算法和KMP算法都能使用)
  13. VB6.0数据库访问技术与例程解析Java教程
  14. 瞻博网络Contrail多云解决方案荣获最佳创新解决方案奖
  15. Bootstrap注册页面模板
  16. 从游戏中学习产品设计04:成就篇
  17. 基于Go语言Revel+Layui的OA办公系统
  18. V神最新发文:Rollups有望成为以太坊扩容的基石
  19. HTML入门笔记12-HTML中备注写法
  20. USACO-Stamps

热门文章

  1. ng-class判断奇偶数,使其背景色不一样
  2. onclick和click的区别及示例
  3. Realtek MCU Config Tool LED Specify Function
  4. C. Klee in Solitary Confinement(2021ICPC-南京)(公式推导)
  5. php导航遍历代码,目录遍历函数_php
  6. 如何在 Vue 中使用 Font Awesome 字体图标
  7. html图片如何摆在右侧,css里面,怎么让背景图片在最右边,且上下...
  8. java 模拟时钟程序_java模拟时钟程序
  9. 龙讯LONTIUM LT8712EXI 国产芯片
  10. 未分配利润与利润表不一致_​未分配利润与利润表不一致的原因有哪些