波浪号在表达式之前会做什么?

2020/10/17 16:21 · javascript ·  · 0评论
var attr = ~'input,textarea'.indexOf( target.tagName.toLowerCase() )
           ? 'value'
           : 'innerHTML'

我在一个答案中看到了它,而我之前从未见过。

这是什么意思?

~按位运算符,它会翻转其操作数中的所有位。

例如,如果您的数字为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()这些返回布尔值。如果您的目标平台支持它,则应首选此方法来测试字符串或数组中是否存在值。

indexOf()表达式前使用它可以有效地为您提供真实/虚假的结果,而不是直接返回的数字索引。

如果返回值为-1,则~-10因为-1是全1的字符串。任何大于或等于零的值都将得出非零的结果。从而,

if (~someString.indexOf(something)) {
}

if当“ someString”中包含“ something”时,将导致代码运行。如果您尝试.indexOf()直接用作布尔值,那将是行不通的,因为有时它返回零(当“ something”在字符串的开头时)。

当然,这也可以:

if (someString.indexOf(something) >= 0) {
}

而且它的神秘性也大大降低了。

有时您还会看到以下内容:

var i = ~~something;

~像这样两次使用运算符是将字符串转换为32位整数的快速方法。第一个~执行转换,第二个~将位反转。当然,如果将运算符应用于无法转换为数字的对象,则会得到NaN结果。编辑-实际上~是首先应用的是第二个,但是您知道了。)

~按位NOT运算符~x是大致相同的-(x+1)有点容易理解。所以:

~2;    // -(2+1) ==> -3

考虑一下-(x+1)-1可以执行该操作以生成一个0

换句话说,~与一定范围的数字值一起使用时,只会为输入值生成伪造(强制到falsefrom 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
}

您不知道JS:类型和语法作者:凯尔·辛普森(Kyle Simpson)

~indexOf(item) 经常出现,并且这里的答案很好,但也许有些人只需要知道如何使用它并“跳过”理论即可:

   if (~list.indexOf(item)) {
     // item in list
   } else {
     // item *not* in list
   }

对于那些考虑使用波浪号技巧结果中创建真实值的人来说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

本文地址:http://javascript.askforanswer.com/bolanghaozaibiaodashizhiqianhuizuoshenme.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!