avaScript提供了很多原生好用的操作符,在开发过程中如果能合理的使用肯定能达到事半功倍的效果。我们的目标是能少些一个字符,绝不多写 😁
在日常开发中,我们经常会遇到需要检查字符串中是否包含某个子串的情况。通常的做法是使用indexOf()方法,并与-1比较,但这种方法在可读性方面并非最佳。下面我们来看看,如何利用原生操作符使代码更加简洁、易读。
rust复制代码if (~str.indexOf("subStr")) {
// 子字符串存在
} else {
// 子字符串不存在
}
为什么使用~
操作符后,就不用写>-1了呢?我们来看看其背后的隐式转换和~操作符原理。
step1. 转成32位的二进制:11111111111111111111111111111111
注:在二进制中**-1**表示为所有位都是1的二进制数
step2. 按位取反:00000000000000000000000000000000
step1. 转成32位的二进制00000000000000000000000000000011
step2. 按位取反11111111111111111111111111111100
step3. 二进制到十进制的转换
取反后得到的是一个新的二进制数,但这个二进制数以1开头,表示它是一个负数。在计算机中,负数通常使用补码形式表示,所以我们需要将这个二进制数转换为它的补码对应的十进制数。
补码的计算过程是:
markdown复制代码11111111111111111111111111111100
+ 1
-----------------------------------
11111111111111111111111111111101
得到的新二进制数仍然是负数的补码表示,它对应的十进制数是-4。
小结:这个过程也可以简单的通过数学表达式来表示:
~N = -N - 1
,可以理解为这个操作符是赔了夫人又折兵。梳理
~str.indexOf(xxx)
后得到的结果一定是小于等于0的数字!
后,结果不变less复制代码[] == 0 // true
![] == 0 // true
分析:
在[] == 0中,对于复杂类型转化过程是先执行toString再通过Number转成数字,因此结果是Number([].toString())==0
在![] == 0中,![]
优先执行将数组转成布尔值再取反返回false,再转成数字,因此结果也是0
"5">15
为false,而"5">"15"
为true原因是:两个字符串数字比较的不是数字本身,而是通过charCodeAt获取到的Unicode编码的索引:
less复制代码[] == [] //false(引用地址不一样、无异议)
[] == ![] //true(比较的转化后的数字)
{} == {} //false同上
{} ==!{} //false,哈哈和上面的数组对比结果是相反的
小结:隐式转换有时候容易让人产生误解,但也是有迹可循,把握住要点、就不会出错,如果大家有遇到什么有意思的隐式转换,欢迎留言讨论。。。
充分了解掌握操作符和隐式转换的行为有助于我们编写更可靠、更易于维护的代码。但在实际开发中,应合理的使用隐式转换,并在可能引起混淆的地方采用显式类型转换,以提高代码的清晰度和稳定性。
另外,合理的使用操作符可以帮助我们编写更简洁的代码,还可以提高代码的可读性( 如+
操作符快捷转换数字、??
控制合并操作符对处理数字0非常有用)
作者:码窝酱 链接:https://juejin.cn/post/7326268986798178341 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。