新手小白如何使用!!运算符写出更简洁直观的代码?

简介: 【10月更文挑战第10天】新手小白如何使用!!运算符写出更简洁直观的代码?

!!在项目中的妙用

最近公司来了几个实习生,在领导的示意下,我负责帮他们优化审查代码。其中,有一个实习生的代码着实吸引了我。

业务应该是要做非空判断,他的代码是这么写的:

if (str !="" && str !=0 && str !=null && str != undefined) {
    
    // 逻辑处理...
}

代码写的是没有问题的,但是我觉得可以优化,于是把他叫来了。我告诉他这个代码可以这么优化:

if (!!str) {
    
    // 逻辑处理...
}

他非常吃惊,居然还可以这么写,很激动的问我啥原理。于是,我给他详细的讲了这个知识点。

他也很聪明,给他讲完这个知识点后,他立马举一反三,说判断接口返回空数组是不是可以这么写:

if (!!data.length) {
    
    // 数组为空
}

看来他确实是明白这个知识点了,于是,我对他做了肯定!

鉴于一些小白不懂这个知识点,我详细的给大家介绍下吧!

!!的原理

再介绍!!的原理的原理前,我们需要了解一些前置知识。在 JavaScript 中,所有的值都可以被隐式转换为布尔值。在这种转换中,值会被分类为“真值” (truthy) 或“假值” (falsy)。

真值和假值

  • 假值 (falsy) :在转换为布尔值时被视为 false 的值,包括:
  • false
  • 0 (数字零)
  • -0 (负零)
  • "" (空字符串)
  • null
  • undefined
  • NaN (非数字)
  • 真值 (truthy) :除了上述假值外,所有其他值在转换为布尔值时都被视为 true

条件判断if逻辑运算中,所有的值都会被进行隐式抓换。如:

if(0){
   

}
// if中的0被视为false
if(1){
   

}
// if中的1被视为true(1是真值)

!! 运算符的工作机制

!! 可以将一个值强制转换为布尔值。它背后的原理是双重否定(double negation):通过两次应用逻辑非运算符 !,将一个任意类型的值转换为 truefalse

  • 第一个 !运算符

将值转换为布尔值,并将其取反。也就是说,如果值是真值 ,则第一个 ! 会将其转换为 false;如果值是假值,则第一个 ! 会将其转换为 true

  • 第二个 !运算符

再次取反前一步的结果,将其转换为相应的布尔值。如果前一步结果是 false,则第二个 ! 会将其转换为 true;如果前一步结果是 true,则第二个 ! 会将其转换为 false

这样,经过 !! 运算后的结果就是将原始值强制转换为布尔值。

我们可以通过下面的示例巩固理解

console.log(!!0);        // false
// 数字0是假值,!0 的结果是 true,再次取反,!!0的结果就是false

console.log(!!'0');      // true
// 字符0是真值,!'0' 的结果是 false,再次取反,!!'0'的结果就是 true

console.log(!!1);        // true
// 数字1是真值,!1 的结果是 false,再次取反,!!1的结果就是true

console.log(!!"");       // false
// 字符""是假值,!"" 的结果是 true,再次取反,!!""的结果就是false

console.log(!!"hello");  // true
// hello是真值,双重取反就是true

console.log(!!null);     // false
// null是假值,双重取反就是false

console.log(!!undefined); // false
// undefined是假值,双重取反就是false

console.log(!!{
   });       // true
// {}是真值,双重取反就是true

console.log(!![]);       // true
// []是真值,双重取反就是true

通过上述示例,我们可以快速得到一个结论:

如果某个值是真值,使用!!就是true

如果某个值是价值,使用!!就是fasle

可见,要想熟练使用!!运算符,一定要清楚知道假值有哪些,真值有哪些!

!!的应用场景

将任意值转换为布尔值

!! 可以将任何类型的值(如对象、字符串、数字等)转换为布尔值,如果我们需要明确一个值是 true 还是 false 时很有用。

let isValid = !!inputValue; // 将 inputValue 转换为布尔值,判断其是否为真值

注意:数字0是假值,如果inputValue是0,但是0有效,慎用!

条件判断的简化

当需要判断变量是否为非空、非零、非 null、非 undefined 等时,!! 可以直接使用。

if (!!str) {
   
  // str 是一个非空字符串
}

//同
if (str !="" && str !=0 && str !=null && str != undefined) {
   
  // str 是一个非空字符串
}

确保返回值为布尔类型

在函数返回值需要是布尔类型时,!! 是一种确保返回值为 truefalse 的最简单方法。再判断数组是不是为空时,这非常好用!

function isEmpty(arr) {
   
    return !!arr.length; // 如果数组非空,返回 true,否则返回 false
}

console.log(isEmpty([]));  // false
console.log(isEmpty([1])); // true

在逻辑运算中的应用

在复杂的逻辑运算中,使用 !! 可以将结果强制转换为布尔值,确保逻辑表达式的返回值是 truefalse

const isActive = !!user && !!user.isActive;

总结

这篇文章介绍了!!的原理,它核心依赖于 JavaScript 的隐式转换,因此我们必须知道真值和假值。同时,这篇文章介绍了!!的使用场景,大家可以根据情况使用!

但注意,!!可读性比较差,对于初学者,最好不要使用!如果你想希望代码更加清晰,可以考虑使用 Boolean() 函数来代替 !!

相关文章
|
6月前
|
存储 C++
【C++】可变参数模板使用总结(简洁易懂,详细,含代码演示)
【C++】可变参数模板使用总结(简洁易懂,详细,含代码演示)
|
2月前
|
数据处理 开发者 Python
代码之美:探索简洁而强大的Python编程
【8月更文挑战第56天】在编程的世界里,简洁不仅仅是一种风格,它是高效和可维护性的代名词。本文将通过Python编程语言的视角,带领读者领略代码的优雅与力量。我们将从基础语法出发,逐步深入到函数式编程、面向对象设计,以及实用的第三方库使用,揭示如何通过简洁的代码解决复杂问题。准备好让你的思维得到启发,让我们一起走进Python的世界,体验代码之美。
|
3月前
|
数据采集 数据可视化 数据挖掘
探索Python编程的奥秘:从基础到进阶Python中的装饰器:简化代码,提升效率
【8月更文挑战第30天】在这个数字技术飞速发展的时代,掌握一门编程语言已经成为了许多人追求的目标。Python,作为一门易于学习且功能强大的编程语言,吸引了无数初学者和专业人士的目光。本文将带领读者从Python的基础语法出发,逐步深入到函数、模块、面向对象编程等高级特性,最后通过实际案例展示Python在数据分析和网络爬虫领域的应用。无论你是编程新手还是希望提升自己的Python技能,这篇文章都将为你打开一扇通往Python世界的大门。
|
5月前
|
Serverless 开发者 Python
Python函数式编程:让你的代码更简洁、更高效!
【6月更文挑战第12天】Python函数式编程引入了数学函数概念,强调无副作用和不可变数据。特点包括高阶函数、Lambda表达式、map、filter和reduce。示例展示了如何使用map进行平方运算,filter筛选条件元素,reduce计算元素总和,体现其简洁高效。虽然不适用于所有情况,但函数式编程能提升代码可读性和可维护性。
32 3
|
5月前
|
物联网 程序员 API
程序员必知:WndPric的使用方法
程序员必知:WndPric的使用方法
29 0
|
索引 Python
Python的知识点运用-3(不太基础的基础运用,代码美化)
Python的知识点运用-3(不太基础的基础运用,代码美化)
61 0
|
自然语言处理 搜索推荐 程序员
编程初学者如何使用搜索引擎
google 是目前这个星球上最好用的搜索引擎,没有之一。按理说,在开放的互联网上,有一个最好用的产品,你没有理由不去用它,而要勉强于其他拙劣的替代产品。然而因为一些众所周知的不宜在公开场合讨论的原因,你可能不得不选择一些名声不那么好的搜索引擎。
|
存储 测试技术 C语言
【C】字符串函数——大全(简洁,精炼,初学者)(二)
【C】字符串函数——大全(简洁,精炼,初学者)
【C】字符串函数——大全(简洁,精炼,初学者)(一)
【C】字符串函数——大全(简洁,精炼,初学者)
|
XML Java Android开发
安卓开发之ticker2.0版本使用案例(小白易懂)
安卓开发之ticker2.0版本使用案例(小白易懂)
安卓开发之ticker2.0版本使用案例(小白易懂)