koala-coding / day-day-up

每天进步一点点,记录每天在公司的一个小收获,一年后你回顾肯定收获了很多,哪怕是你知道了一个新函数,甚至一个新单词都可以。也算是一个个人成长秘籍吧
Apache License 2.0
9 stars 0 forks source link

2019年12月28日你要记录点什么? #21

Open fecym opened 4 years ago

fecym commented 4 years ago

字位反转操作符 ~

~ 返回 2 的补码,~x 大致等同于 -(x+1)

~42 // -(42+1) ===> -43

-(x+1) 中唯一能够得到 0(或者严格来说时候 -0)的 x 值是 -1,也就是说 ~ 和一些数字在一起会返回一个假值 0,其他情况下则返回真值

-1 是一个 哨位值,哨位值是那些在各个类型中被赋予了特殊含义的值。在 C 语言中 -1 代表函数执行失败,大于等于 0 的值代表函数执行成功

比如在 JavaScript 中字符串的 indexOf 方法也遵循这一惯例,该方法在字符串中搜索指定的字符串,如果找到就返回该子字符串所在的位置,否则返回 -1

~ 的用途

我们知道在 JavaScript 中假值有:undefined、null、false、+0、-0、NaN、'',其他都为真值,所以负数也是真值,那么我们就可以拿着 ~indexOf 一起检结果强制类型转换为 真/假 值

const str = 'hello world'
~str.indexOf('lo') // -4,真值
if (~str.indexOf('lo')) {
  // true
  // 找到匹配
}
~str.indexOf('ol') // 0,假值
!~str.indexOf('ol') // true
if (!~str.indexOf('ol')) {
  // true
  // 没有找到匹配
}

~ 要比 >=0== -1 更简洁

字位截除

我们经常使用 ~~ 来截取数字值的小数部分,以为这是和 Math.floor 效果是一样的,实际上并非如此

~~ 中第一个 ~ 执行 ToInt32 并反转字位,然后第二个在进行一次字位反转,就是将所有的字位反转回原值,最后得到的结果仍是 ToInt32 的结果

~~ 只适用于 32 位的数字,更重要的是他对负数的处理与 Math.floor 不同,所以使用时要多加注意

Math.floor(1.9) // 1
~~1.9 // 1
// 操作负数
Math.floor(-1.9) // -2
~~-1.9 // -1

~~x 能将值截除为一个 32 位的整数,x | 0 也可以,而且看起来更简洁哦,不过出于对运算符优先级的考虑,我们更倾向于使用 ~~x

~~1.9 // 1
1.9 | 0 // 1

~~-1.9 // -1
;-1.9 | 0 // -1
fanglongfei321 commented 4 years ago

今日做了一个vue项目 看视频会了一种简洁关联github远程仓库的方法,下午去拿了学生证,明天要考试。浪费了3个小时,地铁上有看了红宝书看了半个小时,当然英语也没有落下。今日分享至此。每一天都要加油!期待成为更好的自己。

fanglongfei321 commented 4 years ago

12月29日 经历了一次考试,全然无知,一脸懵逼,差不多20周的课我掌握的却是很少,写答案才知自己无能,考完后尽然释然,这一切变得不经意,晚上单词没写 ,没有朗读文章,晚上去了朋友那里吃饭,觉得自己很是不爽,回来跟室友发了脾气,我不喜欢烟味,很讨厌。莫名的。晚安