javascript中!!(双叹号)的作用

含义
Javascript中,!表示运算符“非",如果变量不是布尔类型,会将变量自动转化为布尔类型,再取非,那么用两个!!就可以将变量转化为对应布尔值。

Javascript中各种类型如何转换为布尔值

首先,定义三个转化布尔值的函数,我们后面会看到这三个函数是等价的,并且同时输出三个函数的转化结果

function trueOrFalseIf(toTest){
	if(toTest){
		return true;
	}
	else{
		return false;
	}
}

function trueOrFalseDouble(toTest){
	return !!toTest;
}

function trueOrFalseBoolean(toTest){
	return new Boolean(toTest);
}

function print(toTest){
	document.write(trueOrFalseIf(toTest)+","+trueOrFalseDouble(toTest)+","+trueOrFalseBoolean(toTest)+"<br/>");
}

依次测试undefined,null,空字符串"",负0,正0,不确定数值NaN,布尔值false和布尔值true,字符串"0",数字1,数字无穷大Infinity,字符串"true",字符串"false",空数组[],空对象{},函数

function test(){

var toTestArray=[undefined,null,"",-0,0,NaN,false

,true,"0",1,Infinity,"true","false",[],{},function(){}];

for(var i=0;i<toTestArray.length;i++){

    print(toTestArray[i]);

}

}

测试结果:
前面7个值都是false,后面9个值都是true。说明三个函数的作用是一样的。
得出结论,
undefined和null为false。

任意数组,对象,函数(函数是特殊的对象)都转化为真,即使是空数组,空对象。

空字符串为false,非空字符串为true。
数值正负0,不确定值为false,其它为true,无穷大也是true。
字符串"0"和数值0可以相互转换,但它们转换为不同的布尔值,即0可转换为"0","0"可转换为true,但0却转换为false,可见Javascript中类型转换不具有传递性。

一个更有趣的现象是布尔值false会转化为字符串"false",而字符串"false"却转换为布尔值

document.write(new String(false));
document.write(new Boolean("false"));
//  false true

Javascript中!!(两个感叹号,双感叹号)可以用来判断一些变量的值啊!如果值为真,首先可以排除undefined和null,根据对象类型,可以做出如下判断:

数值:表示不是0,且有确定含义的值(包括无穷大)

字符串:表示长度大于0的字符串

数组,对象,函数:只能表示不是undefined或null,并不能判断是否有元素和内容。

另外,我们上面比较了三个函数,结果是一样的,所以下面两个用法其实是完全等价的:

if(!!value){

}

if(value){

}

如果作为条件表达式,不需要使用!!进行转换,Javascript会自动转换,!!就只应用于将类型转换为布尔值。

原文链接:https://blog.youkuaiyun.com/tantanit/article/details/52287700

<think>首先,用户的问题是:“我想了解C++中'!!'运算符的含义 请问C++中叹号!!作用是什么”。我需要基于提供的引用来回答。 从引用中提取相关信息: - 引用[2]:C++中叹号!!的含义。C语言中偶尔会遇到 !!(cond),特别是在宏定义当中;单!用法是取非,!推导可知:!!(非零)=1,!!(零)=0。 - 引用[3]:c++之叹号的含义。这里有一个隐藏含义,即可以通过!!修饰后,得到的结果肯定为0或者1,可以达到修改数值的目的。例如:int k = 12; int m = -1; int n = 0; cout<<"!!k = "<<!!k << " !!m = " << !!m << " !!n = " << !!n; 输出结果为:!!k = 1 !!m = 1 !!n = 0。 - 引用[4]:叹号!!运算符的用法。所以,本人觉得!!只是节省了代码,如果是if语句可以不必要这么写,但是上面!!的写法,确实节省了代码的行数。还有一些其他场景:比如一个开关,当某个数值大于0的时候,就打开,等于0的时候就关闭,使用!!可以一行代码搞定。 - 引用[5]:js叹号_探讨js中的叹号判断。return !!( typeof document !== "undefined" && document && document.getElementById ) &&。虽然这是关于JS的,但原理类似。 关键点总结: - 叹号!!在C++中用于将一个值转换为0或1。 - 第一个!取非:如果值非零,!value为0;如果值为0,!value为1。 - 第二个!再取非:!!(非零值) = !0 = 1;!!0 = !1 = 0。 - 因此,!!作用是将任何数值转换为布尔值0或1,相当于标准化布尔值。 - 应用场景:简化代码,特别是在宏定义或需要布尔输出的地方;节省代码行数,如用于开关控制。 我的回答需要: 1. 使用中文回答。 2. 结构清晰,逐步解释。 3. 确保LaTeX语法正确:行内数学表达式用$...$,独立公式用$$...$$。 4. 生成相关问题。 5. 在引用的段落末尾自然地添加引用标识,如[^1]。 回答结构: - 先解释叹号!!的含义。 - 给出示例代码。 - 讨论应用场景。 - 最后生成相关问题。 步骤: 1. **解释含义**:叹号!!不是C++中的独立运算符,而是两个逻辑非运算符的组合。第一个!取反,第二个!再取反,结果是将任何值转换为0或1。 - 数学上:如果$v$是值,则$!!v = !(!v)$。 - 规则:$!!v = 0$ 如果 $v = 0$;$!!v = 1$ 如果 $v \neq 0$。 使用LaTeX:行内如$!!v$,独立公式如果需要。 2. **示例代码**:基于引用[3],给出类似代码。 ```cpp #include <iostream> using namespace std; int main() { int k = 12; int m = -1; int n = 0; cout << "!!k = " << !!k << endl; // 输出 1 cout << "!!m = " << !!m << endl; // 输出 1 cout << "!!n = " << !!n << endl; // 输出 0 return 0; } ``` 3. **应用场景**:节省代码,如在宏定义中强制布尔值;在条件语句中简化。 引用[4]提到:用于开关控制,例如当数值大于0时打开,等于0时关闭,可以用!!实现。 4. **添加引用标识**:在解释中自然地添加,例如在讨论场景时。 5. **生成相关问题**:在最后添加§§相关问题§§部分。 相关问题建议: 1. 叹号!!在C++中与布尔值转换有何区别? 2. 在哪些情况下使用叹号!!比使用if语句更优? 3. 叹号!!在其他编程语言中如JavaScript中的用法是什么? 确保回答真实可靠:基于提供的引用,没有添加虚构信息。</think>### C++中叹号!!作用 在C++中,叹号`!!`不是独立的运算符,而是两个逻辑非运算符`!`的组合使用。它的核心作用是将任何数值**强制转换为布尔值**(即`0`或`1`),用于标准化输出或简化条件判断。下面我将逐步解释其含义、原理和应用场景。 #### 1. **含义和原理** - 逻辑非运算符`!`的作用是取反布尔值: - 如果操作数为非零值(如`5`、`-1`),`!value`结果为`0`(假)。 - 如果操作数为零值(如`0`),`!value`结果为`1`(真)。 数学表达为:$!v = \begin{cases} 0 & \text{if } v \neq 0 \\ 1 & \text{if } v = 0 \end{cases}$。 - 叹号`!!`是两次取反: - 先对值应用一次`!`,得到中间结果。 - 再对中间结果应用第二次`!`,最终将**任何非零值转换为`1`,零值转换为`0`**。 数学表达为:$!!v = !(!v)$,推导规则: - 若 $v \neq 0$,则 $!!v = !(0) = 1$。 - 若 $v = 0$,则 $!!v = !(1) = 0$。 因此,`!!`等效于将数值映射为标准布尔值(0或1),常用于宏定义或条件简化[^2][^3]。 #### 2. **示例代码** 以下C++代码演示`!!`的行为: ```cpp #include <iostream> using namespace std; int main() { int k = 12; // 非零值 int m = -1; // 非零值(负数) int n = 0; // 零值 cout << "!!k = " << !!k << endl; // 输出 1 cout << "!!m = " << !!m << endl; // 输出 1 cout << "!!n = " << !!n << endl; // 输出 0 return 0; } ``` 输出结果: ``` !!k = 1 !!m = 1 !!n = 0 ``` 说明:无论原始值是正数、负数还是零,`!!`都将其标准化为`0`或`1`[^3]。 #### 3. **应用场景** - **简化条件判断**:在宏定义或返回值中,`!!`可避免冗长的`if`语句。例如,定义一个宏,当输入非零时输出`1`,零时输出`0`: ```cpp #define TO_BOOL(x) (!!(x)) ``` - **开关控制**:在状态机或配置中,将数值直接转换为布尔开关。例如,数值大于0时启用功能,等于0时禁用: ```cpp bool isEnabled = !!configValue; // configValue非零则isEnabled=true,否则false ``` 这比写`if (configValue != 0) isEnabled = true; else isEnabled = false;`更简洁[^4]。 - **跨语言兼容**:类似用法也见于JavaScript等语言,用于确保布尔一致性[^5]。 #### 4. **注意事项** - **与单感叹号区别**:单`!`只取反一次,结果可能非标准化(如`!5`得`0`,但`0`不是布尔真值);`!!`则保证输出始终为`0`或`1`。 - **性能影响**:`!!`是轻量级操作,无运行时开销,常用于底层代码优化。 - **可读性权衡**:虽然节省代码行数,但过度使用可能降低可读性,建议在简单逻辑或宏中采用[^4]。 总之,叹号`!!`在C++中是一种巧妙的技巧,用于数值到布尔值的强制转换,提升代码简洁性[^2][^3][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值