无操作的JavaScript约定是什么?

无操作的JavaScript约定是什么?,javascript,function,Javascript,Function,无操作的JavaScript约定是什么?类似于Pythonpass命令 一个选项只是一个空函数:function(){} jQuery提供了$.noop(),它只调用上面的空函数 只需输入值false或0,是否可以接受 在上下文中。。。所有这些工作都不会在Chrome中抛出错误: var a = 2; (a === 1) ? alert(1) : function() {}; (a === 1) ? alert(1) : $.noop(); (a === 1) ? alert(1) : fa

无操作的JavaScript约定是什么?类似于Python
pass
命令

  • 一个选项只是一个空函数:
    function(){}
  • jQuery提供了
    $.noop()
    ,它只调用上面的空函数
  • 只需输入值
    false
    0
    ,是否可以接受
在上下文中。。。所有这些工作都不会在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中指定“无操作”函数的最佳方法是什么

EDIT2:来一个怎么样

true;
false;
0;
1;
null;

无论你在这里想要实现什么,都是错误的。三元表达式不能用作完整陈述,只能用于表达,因此您的问题的答案是:

您没有任何建议,请改为:

var a = 2;
if (a === 1)
    alert(1)
// else do nothing!
这样代码就很容易理解、可读,并且尽可能地高效

既然可以很简单,为什么还要让它变得更难呢

编辑:

那么,“no operation”命令基本上是否表示代码结构较差

你没有领会我的意思。以上都是关于三元表达式
x?y:z

但是,在高级语言(如Javascript)中,无操作命令没有意义

在汇编或C等低级语言中,它通常用于使处理器对一条指令不执行任何操作,以达到计时目的

在JS中,是否执行
0
null
函数(){}或空语句,解释器在读取它时很有可能会忽略它,但在它被解释之前,因此最终,您只需在很短的时间内让程序加载得更慢。Nota Bene:我假设这一点,因为我没有参与任何广泛使用的JS解释器,而且每个解释器都有自己的策略

如果您使用更复杂的东西,比如
$.noop()
var foo=function(){};foo()
,那么解释器可能会执行一个无用的函数调用,最终会破坏函数堆栈的几个字节和几个周期

我看到像
$.noop()
这样的函数存在的唯一原因是仍然能够给某个事件函数一个回调函数,如果它不能调用该回调函数,该函数将抛出异常。但是,它必须是一个你需要给出的函数,给它取
noop
名称是个好主意,所以你告诉你的读者(可能是你在6个月后)你故意给出了一个空函数

最终,不存在“低级”或“高级”代码结构。你使用工具的方式不是对就是错。。在你的例子中使用三元组就像在你想拧螺丝的时候使用锤子一样。它会起作用的,但你不确定你能在螺丝上挂点什么

可以被认为是“劣等”或“优越”的是您在代码中加入的算法和思想。但这是另一回事。

我认为jQuery
noop()
主要是为了防止代码崩溃,在请求的函数不可用时提供默认函数。例如,考虑以下代码示例,如果未定义
fakeFunction
,则选择
$.noop
,以防止对
fn
的下一次调用崩溃:

var fn = fakeFunction || $.noop;
fn() // no crash
然后,
noop()
允许通过避免在代码中的任何地方多次写入相同的空函数来节省内存。顺便说一下,
$.noop
function(){}
(每个令牌保存6个字节)稍微短一点。因此,代码和空函数模式之间没有关系。如果您愿意,可以使用
null
false
0
,这样不会产生任何副作用。此外,值得注意的是,此代码

true/false ? alert('boo') : function(){};
。。。是完全无用的,因为你永远不会调用这个函数,而这个

true/false ? alert('boo') : $.noop();
。。。因为你调用了一个空函数,这和

true/false ? alert('boo') : undefined;
让我们用
if
语句替换三元表达式,看看它有多无用:

if (true/false) {
    alert('boo');
} else {
    $.noop(); // returns undefined which goes nowhere
}
你可以简单地写:

if (true/false) alert('boo');
甚至更短:

true/false && alert('boo');


最后要回答你的问题,我想“传统的no操作”是一个从未被编写过的操作。

要回答最初的问题,纯Javascript中noop函数最优雅、最简洁的实现是function.prototype。这是因为:

  • Function.prototype是一个函数:
  • typeof Function.prototype==“函数”//返回true

  • 它可以作为函数调用,基本上不执行任何操作,如下所示:
  • 虽然这是一个“真正的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函数(或相关讨论或谷歌搜索)的各种实现的字母顺序列表:

    (似乎没有本地 实施
    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
    
     (0); // nop
    
    console.time("mark");
    (0); // nop
    console.timeEnd("mark");
    
    > var a = (0);
    < undefined
    > a
    < 0
    
    Function() === Function()
    // false
    
    Function.prototype() === Function.prototype()
    // true