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

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

!!在项目中的妙用

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

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

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() 函数来代替 !!

相关文章
|
5月前
|
存储 C++
【C++】可变参数模板使用总结(简洁易懂,详细,含代码演示)
【C++】可变参数模板使用总结(简洁易懂,详细,含代码演示)
|
29天前
|
数据处理 开发者 Python
代码之美:探索简洁而强大的Python编程
【8月更文挑战第56天】在编程的世界里,简洁不仅仅是一种风格,它是高效和可维护性的代名词。本文将通过Python编程语言的视角,带领读者领略代码的优雅与力量。我们将从基础语法出发,逐步深入到函数式编程、面向对象设计,以及实用的第三方库使用,揭示如何通过简洁的代码解决复杂问题。准备好让你的思维得到启发,让我们一起走进Python的世界,体验代码之美。
|
2月前
|
存储 缓存 算法
探索Python编程:从基础到高级技巧
【8月更文挑战第31天】在这篇文章中,我们将一起踏上Python编程的旅程。无论你是初学者还是有一定基础的开发者,本文都将为你提供宝贵的知识和技能。我们将从Python的基本概念开始,逐步深入到更复杂的主题,包括面向对象编程、数据结构和算法,以及一些高级技巧和最佳实践。通过丰富的代码示例和实用的技巧,你将能够提升你的Python编程能力,并在实际项目中更加高效地应用这些知识。
|
4月前
|
Serverless 开发者 Python
Python函数式编程:让你的代码更简洁、更高效!
【6月更文挑战第12天】Python函数式编程引入了数学函数概念,强调无副作用和不可变数据。特点包括高阶函数、Lambda表达式、map、filter和reduce。示例展示了如何使用map进行平方运算,filter筛选条件元素,reduce计算元素总和,体现其简洁高效。虽然不适用于所有情况,但函数式编程能提升代码可读性和可维护性。
25 3
|
4月前
|
物联网 程序员 API
程序员必知:WndPric的使用方法
程序员必知:WndPric的使用方法
26 0
|
4月前
|
程序员 PHP
老程序员分享:PHPstripos()、strripos()和strrpos()使用方法和区别
老程序员分享:PHPstripos()、strripos()和strrpos()使用方法和区别
67 0
|
索引 Python
Python的知识点运用-3(不太基础的基础运用,代码美化)
Python的知识点运用-3(不太基础的基础运用,代码美化)
57 0
|
存储 自然语言处理 编译器
GO语言基础语法探究:简洁高效的编程之道 1
GO语言基础语法探究:简洁高效的编程之道
105 0
|
安全 Go C语言
GO语言基础语法探究:简洁高效的编程之道 3
GO语言基础语法探究:简洁高效的编程之道
103 0
|
存储 Java 编译器
GO语言基础语法探究:简洁高效的编程之道2
GO语言基础语法探究:简洁高效的编程之道