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>好的,我现在需要回答用户关于Angular中单叹号(!)叹号(!!)的用法及区别的问题。首先,我要确保自己正确理解这两个操作符在JavaScript/TypeScript中的行为,因为Angular是基于这些语言的。 单叹号(!)是逻辑非运算符,它可以将一个值转换为布尔值并取反。例如,如果变量是truthy,!variable会返回false;如果是falsy,则返回true。常见的falsy值包括false、0、""、null、undefined和NaN,其他都是truthy。 接下来,叹号(!!)实际上是两次逻辑非操作。第一次非运算将值转换为布尔值的相反值,第二次再取反,得到原值的布尔等价。所以!!variable相当于Boolean(variable),用来将任意值显式转换为布尔类型。例如,!!0会得到false,!!"hello"会得到true。 在Angular的上下文中,这两个操作符常用于模板表达式或组件逻辑中,用于条件判断或类型转换。比如在*ngIf指令中,可能需要将非布尔值转换为布尔值以确保条件正确判断。此外,用户可能还会在属性绑定或方法调用时使用它们来明确类型。 需要注意的是,虽然Angular模板支持这些JavaScript操作符,但过度使用可能影响可读性。有时候,使用显式的类型转换函数如Boolean()可能更清晰。另外,在变更检测过程中,频繁的类型转换可能对性能有轻微影响,但通常可以忽略。 现在,我需要确认是否有Angular特定的注意事项。根据引用内容,Angular的$digest循环会监控作用域变量的变化,所以确保变量正确转换有助于变更检测的准确性。例如,在$scope中使用!!来确保变量是布尔类型,可以避免不必要的digest循环,因为明确类型的值变化更容易被检测到。 最后,总结两者的区别:单叹号用于取反,叹号用于转换为布尔值。在Angular中,合理使用它们可以增强代码的清晰度和可靠性,特别是在处理可能为falsy值的变量时。</think>在Angular中,单叹号(`!`)和叹号(`!!`)是JavaScript的逻辑运算符,但它们在类型转换和条件判断中有特定用途。以下是详细说明: --- ### **1. 单叹号(`!`):逻辑非运算符** **作用**:将操作数转换为布尔值后取反。 - **Truthy值**(如非空字符串、非零数字、对象等)会被转换为`false`。 - **Falsy值**(如`false`、`0`、`""`、`null`、`undefined`、`NaN`)会被转换为`true`。 **示例**: ```typescript const isActive: boolean = false; console.log(!isActive); // 输出 true const name: string = ''; console.log(!name); // 输出 true(空字符串是falsy) ``` **Angular中的典型场景**: - 条件渲染时反转状态: ```html <div *ngIf="!isLoading">内容加载完成</div> ``` --- ### **2. 叹号(`!!`):强制转换为布尔值** **作用**:通过两次逻辑非运算,将任意值显式转换为布尔类型。等价于`Boolean(value)`。 - `!!value`会返回`true`(若`value`是truthy)或`false`(若`value`是falsy)。 **示例**: ```typescript const count: number = 0; console.log(!!count); // 输出 false(0是falsy) const message: string = 'Hello'; console.log(!!message); // 输出 true(非空字符串是truthy) ``` **Angular中的典型场景**: - 明确类型转换以避免意外行为: ```typescript // 将可能为undefined的值转换为布尔类型 hasPermission: boolean = !!user?.permissions; ``` - 模板中强制类型检查: ```html <button [disabled]="!!invalidForm">提交</button> ``` --- ### **3. 关键区别** | 特性 | `!`(单叹号) | `!!`(叹号) | |--------------------|---------------------------|------------------------------| | **返回值** | 布尔值(取反后的结果) | 布尔值(原值的布尔等价) | | **用途** | 条件反转 | 显式类型转换 | | **等价操作** | `Boolean(value) === false` | `Boolean(value)` | --- ### **4. Angular中的注意事项** - **模板表达式**:Angular模板支持`!`和`!!`,但需注意可读性。例如,`*ngIf="!!items"`与`*ngIf="items"`效果相同,因为Angular会自动进行布尔转换[^1]。 - **变更检测**:频繁使用`!!`可能引发不必要的变更检测,尤其在复杂对象上(需结合`OnPush`策略优化)[^1]。 - **类型安全**:在TypeScript中,`!!`可明确标记类型转换,减少`strictNullChecks`模式下的报错。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值