稀土掘金技术社区 2024年12月05日
被同事代码震惊,使用Boolean 构造函数代码居然可以如此优雅!
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了JavaScript中Boolean构造函数的妙用,首先回顾了显式转换和隐式转换的概念,并指出Boolean构造函数在前端开发中虽然使用场景看似不多,但实际却能发挥出意想不到的作用。文章重点介绍了Boolean在数组过滤中的应用,通过`filter(Boolean)`优雅地过滤掉数组中的假值,如null、undefined、空字符串等。此外,文章还探讨了Boolean在TypeScript中的应用,例如避免类型错误,并对比了不同的类型转换方法,如`Boolean()`和`!!`,强调了`Boolean()`的简洁直观性。

🤔显式转换和隐式转换:文章首先回顾了JavaScript中的显式转换和隐式转换,明确了两种转换方式的区别和常见方法,为理解Boolean的用法奠定了基础。

🔄Boolean在数组过滤中的应用:文章重点介绍了`filter(Boolean)`的妙用,通过将Boolean作为回调函数传递给`filter`方法,可以方便地过滤掉数组中的所有假值,例如`null`、`undefined`、空字符串等,这是一种非常优雅的写法。

🚀Boolean在TypeScript中的应用:在TypeScript中,Boolean可以用来将某个值转换为布尔类型,从而避免一些类型报错,例如在`v-if`指令中使用,确保条件判断的正确性。

💡类型转换方法对比:文章对比了`Boolean()`和`!!`两种类型转换方法,指出`Boolean()`更简洁直观,更易于理解和维护。

📝总结:Boolean构造函数作为JavaScript中的一个内置函数,可以作为一个简单的类型转换工具,在数组过滤和TypeScript类型检查等场景中发挥重要作用,提升代码的优雅性和可读性。

原创 石小石Orz 2024-12-03 08:30 重庆

点击关注公众号,“技术干货”及时达!

点击关注公众号,“技术干货” 及时达!

显式转换与隐式转换

为了加深对本文涉及的Boolean的语法理解,我们先回忆一下JavaScript中的「显示与隐式转换」

显式转换

「显式转换」是指通过明确的代码,主动将一种数据类型转换为另一种类型。这种方式通常是直观的、可控的。

「常见方法」

// 转换为字符串
const num = 42;
const str = String(num);      // "42"
const str2 = num.toString();  // "42"
// 转换为数字
const strNum = "123";
const num2 = Number(strNum);  // 123
// 转换为布尔值
const val = 0;
const bool = Boolean(val);    // false

隐式转换

在 JavaScript 中,所有的值都可以被「隐式转换」为布尔值。在这种转换中,值会被分类为“真值” 或“假值”。

「假值 (falsy)」 :在转换为布尔值时被视为 false 的值,包括:

「真值 (truthy)」 :除了上述假值外,所有其他值在转换为布尔值时都被视为 true

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

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

Boolean的妙用

Boolean 构造函数是 JavaScript 中的内建函数之一,用于将一个值转换为布尔值 (truefalse)。在前端开发中,Boolean的用途似乎并不多,在进行一些布尔判断时,我们几乎都使用了隐式转换。

const data = res?.data || []
if(data?.length){
  // ....
}

上述代码中,data?.length就会被隐式转换为「布尔值,」 从而达到我们的预期功能。

很少有人会显示转换

const data = res?.data || []
if(Boolean(data?.length)){
  // ....
}

这么一看,Boolean的使用场景似乎都可以被隐式转换替代。

然而,前几天,我们代码评审的时候,我看到同事一段非常“「奇特」”的代码

const rawlist = res?.data || []
const trueList = values.filter(Boolean);

虽然,我没理解这样为啥生效,但我很明白这个段代码的含义是通过filter方法过滤掉了原始数组中的所有假值,如nullundefined""0等。

我很好奇,fillter不是接受一个箭头函数么

[].filter(()=> {})

为什么values.filter(Boolean);也能生效?

filter(Boolean)的奥秘

其实,filter(Boolean)生效的原因非常简单,因为Boolean本身就是js中的一个构造函数,我们可以将它理解为下面的伪代码

function Boolean(value{
    // 布尔转换规则:Falsy 值返回 false,其它值返回 true
    if (value === false || value === 0 || value === "" || value === null || value === undefined || value === NaN) {
        return false
    } else {
        return true;  
    }
}
// 或
function Boolean(value{
  return value ? true : false// 使用三元运算符模拟
}

显然,values.filter(Boolean)的语法就等价于下面的语法:

const trueList = values.filter(item => Boolean(item));

可见,filter(Boolean)的写法可以方便的过滤到数组中的所有假值!这确实是一个非常优雅的写法!

Boolean的其他使用场景

Boolean 作为 JavaScript 的一个内置构造函数,可以作为一个简单的类型转换工具,在ts中,借助Boolean可以将某个值转换为布尔类型,从而避免一些类型报错。

如,如果用户输入了某个值,我们显示某个组件

<div class="count-info">
    <span v-if="inputValue">{{ "输入的值为:" + inputValue }}</span>
    <input v-model="inputValue">
</div>

<script setup lang="ts">
  const inputValue = ref<string>("")
</script>   

在ts中,编译器会给我们提示警告:「v-if后面需要跟一个布尔值,但inputValue是string类型。」

此时,我们用Boolean转换inputValue就可以完美解决这个问题

<div class="count-info">
    <span v-if="Boolean(inputValue)">{{ "输入的值为:" + inputValue }}</span>
    <input v-model="inputValue">
</div>

<script setup lang="ts">
  const inputValue = ref<string>("")
</script>   

当然,有些人喜欢花里花哨,使用!!强制转换

<div class="count-info">
    <span v-if="!!inputValue">{{ "输入的值为:" + inputValue }}</span>
    <input v-model="inputValue">
</div>

<script setup lang="ts">
  const inputValue = ref<string>("")
</script>   

这种写法,显然不如Boolean(inputValue)直观。当然,你纯粹为了炫技,那无所谓。

如果你不熟悉!!,参考:新手小白如何使用!!运算符写出更简洁直观的代码?

点击关注公众号,“技术干货” 及时达!

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

JavaScript Boolean 类型转换 数组过滤 TypeScript
相关文章