没有操作的JavaScript约定是什么? ()=>{}断续器Function.Prototype

2022-08-30 02:28:11

没有操作的JavaScript约定是什么?就像一个Python命令。pass

  • 一个选项只是一个空函数:function() {}
  • jQuery 提供 ,它只是调用上面的空函数。$.noop()
  • 是否可以简单地输入值 或 ?false0

在上下文中...所有这些都可以在Chrome中不抛出错误:

var a = 2;
(a === 1) ? alert(1) : function() {};
(a === 1) ? alert(1) : $.noop();
(a === 1) ? alert(1) : false;
(a === 1) ? alert(1) : 0;

编辑:很多人回应说,“不要这样做!更改代码结构!这让我想起了一个帖子,有人问如何嗅浏览器。他收到了一连串的帖子,说:“不要那样做!这是邪恶的,“但没有人告诉他如何嗅浏览器。这不是代码审查。想象一下,您正在处理无法更改的旧代码,如果没有传入某些函数,它将抛出错误。或者,简单地说,这就是客户想要的方式,他们付钱给我。所以,请尊重地回答这个问题:在JavaScript中指定“无操作”函数的最佳方法是什么?

编辑2:其中一个怎么样?

true;
false;
0;
1;
null;

答案 1

为了回答最初的问题,纯Javascript中noop函数最优雅,最整洁的实现(这里也讨论了)是Function.prototype。这是因为:

  1. Function.prototype是一个函数:

typeof Function.prototype === "function" // returns true

  1. 它可以作为函数调用,基本上不执行任何操作,如下所示:
setTimeout(function() {
      console.log('Start: ', Date.now());
      Function.prototype();
      console.log('End  : ', Date.now());
    }, 1000);

虽然这是一个“真正的noop”,因为大多数浏览器似乎不做任何事情来执行以这种方式定义的noop(从而节省CPU周期),但可能存在一些与此相关的性能问题(正如其他人在评论或其他答案中提到的那样)。

但是,话虽如此,您可以轻松定义自己的noop函数,并且实际上,许多库和框架也提供noop函数。以下是一些示例:

var noop = function () {};           // Define your own noop in ES3 or ES5
const noop = () => {};               // Define in ES6 as Lambda (arrow function)
setTimeout(noop, 10000);             // Using the predefined noop

setTimeout(function () {} , 10000);  // Using directly in ES3 or ES5
setTimeout(() => {} , 10000);        // Using directly in ES6 as Lambda (arrow function)

setTimeout(angular.noop, 10000);     // Using with AngularJS 1.x
setTimeout(jQuery.noop, 10000);      // Using with jQuery

以下是noop函数(或相关讨论或谷歌搜索)的各种实现的字母顺序列表:

AngularJS 1.xAngular 2+(似乎没有原生实现 - 使用你自己的如上所示),EmberjQueryLodashNodeJSRamdaReact(似乎没有原生实现 - 使用你自己的如上所示),RxJSUnderscore

底线:尽管 Function.prototype 是一种在 Javascript 中表达 noop 的优雅方式,但是,可能存在一些与它的使用相关的性能问题。因此,您可以定义和使用自己的(如上所示),也可以使用可能在代码中使用的库/框架定义的库/框架。


答案 2

最简洁、最高性能的 noop 是一个空箭头函数:.()=>{}

Arrow 函数在除 IE 之外的所有浏览器中都本机工作(如果必须,则有一个 babel 转换):MDN


()=>{}断续器Function.Prototype

  • ()=>{}比 Chrome 67 快 87%Function.prototype
  • ()=>{}比 Firefox 60 快 25%Function.prototype
  • ()=>{}比 Edge 快 85%(6/15/2018)。Function.prototype
  • ()=>{}代码比 少 65%Function.prototype

下面的测试使用箭头函数来给出偏差,但箭头函数是明显的赢家:Function.prototype

const noop = ()=>{};
const noopProto = Function.prototype;

function test (_noop, iterations) {
    const before = performance.now();
    for(let i = 0; i < iterations; i++) _noop();
    const after = performance.now();
    const elapsed = after - before;
    console.info(`${elapsed.toFixed(4)}MS\t${_noop.toString().replace('\n', '')}\tISNOOP? ${_noop() === undefined}`);
    return elapsed;
}

const iterations = 10000000
console.info(`noop time for ${iterations.toLocaleString()} iterations`)
const timings = {
    noop: test(noop, iterations),
    noopProto: test(noopProto, iterations)
}

const percentFaster = ((timings.noopProto - timings.noop)/timings.noopProto).toLocaleString("en-us", { style: "percent" });
console.info(`()=>{} is ${percentFaster} faster than Function.prototype in the current browser!`)