js双感叹号判断

  今天看qunit源代码,发现一段很奇怪的代码,虽然能领会他的意思,但是不明白双感叹号起到的作用。

function id( name ) {
    return !!( typeof document !== "undefined" && document && document.getElementById ) &&
        document.getElementById( name );
}

  然后去网上查了些资料,他相当于三元运算符,返回boolean值。

var ret = !!document.getElementById

等价于:

var ret = document.getElementById ? true : false;

  

  当值是非空字符串和非零数字返回true,当值是空字符串、0或者null返回false。

var a = " "; alert(!!a);   //true
var a = "s"; alert(!!a);   //true
var a = true; alert(!!a);   //true
var a = 1; alert(!!a);   //true
var a = -1; alert(!!a);   //true
var a = -2; alert(!!a);   //true
 
var a = 0; alert(!!a);   //false
var a = ""; alert(!!a);   //false
var a = false; alert(!!a);   //false
var a = null; alert(!!a);   //false

转载于:https://www.cnblogs.com/softlover/archive/2012/10/26/2741616.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
<think>根据用户的问题,我们关注JavaScript中的感叹号(!!)的含义。引用[2]和引用[4]明确指出:感叹号(!!)用于将任意类型的值转换为对应的布尔值。具体原理:-第一个感叹号(!)会将值转换为布尔值然后取反。-第二个感叹号(!)再次取反,从而得到原值对应的布尔值。引用[4]中的表格清晰展示了各种数据类型使用!!后的结果:-字符串:非空字符串转换为true,空字符串转换为false-数值:非0数字(包括负数)转换为true,0和NaN转换为false-布尔值:保持不变-null和undefined:转换为false-对象:总是转换为true,即使是空对象因此,!!的作用是显式地将值转换为布尔类型,常用于需要确保布尔值的上下文中(如条件判断)。使用场景:1.在需要严格布尔值的条件语句中,用于转换非布尔类型值。2.在函数参数处理时,确保接收的是布尔值。3.在一些需要布尔值返回的判断中,例如检测对象是否存在(注意:对象永远返回true,即使为空对象)。具体例子:```javascriptletname="hello";console.log(!!name);//trueletage=0;console.log(!!age);//falseletperson=null;console.log(!!person);//falseletobj={};console.log(!!obj);//true```注意事项:-!!与直接使用Boolean()函数效果相同,但!!更为简洁,是常见的惯用写法。-在逻辑判断中,JavaScript本身会进行隐式转换(如if条件),但有些场景需要显式布尔值,此时!!就很有用。</think> ### JavaScript 中感叹号 `!!` 的作用与用法详解 #### 核心作用:**类型强制转换** 感叹号 `!!` 的作用是将**任意类型的数据转换为对应的布尔值(true/false)**,其本质是连续两次逻辑非运算: ```javascript !!value // 等同于 Boolean(value) ``` - 第一个 `!` :将值转换为布尔类型并取反 - 第二个 `!` :再次取反,得到原始值对应的真实布尔值 #### 转换规则(按数据类型) 1. **字符串(String)** ```javascript !!'hello' // true(非空字符串) !!'' // false(空字符串) ``` 2. **数值(Number)** ```javascript !!1 // true(非零) !!0 // false(零) !!NaN // false(非法数字) ``` 3. **布尔值(Boolean)** ```javascript !!true // true(保留原值) !!false // false(保留原值) ``` 4. **空值(Null & Undefined)** ```javascript !!null // false !!undefined // false ``` 5. **对象(Object)** ```javascript !!{} // true(即使是空对象) !!{key:1} // true !![] // true(即使是空数组) ``` #### 主要应用场景 1. **显式类型转换** 在需要布尔值的上下文中强制转换类型: ```javascript const isActive = !!user.status; // 将字符串/数字转为布尔值 ``` 2. **过滤假值** 配合数组方法快速过滤假值(false, 0, "", null, undefined): ```javascript [1, 0, '', 'a'].filter(Boolean) // [1, 'a'] [1, 0, '', 'a'].filter(v => !!v) // 等效写法 ``` 3. **简化条件判断** 替代冗长的三元表达式: ```javascript // 传统写法 const isValid = value ? true : false; // !!写法 const isValid = !!value; ``` #### 与传统写法的对比 | 方式 | 示例 | 特点 | |-----------------|--------------------|--------------------------| | `!!` 运算符 | `!!'text'` → true | 代码简洁,JS惯用写法 | | `Boolean()` 函数| `Boolean('text')` | 更易读,但字符数更多 | | 隐式转换 | `if('text'){...}` | 无需额外语法,但无显式返回值 | > 在 Vue/React 等框架中常见于将 props 或状态值转为布尔值[^1][^2] #### 注意事项 1. 对象和数组总是返回 `true`,即使为空对象 `{}` 或空数组 `[]` 2. `Symbol` 类型转换:`!!Symbol()` → true 3. 不要用于判断空数组/对象(需用 `Array.length` 或 `Object.keys`) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值