首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js中的双感叹号

在JavaScript中,双感叹号(!!)是一种常用的类型转换技巧,主要用于将任意值转换为布尔类型(truefalse)。以下是对双感叹号的详细解释:

基本概念

  1. 单个感叹号(!):这是JavaScript中的逻辑非运算符,用于对其后的操作数进行逻辑否定。如果操作数为真值(truthy),则结果为false;如果操作数为假值(falsy),则结果为true
  2. 双感叹号(!!):通过连续使用两个逻辑非运算符,可以实现将任意值转换为布尔类型的效果。第一个感叹号将值转换为相反的布尔值,第二个感叹号再次取反,从而得到原始值的布尔表示。

优势

  • 简洁性:使用双感叹号可以非常简洁地将任意值转换为布尔类型,而无需使用显式的Boolean()函数。
  • 明确性:在代码中使用双感叹号可以明确表示开发者希望将某个值转换为布尔类型,从而提高代码的可读性。

应用场景

  • 条件判断:在需要明确判断某个值是否为真或假的场景中,可以使用双感叹号进行转换。
  • 默认值设置:当需要根据某个值是否为真来设置默认值时,也可以使用双感叹号。

示例代码

代码语言:txt
复制
let value1 = "Hello";
let bool1 = !!value1; // true

let value2 = 0;
let bool2 = !!value2; // false

let value3 = null;
let bool3 = !!value3; // false

let value4 = undefined;
let bool4 = !!value4; // false

let value5 = {};
let bool5 = !!value5; // true

注意事项

  • 双感叹号只是将值转换为布尔类型,并不会改变原始值本身。
  • 在使用双感叹号时,需要确保理解其背后的逻辑,以避免出现意外的结果。

总之,双感叹号是JavaScript中一种简洁且实用的类型转换技巧,可以帮助开发者更高效地处理布尔值相关的操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

移除Kotlin代码中的感叹号(!!)

空安全是Kotlin提供的功能之一。它让你思考语言级别的可空性,所以你可以避免在Java中很常见的NullPointerException。...这意味着“你在这里有一个潜在的未处理的KotlinNullPointerException”。 下面介绍几种方式可以去避免使用!!...val是只读的,var是可变的。建议你尽可能多的使用只读属性。它们是线程安全的,并且在函数式编程中很好用。 ② 使用lateinit 有时候,我们不能使用不可变属性。这在Android中很常见。...对于这种情况,我们使用Kotlin提供的lateinit。 !!的写法 private var mAdapter: RecyclerAdapter?...let{uploadPhoto(it)} } ④ 创建全局函数来处理更复杂的内容 let是一个简单的空检查的替代品,但是会有更复杂的情况。如: if(name!=null&&address!

1.6K30
  • C# 中感叹号(!) 作用盘点

    = 与等号共同组成关系运算符,检查两个操作数的值是否相等,如:A!=B 2.逻辑运算符 ! 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。...a; 3.null 容忍操作符(null-forgiving operator) 来自于 C#8 的新特性,比较冷门,国内的翻译 C#8 的文章基本都没有提到。它是一个非常有用的特性。...(null-forgiving) operator (C# reference) 它的主要作用就是告诉编译器,变量不可能为 null,这对于有代码洁癖的人来说非常有用。 ?...上面的代码,json["name"] 返回的是可空引用类型 JToken? 所以一般需要做是否为空的判断,不然调用 Value() 方法会引起异常。...但是在上图的代码中,是不可能为空的,所以要去掉这个波浪线,要么写个 if 判断来取消,要么就使用 ! ? 但是注意这个不要乱用,只有确认一定不会为空的时候才能使用

    1.7K10

    Eclipse中Maven项目出现红色感叹号问题

    在Eclipse环境下,有时我们会遇到Maven项目出现红色感叹号的情形,而一旦项目出现感叹号,Eclipse便无法帮我们进行自动编译等工作,尽管有时候不会影响运行,但每次只能手动启动Maven重新编译...,非常不便,另外眼前总是闪烁着大红色的惊叹号,看着也是非常的不舒服。...代码出错的时候会显示一个红叉,而出现红色感叹号的时候,多半是由于类路径依赖出了问题。...如果 Build Path 中没有问题,或者解决完之后红色惊叹号并没有消除,就要通过 Problems 视图查看一下了。...此类问题多半是在下载JAR包的时候,由于网络问题下载的JAR包不完整导致的,根据路径找到相关JAR包删除重新下载即可。

    1.4K20

    Python中的双端队列

    前言 本文主要介绍Python中的双端队列deque,具体会介绍: 什么是双端列表? Python列表与双端列表 双端列表的使用 a 什么是双端队列?...b 列表与双端队列 双端队列支持线程安全,在双端队列的任何一端执行添加和删除操作,它们的内存效率几乎相同(时间复杂度为O(1))。...列表用于随机访问和定长数据的操作,包括切片,而双端队列适用于在两端压入或弹出元素,索引的效率可能低于列表,同时也不支持切片。 c 双端队列的使用 ?...▲deque队列中的函数 extendleft()方法,他是把列表中的元素进行迭代,先取出第一个元素,然后放在左边,然后再去取出下一个,重复执行,就得到了最终的结果。...,初始化deque的时候可以给他传一个参数maxlen,如果deque中的元素超过maxlen的值,那么就会从deque中的一边去删除元素,也就是deque始终保持maxlen最大长度的元素,如果超过了就会自动把以前的元素弹出

    2K20

    js中settimeout()的用法详解_js中setattribute

    大家好,又见面了,我是你们的朋友全栈君。 setTimeout与setTimeInterval均为window的函数,使用中顶层window一般都会省去,这两个函数经常稍不留神就使用错了。...setTimeout内的函数先不执行,隔一段时间后再执行,函数后面的数字是隔的时间,单位是毫秒(千分之一秒) 比如: setTimeout(‘alert(“hello world!”)’..., 400); setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式,直到clearInterval()被调用或窗口被关闭。 比如: Stop interval setInterval动作的作用是在播放动画的时...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    15K20

    js中find的用法_js中find函数

    今天我们要说的是结合ES6新特性谈一下js里面的一个很好用的方法-find() 现在的前端和过去的不一样,过去的前端只要会画页面就行了,但是现在仅仅会画页面已经远远不够了,现在前端还需要会处理数据,而且还要会将数据分析分类处理...下面我们讲怎么用前端处理这块的逻辑 首先我们拿到了所有的数据这里我直接放到一个测试用的js里面存放, 要实现之前说的效果,就需要使用我们今天的主角find()方法。 find()是用来做什么的呢?...find()方法返回数组中符合测试函数条件的第一个元素。否则返回undefined 在本文章需要注意的几个点: ①、第一个元素 ②、测试函数 那么如何使用呢?.../find_testcodes.js" type="text/javascript" charset="utf-8"> js/jquery-1.11.2....min.js" type="text/javascript" charset="utf-8">

    11.7K30

    深度学习中的双下降现象

    Preetum Nakkiran,Gal Kaplun,Yamini Bansal,Tristan Yang,Boaz Barak,Ilya Sutskever 编译:ronghuaiyang 导读 深度学习中的双下降现象...我们展示了 CNN,ResNet 以及 transformers 中的双下降现象,随着模型的尺寸,数据集的大小以及训练时间的增加,performance 先提升,然后变差,然后再次提升。...,都表现出之前观察到的双下降现象。...传统统计学家认为“模型越大越糟”的传统观点,以及“模型越大越好”的现代机器学习范式,都没有得到支持。我们发现双下降也发生在训练过程中。...模型的双下降现象会导致对更多数据的训练效果越差。在上面的图中,测试误差的峰值出现在插值阈值附近,此时模型刚好足够大到能拟合训练集。

    45420

    深度学习中的双下降现象

    Preetum Nakkiran,Gal Kaplun,Yamini Bansal,Tristan Yang,Boaz Barak,Ilya Sutskever 编译:ronghuaiyang 导读 深度学习中的双下降现象...我们展示了 CNN,ResNet 以及 transformers 中的双下降现象,随着模型的尺寸,数据集的大小以及训练时间的增加,performance 先提升,然后变差,然后再次提升。...,都表现出之前观察到的双下降现象。...传统统计学家认为“模型越大越糟”的传统观点,以及“模型越大越好”的现代机器学习范式,都没有得到支持。我们发现双下降也发生在训练过程中。...模型的双下降现象会导致对更多数据的训练效果越差。在上面的图中,测试误差的峰值出现在插值阈值附近,此时模型刚好足够大到能拟合训练集。

    1.7K20

    js中的Hook

    简单理解:   hook(钩子)就是: 把将要执行的的函数或者一系列动作注册到一个统一的接口下面, 当应用程序调用此接口(即hook)时,就等于调用了这一系列动作。...JS中的钩子(hook)的例子 JS中的钩子(hook)的例子1: 例如我们在向后台进行ajax请求的时候,后台经常会返回我们一些常见的错误码,如:001代表用户不存在,002代表用户密码输入错误。...这个时候我们要将错误友好的提示给用户。这个时候我们该怎样实现呢?...一般的写法可能是: $.ajax(option,function(result){ var errCode = result.errCode ;//错误码 if(errCode){...switch case来实现,但是这个两种写法都无法避免一个问题就是如果我的错误码特别多,那得写多少个if else和case 啊?

    6.5K31

    Js中的this总结

    这段代码可以在不同的上下文对象( me 和 you )中重复使用函数 identify() 和 speak() ,如果我们不适用this的话,那就需要identity和speak显示传入一个上下文对象,...没关系,我们只要知道在 ECMAScript 规范中还有一种只存在于规范中的类型,它们的作用是用来描述语言底层行为逻辑。...它们是为了更好地描述语言的底层行为逻辑才存在的,但并不存在于实际的 js 代码中。...可以按照下面的顺序来进行判断:函数是否在 new 中调用( new 绑定)?如果是的话 this 绑定的是新创建的对象。...如果是的话, this 绑定的是指定的对象。var bar = foo.call(obj2)函数是否在某个上下文对象中调用(隐式绑定)?如果是的话, this 绑定的是那个上下文对象。

    2.4K30

    Js中的堆栈

    Js中的堆栈 堆heap是动态分配的内存,大小不定也不会自动释放,栈stack为自动分配的内存空间,在代码执行过程中自动释放。...栈区 在栈内存中提供一个供Js代码执行的环境,关于作用域以及函数的调用都是栈内存中执行的。...Js中基本数据类型String、Number、Boolean、Null、Undefined、Symbol,占用空间小且大小固定,值直接保存在栈内存中,是按值访问,对于Object引用类型,其指针放置于栈内存中...,堆内存中存储实际对象,在栈内存中存储对象的指针,对于对象的访问是按引用访问的,在堆区的内存不会随着程序的运行而自动释放,这就需要实现垃圾回收机制GC,需要注意的是在Js中没有类似于C中的free()函数去手动释放内存...,从而决定是否需要进行内存回收,在Js中主要有引用计数与标记清除两种垃圾回收算法。

    3.1K30

    Js中的变量

    Js中的变量:  1:如果在var中没有初始化变量的值,则默认为undefined.  2:可以不用var来申明一个变量,但是在过程级中申明一个变量时,就必须用var.   ...var currentCount  5: 在 JScript 中 null 和 undefined 的主要区别是 null 的操作象数字 0,    而 undefined 的操作象特殊值NaN (不是一个数字...请注意,比较大小时字符串自动转换为相等的数字,但加法(连接)运算时保留为字符串。...js中的数据类型  1:Jscript 有三种主要数据类型、两种复合数据类型和两种特殊数据类型    主要(基本)数据类型是: 字符串 数值 布尔    复合(引用)数据类型是: 对象 数组    特殊数据类型是...: Null Undefined  2:测试是否已经声明变量 x :    if (typeof(x) == "undefined")      // 作某些操作 js中的内置对象  1:Jscript

    12.9K60

    js中的数据

    数据、内存、变量 数据:以二进制形式存储在内存中,代表一定信息的数字。 内存:内存条通电后产生的存储空间。内存又分为栈内存和堆内存。栈内存中存放的是全局变量或局部变量。而堆内存中存放的是对象。...,而obj1保存了obj内容,只是obj中的内容是{ name: 'clying' }的地址值。...而存在与fun函数内部的o变量,变成了垃圾对象,根本无法使用。 比较 可能会有一些疑惑:变量与函数中,修改了obj的值,为什么在引用变量与函数中,obj的值没有被修改?...首先需要明白,js函数传递变量参数时,是「值传递」(个人理解:传递的是变量的值)。执行函数fun,只是将obj的地址值赋值给o变量。...变量与函数中,o是直接被修改,修改的直接是obj内部age的属性变量。 引用变量与函数中, 「o存放的是obj的值」,即:o内部是{ name: 'dengdeng', age: 22 }的地址值。

    5.5K20

    js中的对象

    js中的对象 在编程语言中,提到对象,一般都含有一个隐藏的上下文面向对象编程。 面向对象编程(Object Oriented Programming,缩写为 OOP)是目前主流的编程范式。..., cedf:function(){console.info("cdef")}, "arr":[1,2,3], o:{"name":"jake"} } “在js中,对象是属性的无序集合...1.2 集合 集合是说 对象中可以有很多个属性。属性之间用逗号分隔。 1.3 无序 属性与属性之间,没有先后顺序之分。 对比一下,数组的元素之间有序的。...2. js中对象的分类 众观整个js中的对象,可以分成三类: 内置对象 宿主对象 自定义的对象 2.1 内置对象 “由ECMA实现、不依赖于宿主环境的对象,这些对象在js程序执行之前就已经存在了”。...js有两个运行的环境: (1) 浏览器。我们在.html文件中加入js代码,再通过浏览器来打开,这里浏览器就是javascript的运行环境。 在浏览器端的js而言,宿主对象就是浏览器对象。

    6.9K50

    JS 中的日期

    有格式的时间 let myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970...000, 1626244862000 日期转换成时间格式 可以有参数,如果没有参数获取的是当前的时间对象 参数可以是时间字符串或者是时间戳,则转换对应时间的时间对象,要注意格式 new Date('2021...Date(1626244866842); //正确 , Wed Jul 14 2021 14:41:06 GMT+0800 (中国标准时间) new Date('2021-07-14'); // 错误的,...这种格式是不支持的, new Date("2021-07-14".replace(/-/g, "/")); //Sat Apr 16 2011 00:00:00 GMT+0800 (中国标准时间)...计算 如果直接使用`new Date()`进行计算,默认会转换成从1970.1.1时开始的毫秒数. new Date('2021,07,13') - 1000 ; 1626105600000 - 1000

    23420
    领券