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

感叹号在JavaScript中的使用

主要有两个方面:

  1. 逻辑非运算符:在JavaScript中,感叹号(!)用作逻辑非运算符,用于对一个布尔值进行取反操作。如果一个值为真,则取反后为假;如果一个值为假,则取反后为真。例如:
代码语言:txt
复制
var x = true;
var y = !x; // y的值为false

var a = false;
var b = !a; // b的值为true

逻辑非运算符常用于条件判断语句中,例如if语句:

代码语言:txt
复制
var age = 18;
if (!age) {
  console.log("未成年");
} else {
  console.log("成年人");
}
  1. 强制类型转换:感叹号(!)也可以用于将其他数据类型转换为布尔值。在JavaScript中,有一个规定,任何值都可以转换为布尔值。对于非布尔值,使用感叹号进行转换时,会将其转换为相应的布尔值。具体规则如下:
  • 对于数字类型,0和NaN会被转换为false,其他数字会被转换为true。
  • 对于字符串类型,空字符串""会被转换为false,其他非空字符串会被转换为true。
  • 对于对象类型,所有对象(包括数组、函数、正则表达式等)会被转换为true。
  • 对于null和undefined,会被转换为false。

例如:

代码语言:txt
复制
var num = 0;
console.log(!num); // 输出true

var str = "";
console.log(!str); // 输出true

var obj = {};
console.log(!obj); // 输出false

var n = null;
console.log(!n); // 输出true

var u = undefined;
console.log(!u); // 输出true

这是感叹号在JavaScript中的使用方式。如果你对JavaScript的其他知识有任何疑问,欢迎继续提问。

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

相关·内容

JavaScript 通过 queueMicrotask() 使用微任务

JavaScript promises 和 Mutation Observer API 都使用微任务队列去运行它们回调函数,但当能够推迟工作直到当前事件循环过程完结时,也是可以执行微任务时机。...入列微任务 就其本身而言,应该使用微任务典型情况,要么只有没有其他办法时候,要么是当创建框架或库时需要使用微任务达成其功能。...简单传入一个 JavaScript 函数,以 queueMicrotask() 方法处理微任务时供其上下文调用即可;取决于当前执行上下文,queueMicrotask() 以定义形式被暴露在 Window...queueMicrotask(() => { /* 微服务中将运行代码 */ }); 微服务函数本身没有参数,也不返回值。 何时使用微服务 本章节,我们来看看微服务特别有用场景。...,通过 if...else 语句其中一个分支(此例为缓存图片地址可用时)中使用一个任务而 promise 包含在 else 子句中,我们面临了操作顺序可能不同局势;比方说,像下面看起来这样

3.1K10
  • 移除Kotlin代码感叹号(!!)

    空安全是Kotlin提供功能之一。它让你思考语言级别的可空性,所以你可以避免Java很常见NullPointerException。...这意味着“你在这里有一个潜在未处理KotlinNullPointerException”。 下面介绍几种方式可以去避免使用!!...① 使用val而不是var Kotlin让你在语言层面思考不可变性。val是只读,var是可变。建议你尽可能多使用只读属性。它们是线程安全,并且函数式编程很好用。...② 使用lateinit 有时候,我们不能使用不可变属性。这在Android很常见。对于这种情况,我们使用Kotlin提供lateinit。 !!...对于原始数据类型,我们可以这样使用委托: private var mNum:Int by Delegates.notNull () ③ 使用let函数 下面是Kotlin代码中常见错误

    1.6K30

    JavaScript原型继承使用存在安全问题

    JavaScript原型很多人都知道也很好用,但是很多人在使用原型继承中导致安全问题却很少人知道,接下来我们就来好好了解一下。...真实开发,我们经常会在代码中使用Property accessors 属性访问器,并且使用用户输入参数去访问某个对象属性。...这看起来可能是一个很稀疏平常操作,但是往往在这个过程我们代码就已经产生了一个很大安全漏洞!!!为什么这样写代码会产生安全问题?...黑客通过原型上添加属性,他们可以解锁更多用户权限,比如网站修改权限,vip权限等等来攻击你网站让你网站承受损失。...代码减少属性访问器使用尽可能使用.方式去访问对象属性或者使用 Map或Set,来代替我们对象检查对象原型链,查看新创建对象原型是否被恶意添加了原本不该有的属性,或者属性被修改检查用户输入

    18811

    JavaScript 轻松处理 this

    作者:Dmitri Pavlutin 翻译:疯狂技术宅 来源:dmitripavlutin 我喜欢 JavaScript 能够更改函数执行上下文(也称为 this)特性。...这个问题是由 this 值不正确引起。 现在,方法 getFullName() ,this 值是全局对象(浏览器环境 window)。...使用情况下,不能使用附加变量 self 或箭头函数来固定 this 值。...这是绑定 this 最有效,最简洁方法。 六. 结论 与对象分离方法对 this 产生了许多误解。你应该意识到这种影响。...,你可以使用 bind() 方法构造函数内部手动绑定类方法。 如果你想跳过编写样板代码,那么新 JavaScript 建议类字段会带来胖箭头方法,该方法会自动将 this 绑定到类实例。

    2.4K20

    如何使用LinkFinderJavaScript文件查找网络节点

    关于LinkFinder LinkFinder是一款功能强大Python脚本,该工具帮助下,广大研究人员可以轻松JavaScript文件中发现和扫描网络节点及其相关参数。...这样一来,渗透测试人员和漏洞猎人将能够快速测试目标网站伤收集新隐藏节点了。...-d --domain 分析整个域时使用,可以切换并枚举所有找到JS文件 -b --burp 当Burp结果文件包含多个JS文件时,可以切换使用 -c --cookies 向请求添加Cookie...-h --help 显示工具帮助信息和退出 工具运行样例 在线上JavaScript文件查找网络节点,并将结果输出到results.html文件: python linkfinder.py...JavaScript文件,搜索以/api/开头网络节点,并将结果存储到results.html文件: python linkfinder.py -i 'Desktop/*.js' -r ^/api/

    40850

    HTML中使用JavaScript

    前言 JavaScript是浏览器内置脚本语言。...当网页嵌入了JavaScript脚本,浏览器加载网页时,就会执行脚本,从而操作浏览器,实现各种动态效果 JavaScript代码嵌入网页方法 1、元素直接嵌入代码 <script type...type属性 标签默认就是JavaScript代码,嵌入javascript脚本时,type属性可以省略 如果type属性值,浏览器不认识,就不会执行其中代码,所以可以标签嵌入任意文本内容,只要加上一个浏览器不认识type属性就行,浏览器不会执行也不会显示它内容,但是这个节点依然存在于DOM之中,可以使用节点text属性读取它内容...后面执行 在这段代码后面加载脚本文件,会等b.ja执行完成后再执行 相关知识点总结 包含在标签内部JavaScript代码,将被从上到下一次解析 无论以哪种方式嵌入代码,只要不存在

    1.4K30

    JavaScript数据结构(链表)

    JavaScript链表是一种数据结构,用于存储和组织一系列元素。它由一系列节点(Node)组成,每个节点包含了两部分:数据域(存储数据)和指针域(指向下一个节点)。...然而,链表缺点是访问链表特定元素时间复杂度较高,需要从头开始遍历链表直到找到目标节点。 ---- 详细看一下列表 JavaScript,可以使用对象来实现链表。...null,要从列表移除第一个元素 head = current.next; } else { while (index++ < position){ // 使用一个用于内部控制和递增index...insert(position, element):向列表特定位置插入一个新项。 remove(element):从列表移除一项。 indexOf(element):返回元素列表索引。...toString():由于列表项使用了Node类,就需要重写继承自JavaScript对象默认toString方法,让其只输出元素值。

    17910

    setImmediate() vs setTimeout() JavaScript 区别

    setImmediate() vs setTimeout() JavaScript 区别 JavaScript ,setImmediate() 和 setTimeout() 都用于调度任务...JavaScript 异步特性 JavaScript 以其非阻塞、异步行为而闻名,尤其是 Node.js 环境。...Node.js 异步特性核心是事件循环。 Node.js ,事件循环处理不同阶段,每个阶段负责执行某些类型回调。它帮助管理非阻塞任务,确保函数可以异步执行。在这些阶段,有不同队列。...setTimeout() 0 延迟 当你使用 setTimeout() 并设置延迟为 0 时,你实际上是告诉 Node.js 在当前操作完成后尽快运行回调。...理解这些差异有助于你精确控制代码运行时间,这在高性能应用程序至关重要,因为时间和效率非常重要。 参考 setImmediate() vs setTimeout() in JavaScript

    10310

    JavaScript数据结构(队列)

    队列(Queue)是一种具有先进先出(FIFO, First-In-First-Out)特性数据结构,它可以用于计算机程序管理和存储元素。...JavaScript,可以使用数组(Array)或链表(Linked List)等数据结构来实现队列。 其实可以用窗口排队打饭为案例,先来先排队打饭。...队列,新元素被添加到队列末尾,并等待其他已存在元素被处理后才能被移除。当删除元素时,总是从队首开始移除元素。...因此可以对它们使用默认出列操作: ---- 总结 JavaScript,队列(Queue)是一种具有先进先出(FIFO, First-In-First-Out)特性数据结构,它可以用于计算机程序管理和存储元素...队列主要有两个基本操作: 入队(enqueue)和出队(dequeue),JavaScript可以使用数组(Array)或链表(Linked List)等数据结构来实现队列。

    27530

    JavaScriptPromise使用详解

    ,一般就一到两级,但是某些情况下,回调嵌套很多时,代码就会非常繁琐,会给我们编程带来很多麻烦,这种情况俗称——地狱回调。...那么如何解决地狱回调,保持我们代码简短,这时Promise就出场了,Promise对象可以理解为一次执行异步操作,使用Promise对象之后可以使用一种链式调用方式来组织代码;让代码更加直观。...Resolve函数作用是,将Promise对象状态从“未完成”变为“成功”(即从 pending 变为 resolved),异步操作成功时调用,并将异步操作结果,作为参数传递出去; Reject...函数作用是,将Promise对象状态从“未完成”变为“失败”(即从 pending 变为 rejected),异步操作失败时调用,并将异步操作报出错误,作为参数传递出去。...调用用then方法接收值,再调用say方法,传入execute方法返回值,再调用then方法接收,最后alert。 暂时就写到这,后期更新。

    1.3K1513

    适配器JavaScript体现

    适配器JavaScript体现 适配器设计模式JavaScript中非常有用,处理跨浏览器兼容问题、整合多个第三方SDK调用,都可以看到它身影。...而适配器其实在JavaScript应该是比较常见一种了。 维基百科,关于适配器模式定义为: 软件工程,适配器模式是一种软件设计模式,允许从另一个接口使用现有类接口。...代码体现 而转向到编程,我个人是这样理解: 将那些你不愿意看见脏代码藏起来,你就可以说这是一个适配器 接入多个第三方SDK 举个日常开发例子,我们在做一个微信公众号开发,里边用到了微信支付模块...func(...args, (err, data) => { if (err) reject(err) resolve(data) }) }) } 然后使用前进行对应转换就可以用我们预期方式来执行代码...,官方已经实现了类似这样工具函数:util.promisify 小结 个人观点:所有的设计模式都不是凭空想象出来,肯定是开发过程,总结提炼出一些高效方法,这也就意味着,可能你并不需要在刚开始时候就去生啃这些各种命名高大上设计模式

    1.4K10

    JavaScript数据结构(队列)

    队列(Queue)是一种具有先进先出(FIFO, First-In-First-Out)特性数据结构,它可以用于计算机程序管理和存储元素。...JavaScript,可以使用数组(Array)或链表(Linked List)等数据结构来实现队列。其实可以用窗口排队打饭为案例,先来先排队打饭。...队列,新元素被添加到队列末尾,并等待其他已存在元素被处理后才能被移除。当删除元素时,总是从队首开始移除元素。...因此可以对它们使用默认出列操作:图片总结在JavaScript,队列(Queue)是一种具有先进先出(FIFO, First-In-First-Out)特性数据结构,它可以用于计算机程序管理和存储元素...队列主要有两个基本操作: 入队(enqueue)和出队(dequeue),JavaScript可以使用数组(Array)或链表(Linked List)等数据结构来实现队列。

    28420

    JavaScript this 使用技巧总结

    函数执行 纯粹函数调用 这是最普通函数使用方法了: ?...可以看到直接用 this 仍然是 Window;因为 foo2 this 是指向 obj,我们可以先用一个变量 _this 来储存,然后回调函数中使用 _this,就可以指向当前这个对象了;...回调函数严格模式下却表现出不同: ?.../questions/21957030/why-is-window-still-defined-in-this-strict-mode-code 作为一个构造函数使用 js ,为了实现类,我们需要定义一些构造函数...箭头函数 ES6 新规范,加入了箭头函数,它和普通函数最不一样一点就是 this 指向了,还记得我们使用闭包来解决 this 指向问题吗,如果用上了箭头函数就可以更完美的解决了: ?

    87130

    javascript对于this指向再次理解

    (this.length) } fn();   函数调用是最外层发生,那么由于全局对象this存在,那么函数体内this指向就是window对象。...浏览器环境下,全局变量和window对象属性是等价,所以定义了length全局变量就相当于向window对象添加了一个length属性。...function函数体内有一个很神奇对象arguments这个对象是由调用该函数时所传实参决定,而不是由定义函数时由形参决定。...这一点也是javascript语言广为诟病一点,无法依据定义函数形参个数来实现方法重载,只能靠argumengslength属性来实现。...所以在上面例子,fn 和 3这两个变量都挂载arguments对象下面,还由于arguments是一个类数组对象所以它有length属性,也可以像使用数组一样来使用arguemnts。

    1.3K20

    JavaScript数据结构(链表)

    JavaScript链表是一种数据结构,用于存储和组织一系列元素。它由一系列节点(Node)组成,每个节点包含了两部分:数据域(存储数据)和指针域(指向下一个节点)。...然而,大多数语言中这种数据结构有一个缺点:数组大小是固定,从数组起点或中间插入或移除项成本很高,因为需要移动元素。链表存储有序元素集合,但不同于数组,链表元素在内存并不是连续放置。...然而,链表缺点是访问链表特定元素时间复杂度较高,需要从头开始遍历链表直到找到目标节点。---详细看一下列表JavaScript,可以使用对象来实现链表。...remove(element):从列表移除一项。indexOf(element):返回元素列表索引。如果列表没有该元素则返回-1。...与数组length属性类似。toString():由于列表项使用了Node类,就需要重写继承自JavaScript对象默认toString方法,让其只输出元素值。

    47120

    .NET Core 运行 JavaScript

    Core 运行 JavaScript 呢,答案是使用 NodeServices。...关于为何有 .NET Core 执行 JavaScript 这种需求,比较特殊,举个栗子:当你做模拟登录时,目标网站可能采用一些加密算法来计算特殊值,如果你要完全模拟,那么除了用C#翻译这个算法还有个办法就是直接将这段加密算法...三.使用 NodeServices NodeServices 开源地址为:https://github.com/aspnet/JavaScriptServices Nuget 发布包名为:Microsoft.AspNetCore.NodeServices...,然后介绍如何在应用程序执行一些简单JavaScript 并捕获输出。...首先,我们将首先创建一个包含返回问候消息 NodeJs module 简单JavaScript文件,保存在 scripts/greeter.js文件: // greeter.js module.exports

    3.9K20
    领券