`
linweibin
  • 浏览: 32460 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

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

 
阅读更多

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

         

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。

 

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中取,而非其它值,为后续判断提供便利。

9
2
分享到:
评论
18 楼 ToBeImmortal 2013-10-19  
ADT的“封装”
17 楼 linweibin 2013-02-19  
JavaSam 写道
嗯,不错!
像js这种本来就很难解释清楚的东西,lz已经很厉害了!

我是js菜鸟
16 楼 JavaSam 2013-02-19  
嗯,不错!
像js这种本来就很难解释清楚的东西,lz已经很厉害了!
15 楼 sanshizi 2013-02-19  
受益匪浅: 这样做的目的就是保证xxxx的值都只能在true/false中取  
14 楼 rox 2013-02-19  
这个在犀牛书里面有提到过,是一种类型转换的小技巧。
因为javascript是弱类型的,例如
0==null是true,但它们都不是真正的bool类型。
!!0  (false)
!!null (false)
!!'' (false)
!!'false' (true)
这种用法是特定需要的时候,比如一定要求是bool类型时才用,
或者用强类型语言的概念来规范代码,也是不错的。
13 楼 linweibin 2013-02-19  
white_crucifix 写道
linweibin 写道
white_crucifix 写道
我试了一下,怎么结果和楼主说的不一样啊
var o={flag:1};  
var test=!!o.flag;//等效于var test=o.flag||false;

我把flag的值改成1


var test=!!o.flag;  值为true
var test=o.flag||false;  值为1
不等效啊……囧



我只是举了flag是 true时的例子才说的等效,你改变条件了,还在那儿等效啊?


我是看到这句“如果明确设置了变量的值(非null/undifined/0/""等值),结果就会根据变量的实际值来返回,如果没有设置,结果就会返回false。”在回过去试验的。
你说的没什么错,就是可能有些地方造成了歧义。开始看标题以为双叹号有什么特殊的功能,心想怎么从来没学到过,震惊了一下。其实就是两个叹号功能的重叠。
后面这句总结的比较到位“这样做的目的就是保证xxxx的值都只能在true/false中取”。
^_^

恩恩,谢谢支出不足,呵呵,本想着很少使用两个叹号,今天看一个框架的时候看到了,就总结了一下,感觉双叹号确实带来了很大的方便,让逻辑更清楚
12 楼 linweibin 2013-02-19  
leaow567 写道
第一个感叹号是把其它值转换为布尔值,第二个感叹号是取反,这是js基础吧

对啊,我说这种用法很少用,但是在很多js开源框架中用的很多,所以写了篇博文记录一下,没有特殊的用意
11 楼 white_crucifix 2013-02-18  
linweibin 写道
white_crucifix 写道
我试了一下,怎么结果和楼主说的不一样啊
var o={flag:1};  
var test=!!o.flag;//等效于var test=o.flag||false;

我把flag的值改成1


var test=!!o.flag;  值为true
var test=o.flag||false;  值为1
不等效啊……囧



我只是举了flag是 true时的例子才说的等效,你改变条件了,还在那儿等效啊?


我是看到这句“如果明确设置了变量的值(非null/undifined/0/""等值),结果就会根据变量的实际值来返回,如果没有设置,结果就会返回false。”在回过去试验的。
你说的没什么错,就是可能有些地方造成了歧义。开始看标题以为双叹号有什么特殊的功能,心想怎么从来没学到过,震惊了一下。其实就是两个叹号功能的重叠。
后面这句总结的比较到位“这样做的目的就是保证xxxx的值都只能在true/false中取”。
^_^
10 楼 leaow567 2013-02-18  
第一个感叹号是把其它值转换为布尔值,第二个感叹号是取反,这是js基础吧
9 楼 linweibin 2013-02-18  
white_crucifix 写道
我试了一下,怎么结果和楼主说的不一样啊
var o={flag:1};  
var test=!!o.flag;//等效于var test=o.flag||false;

我把flag的值改成1


var test=!!o.flag;  值为true
var test=o.flag||false;  值为1
不等效啊……囧



我只是举了flag是 true时的例子才说的等效,你改变条件了,还在那儿等效啊?
8 楼 linweibin 2013-02-18  
eyei 写道
什么玩意儿啊!与其说两个叹号的用法不如说一个的用法!LZ真逗

你可能没有理解,两个叹号使计算结果限定在true/false,用一个叹号对于null和undifined的处理不但不好理解,而且效率很低。两个叹号的用法,只是说他的一种用法而已,条条大路通罗马。不用说一个叹号,不用叹号用Boolean都可以解决,不要太拘泥于自己的知识
7 楼 eyei 2013-02-18  
什么玩意儿啊!与其说两个叹号的用法不如说一个的用法!LZ真逗
6 楼 white_crucifix 2013-02-18  
我试了一下,怎么结果和楼主说的不一样啊
var o={flag:1};  
var test=!!o.flag;//等效于var test=o.flag||false;

我把flag的值改成1


var test=!!o.flag;  值为true
var test=o.flag||false;  值为1
不等效啊……囧


5 楼 laoji 2013-02-18  
linweibin 写道
jiangwenxian 写道
负负得正,是这个原理不?

呵呵,可以这样理解啊


good
4 楼 linweibin 2013-02-18  
jiangwenxian 写道
负负得正,是这个原理不?

呵呵,可以这样理解啊
3 楼 linweibin 2013-02-18  
lazy_ 写道
写得好!null/undifined/0/""再加上一个NaN

嗯,等等嘛
2 楼 lazy_ 2013-02-18  
写得好!null/undifined/0/""再加上一个NaN
1 楼 jiangwenxian 2013-02-18  
负负得正,是这个原理不?

相关推荐

    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