`

js中两个感叹号的原理与用法分析

阅读更多
       在javascript中有时会看到有两个!!的用法。我很少用到(本人在js方面是菜鸟),但是在一些开源框架(如jquery)中经常看到。所以参考网上的相关资料总结了一下它的用法。

         

Js代码 复制代码 收藏代码
  1. var foo;   
  2. alert(!foo);//undifined情况下,一个感叹号返回的是true;   
  3. alert(!goo);//null情况下,一个感叹号返回的也是true;   
  4. var o={flag:true};   
  5. var test=!!o.flag;//等效于var test=o.flag||false;   
  6. alert(test);  
var foo;
alert(!foo);//undifined情况下,一个感叹号返回的是true;
alert(!goo);//null情况下,一个感叹号返回的也是true;
var o={flag:true};
var test=!!o.flag;//等效于var test=o.flag||false;
alert(test);

          这段例子,演示了在undifined和null时,用一个感叹号返回的都是true,用两个感叹号返回的就是false,所以两个感叹号的作用就在于,如果明确设置了变量的值(非null/undifined/0/""等值),结果就会根据变量的实际值来返回,如果没有设置,结果就会返回false。

 

Js代码 复制代码 收藏代码
  1. grep: function( elems, callback, inv ) {   
  2.         var ret = [], retVal;   
  3.         inv = !!inv;   
  4.   
  5.         // Go through the array, only saving the items   
  6.         // that pass the validator function   
  7.         for ( var i = 0, length = elems.length; i < length; i++ ) {   
  8.             retVal = !!callback( elems[ i ], i );   
  9.             if ( inv !== retVal ) {   
  10.                 ret.push( elems[ i ] );   
  11.             }   
  12.         }   
  13.   
  14.         return ret;   
  15.     }  
grep: function( elems, callback, inv ) {
        var ret = [], retVal;
        inv = !!inv;

        // Go through the array, only saving the items
        // that pass the validator function
        for ( var i = 0, length = elems.length; i < length; i++ ) {
            retVal = !!callback( elems[ i ], i );
            if ( inv !== retVal ) {
                ret.push( elems[ i ] );
            }
        }

        return ret;
    }

     这是jquery中一个比较经典的例子,

     在使用grep函数的时候,如果给出了第三个参数且非null/undefined/0""/等值,则inv为     true,否则为false。这样做的目的就是保证inv和retVal的值都只能在true/false中取,而非其它值,为后续判断提供便利。

分享到:
评论

相关推荐

    JavaScript中两个感叹号的作用说明

    两个感叹号的组合实际上是两次逻辑非操作的连续应用。第一次!操作会将非布尔值转换为布尔值,第二次!操作则会反转这个布尔值,从而再次得到一个布尔值。这种机制特别有用,因为它可以确保结果始终是true或false。 ...

    javascript中2个感叹号的用法实例详解

    而两个感叹号(!!)则是连续两次应用这个逻辑非操作,从而实现对非布尔值的强制类型转换。 1. **应用场景:判断对象是否存在** 在JavaScript中,当尝试访问一个未定义的对象时,通常会得到`undefined`或`null`。...

    探讨js中的双感叹号判断

    但是,当你连续使用两个感叹号(!!),它的作用就变成了“强制类型转换”——将任何类型的值转化为布尔值。这个过程遵循以下规则: 1. 如果值是 `null` 或 `undefined`,它们会被转换为 `false`。 2. 如果值是布尔...

    js中split函数的使用方法说明.docx

    在本文中,我们将深入探讨`split()`函数的使用方法,包括其基本语法、参数、常见用例以及与之相关的其他字符串操作。 ### `split()`函数的基本语法 `string.split(separator[, limit])` - `separator`: 必需参数...

    JS匿名函数和匿名自执行函数概念与用法分析

    在JavaScript编程中,匿名函数和匿名自执行函数是两个非常重要的概念和工具,它们在实现特定功能和组织代码结构中扮演着关键的角色。接下来,我们将详细分析这两者的概念、功能、应用场景及相关使用技巧。 首先,...

    中英文断句的实现程序

    在自然语言处理(NLP)...总的来说,这个项目旨在构建一个高效的中英文断句工具,通过结合规则和机器学习方法,能够准确地在混合文本中识别并分离出独立的句子,这对于后续的文本分析和处理任务具有重要的支持作用。

    75个JavaScript面试题集锦

    15. **比较相似对象**:由于JavaScript的引用比较,即使两个对象看起来相同,它们也不会被认为是相等的,除非它们是同一个对象的引用。 16. **!! 运算符**:双感叹号用于将任何值转换为布尔值,通常用于非零数字、...

    js中setTimeout()与clearTimeout()用法实例浅析

    下面将详细说明这两个函数的功能和使用方法,并通过实例来具体分析其用法。 首先,`setTimeout()` 函数的基本用法如下: ```javascript var timeoutID = setTimeout(func, delay[, param1, param2, ...]); ``` 或者...

    node.js中的buffer.copy方法使用说明

    在这个示例中,我们首先创建了两个长度为26的Buffer实例buf1和buf2,并分别用ASCII字符'a'到'z'和感叹号'!'填充。接着,我们使用buf1.copy方法将buf1中索引从16到19的数据复制到buf2中从索引8开始的位置。最终,我们...

    深入浅析JavaScript函数前面的加号和叹号

    然而,当加号(+)或类似的一元操作符(如感叹号、位非操作符~)放在函数前面时,它告诉解析器这是一个表达式,而非声明。接着,后面的`()`立即执行这个函数表达式,这就是所谓的立即执行函数(IIFE,Immediately ...

    js中!和!!的区别与用法

    在JavaScript编程语言中,逻辑非操作符(!)和双逻辑非操作符(!!)是两个非常有用的工具,它们在处理逻辑判断和类型转换时有着不同的应用和区别。...熟练使用这两个操作符可以帮助我们编写更简洁高效的代码。

    30 个 JavaScript 妙语.docx

    18. **使用`map()`和`filter()`进行数据转换和过滤**:这两个数组方法可以联合使用,对数组进行操作,例如筛选满足条件的元素并转换它们。 19. **使用`reduce()`进行数组求和**:`reduce()`可以用来对数组的所有...

    javascript技巧(珍藏版)

    - 通过两个感叹号`!!`来实现,非零数值和非空字符串都会被转换为`true`,如 `var bool = !!myVar;` 4. **将值转换为数组**: - 可以通过简单的数组字面量来实现,如 `var array = [myVar];` 此外,在使用`new ...

    JavaScript中双符号的运算详解

    本文将深入探讨两种常见的双符号运算:双波浪号(`~~`)和双感叹号(`!!`),并提供相关的示例代码以帮助理解它们的用法。 ### 一、双波浪号(`~~`) 双波浪号(`~~`)运算符是一种快速的整数取整方法,通常用于...

    谈谈JS中的!!

    操作符的使用方法非常简单,它是在变量或表达式前加上两个感叹号。第一个感叹号会将变量或表达式转换为它的逻辑非(即falsy值变为truthy,truthy值变为falsy),而第二个感叹号则再次将结果逻辑非,从而得到一个明确...

    JavaScript最新2021年面试题,高级面试题及附答案解析.md

    - **隐式类型转换**:当两个操作数的数据类型不同时,JavaScript 会在执行运算前自动进行类型转换。例如: - `x + ""` 相当于 `String(x)`。 - `+x` 相当于 `Number(x)`。 - `x - 0` 同样相当于 `Number(x)`。 -...

    JQ 删除字符串最后一个或几个字符的方法.rar

    然而,由于jQuery对象可以无缝地与JavaScript原生对象转换,因此我们可以在jQuery对象上使用JavaScript的字符串方法。 1. 删除字符串最后一个字符: 要删除字符串的最后一个字符,我们可以使用JavaScript的`...

    js实现正则匹配中文标点符号的方法

    为了方便读者进行正则表达式的测试与生成,文档中推荐了两个在线工具: 1. **正则表达式在线测试工具**:允许用户输入正则表达式和待测试字符串,然后执行匹配,验证正则表达式的正确性和效果。 2. **正则表达式...

Global site tag (gtag.js) - Google Analytics