讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

AniShort
AniShort

AI短剧协同制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Laper
Laper

剧本策划到成片协作

js 怎样用negate创建取反判断的函数

轻杰大大_5246

轻杰大大_5246

发布时间:2025-08-14 12:33:02

|

786人浏览过

|

来源于php中文网

原创

negate函数的作用是创建一个返回原函数结果取反的新函数,1. 它通过闭包实现,接收一个函数并返回新函数;2. 使用apply确保正确传递this上下文和参数;3. 对原函数返回值用!操作符取反;4. 可用于数据过滤、条件判断和事件处理等场景;5. 与lodash的_.negate功能相同,但lodash版本更健壮且兼容性更好;6. 手写时需注意this指向、参数传递、返回值类型及错误处理,建议添加try...catch提升健壮性,该函数提升了代码复用性和可读性,避免重复编写取反逻辑,是一个实用的高阶函数工具。

js 怎样用negate创建取反判断的函数

简单来说,

negate
函数的作用就是创建一个新函数,这个新函数会返回原函数结果的布尔取反。

解决方案:

function negate(func) {
  return function(...args) {
    return !func.apply(this, args);
  };
}

// 示例:判断一个数字是否为正数
function isPositive(num) {
  return num > 0;
}

// 创建一个判断数字是否为非正数的函数
const isNotPositive = negate(isPositive);

console.log(isPositive(5)); // true
console.log(isNotPositive(5)); // false
console.log(isNotPositive(-2)); // true

negate函数的核心在于闭包。它接收一个函数作为参数,然后返回一个新的函数。这个新函数调用原函数,并对原函数的返回值取反。

apply
方法用于确保原函数在正确的上下文中执行,并且可以接收任意数量的参数。

为什么要用negate?直接在原函数里加个

!
不行吗?

当然可以,但

negate
的优势在于代码的复用性和可读性。想象一下,如果你在多个地方需要对同一个判断函数进行取反,
negate
可以让你避免重复编写取反逻辑。而且,
negate
可以更清晰地表达你的意图:你想创建一个与现有函数相反的函数。

negate函数的常见应用场景有哪些?

  1. 数据过滤: 假设你有一个数组,需要过滤出不符合特定条件的元素。可以使用

    negate
    创建一个取反的判断函数,然后传递给数组的
    filter
    方法。

    const numbers = [1, 2, 3, 4, 5, 6];
    
    // 判断一个数字是否为偶数
    function isEven(num) {
      return num % 2 === 0;
    }
    
    // 创建一个判断数字是否为奇数的函数
    const isOdd = negate(isEven);
    
    // 过滤出奇数
    const oddNumbers = numbers.filter(isOdd);
    
    console.log(oddNumbers); // [1, 3, 5]
  2. 条件判断: 在某些情况下,你可能需要根据一个条件的否定来执行不同的操作。

    negate
    可以让你更简洁地表达这个逻辑。

    function isLoggedIn() {
      // 模拟登录状态
      return false;
    }
    
    const isNotLoggedIn = negate(isLoggedIn);
    
    if (isNotLoggedIn()) {
      console.log("请先登录");
    } else {
      console.log("欢迎回来");
    }
  3. 事件处理: 在事件处理中,你可能需要根据某个条件来阻止事件的默认行为。

    negate
    可以方便地创建一个取反的条件判断函数。

    <input type="checkbox" id="myCheckbox">
    <script>
      const checkbox = document.getElementById('myCheckbox');
    
      function isChecked() {
        return checkbox.checked;
      }
    
      const isNotChecked = negate(isChecked);
    
      checkbox.addEventListener('click', function(event) {
        if (isNotChecked()) {
          console.log("Checkbox is unchecked, doing something...");
          // event.preventDefault(); // 阻止默认行为
        } else {
          console.log("Checkbox is checked.");
        }
      });
    </script>

negate
函数和
lodash
库中的
_.negate
有什么区别?

科学计算器在线使用工具代码
科学计算器在线使用工具代码

html5 css3制作在线科学计算器ui布局,3D计算器面板,加减乘除数字计算器工具特效。

下载

lodash
的
_.negate
函数和我们上面手写的
negate
函数功能上是完全一样的,都是用于创建一个对原函数结果取反的新函数。主要区别在于:

  • lodash 提供了额外的功能和兼容性:
    lodash
    是一个成熟的 JavaScript 工具库,它在实现
    _.negate
    时,会考虑更多的边界情况和兼容性问题,例如对
    this
    上下文的处理、对参数的处理等等。虽然我们手写的
    negate
    函数在大多数情况下都能正常工作,但在某些特殊情况下,
    lodash
    的实现可能更健壮。
  • lodash 具有更好的性能(在某些情况下):
    lodash
    的很多函数都经过了性能优化,虽然
    _.negate
    本身的功能很简单,但如果你的代码对性能要求非常高,使用
    lodash
    可能会带来微小的性能提升。当然,这种提升通常可以忽略不计。
  • lodash 提供了更多的工具函数: 使用
    lodash
    的好处不仅仅在于
    _.negate
    这一个函数,而是可以方便地使用
    lodash
    提供的其他各种工具函数,例如数组处理、对象处理、函数处理等等,从而提高开发效率。

所以,如果你已经在使用

lodash
,那么直接使用
_.negate
是一个不错的选择。如果你只是需要一个简单的
negate
函数,并且不想引入额外的依赖,那么手写一个也是完全可以的。

手写 negate 函数时,有哪些需要注意的地方?

  1. this
    上下文: 确保新函数在调用原函数时,
    this
    上下文被正确传递。使用
    apply
    或
    call
    方法可以显式地指定
    this
    上下文。

  2. 参数传递: 确保新函数能够接收任意数量的参数,并将这些参数正确地传递给原函数。可以使用

    ...args
    语法来收集所有参数。

  3. 返回值类型: 确保原函数的返回值可以被安全地转换为布尔值。如果原函数的返回值不是布尔值,需要使用

    !
    运算符将其转换为布尔值。

  4. 错误处理: 考虑原函数可能抛出异常的情况。可以在新函数中添加

    try...catch
    块来捕获异常,并进行适当的处理。

  5. 代码可读性: 编写清晰、简洁的代码,并添加适当的注释,提高代码的可读性和可维护性。

下面是一个考虑了

this
上下文和参数传递的更健壮的
negate
函数:

function negate(func) {
  return function(...args) {
    try {
      return !func.apply(this, args);
    } catch (error) {
      console.error("Error in negated function:", error);
      return true; // 或者返回其他默认值,取决于你的需求
    }
  };
}

这个版本的

negate
函数增加了错误处理机制,如果原函数抛出异常,它会捕获异常并打印到控制台,然后返回
true
(或者你可以根据你的需求返回其他默认值)。这可以防止错误被忽略,并提供一些调试信息。

相关文章

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6404

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3544

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1952

2025.10.17

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

5233

2025.07.29

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

5036

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1455

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1938

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

10563

2023.08.17

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

100

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go-Zero goctl安装与使用手册
Go-Zero goctl安装与使用手册

共0课时 | 0人学习

DBeaver生态工具dbvr官方手册
DBeaver生态工具dbvr官方手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn