Answers:
~
是按位运算符,用于翻转其操作数中的所有位。
例如,如果您的数字为1
,则其对IEEE 754浮点数(JavaScript如何处理数字)的二进制表示将是...
0011 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
因此~
将其操作数转换为32位整数(JavaScript中的按位运算符会执行此操作)...
0000 0000 0000 0000 0000 0000 0000 0001
如果它是负数,则将以2的补码存储:将所有位取反并加1。
...然后翻转所有位...
1111 1111 1111 1111 1111 1111 1111 1110
那么,它的用途是什么?什么时候可以使用它?
它有很多用途。如果您正在写低级的东西,这很方便。如果您对应用程序进行了概要分析并发现了瓶颈,则可以通过使用按位技巧(作为更大的包装中的一种可能的工具)来提高性能。
这也是一个(一般)不清楚绝招打开indexOf()
的发现返回值放入truthy(同时使未找到为falsy)人们通常会增加一倍它用它截断数字为32位(和丢弃其小数代替它的副作用,实际上与Math.floor()
正数相同)。
我说不清楚,因为目前尚不清楚它的用途。通常,您希望您的代码与阅读它的其他人清楚地交流。尽管使用起来~
可能看起来很酷,但出于自身利益考虑,通常太聪明了。:)
现在JavaScript具有Array.prototype.includes()
和也不再相关String.prototype.includes()
。这些返回布尔值。如果您的目标平台支持它,则应首选此方法来测试字符串或数组中是否存在值。
value = value || default
在JavaScript中,只要您知道何时可以使用和不使用它,它就是一个常见且有效的习惯用法。
v = t ? a : b;
。我发现这比var v; if (t} { v = a; } else { v = b; }
通常跨越5条以上的线清晰得多var v = b; if (t) { v = a; }
,也比通常跨越4条以上的线更清晰。但是我知道很多人不熟悉? :
运营商,他们更喜欢第二或第三种方式。我发现第一个更具可读性。我同意一般原则,使代码清晰明了,不要使用hack。我想我一看~v.indexOf('...')
就会很清楚。
~
惯用的。从技术上讲,它是语言规范的一部分,但在通用语言中,它并不是那么多。
在indexOf()
表达式前使用它可以有效地为您提供真实/虚假的结果,而不是直接返回的数字索引。
如果返回值为-1
,则~-1
是0
因为-1
是全1的字符串。任何大于或等于零的值都将得出非零的结果。从而,
if (~someString.indexOf(something)) {
}
if
当“ someString”中包含“ something”时,将导致代码运行。如果您尝试.indexOf()
直接用作布尔值,那将是行不通的,因为有时它会返回零(当“ something”在字符串的开头时)。
当然,这也可以:
if (someString.indexOf(something) >= 0) {
}
而且它的神秘性也大大降低了。
有时您还会看到以下内容:
var i = ~~something;
~
像这样两次使用运算符是将字符串转换为32位整数的快速方法。第一个~
执行转换,第二个~
将位反转。当然,如果将运算符应用于无法转换为数字的对象,则会得到NaN
结果。(编辑 -实际上~
是首先应用的是第二个,但是您知道了。)
~
当对整数执行等于时-(x + 1)
。
0
存在false
与非零的传统true
可以追溯到至少70年代的C语言以及可能存在的许多其他当时的系统编程语言。它可能源于硬件的工作方式。许多CPU在某个操作后将其设置为零,并具有相应的分支指令对其进行测试。
| 0
,在这种情况下,仅执行一次操作。
~~
完全相同的方式解释简单的应用程序。
该~
是按位NOT运算符,~x
是大致相同的-(x+1)
。有点容易理解。所以:
~2; // -(2+1) ==> -3
考虑一下-(x+1)
。-1
可以执行该操作以生成一个0
。
换句话说,~
与一定范围的数字值一起使用时,只会为输入值生成伪造(强制到false
from 0
)-1
值,否则将生成任何其他真实值。
众所周知,-1
通常称为哨兵值。它用于返回许多功能>= 0
的值的成功和-1
对失败的 C语言编写。indexOf()
JavaScript 中返回值的规则相同。
通常用这种方法检查另一个字符串中是否存在子字符串
var a = "Hello Baby";
if (a.indexOf("Ba") >= 0) {
// found it
}
if (a.indexOf("Ba") != -1) {
// found it
}
if (a.indexOf("aB") < 0) {
// not found
}
if (a.indexOf( "aB" ) == -1) {
// not found
}
但是,~
如下所示更容易实现
var a = "Hello Baby";
~a.indexOf("Ba"); // -7 -> truthy
if (~a.indexOf("Ba")) { // true
// found it
}
~a.indexOf("aB"); // 0 -> falsy
!~a.indexOf("aB"); // true
if (!~a.indexOf( "aB" )) { // true
// not found
}
-(x+1)
如果在if语句中看到它,我将进行第二次查看。代字号准确地告诉我如何补偿Javascript基于0的本质。另外,括号越少越好阅读
if (a.indexOf("Ba") > -1) {// found} //true
字符键入内容,尽管比波浪符示例更长,但比您给出的两个示例要少得多,对于新程序员来说是可以var opinion = !~-1 ? 'more' : 'less'
理解的。
~indexOf(item)
经常出现,并且这里的答案很好,但是也许有些人只需要知道如何使用它并“跳过”理论即可:
if (~list.indexOf(item)) {
// item in list
} else {
// item *not* in list
}
++
,--
因为它们“鼓励过度的技巧”,但以某种方式~
得以幸存(潜伏在阴影中)github.com/airbnb/javascript/issues/540
list.indexOf(item) >= 0
或... > -1
因为javascript是从零开始的,所以从一开始就没有选择解决此问题。此外,仅凭意见(与Airbnb相同),任何在javascript中做有意义的事情的人都知道++
,尽管--
不那么普遍,但可以推断出含义。
++
和--
,因为像原始的方法了一会儿map
,forEach
等我的观点更多的是为什么他们也没考虑~
过棘手的任何时候标准中使用包括增量和减量运算。禁止某些东西使CIS101没有任何意义。
对于那些考虑使用代字号技巧从结果中创建真实值的人来说indexOf
,使用上的includes
方法String
更明确,并且魔术性也较小。
'hello world'.includes('hello') //=> true
'hello world'.includes('kittens') //=> false
请注意,这是ES 2015的新标准方法,因此在旧版浏览器上将无法使用。如果这很重要,请考虑使用String.prototype.includes polyfill。
此功能也可用于使用相同语法的数组:
['apples', 'oranges', 'cherries'].includes('apples') //=> true
['apples', 'oranges', 'cherries'].includes('unicorns') //=> false
如果需要较旧的浏览器支持,则为Array.prototype.includes polyfill。