Подтвердить что ты не робот

Что такое соглашение JavaScript без каких-либо операций?

Что такое соглашение JavaScript для бездействия? Как команда pass Python.

  • Один из вариантов - просто пустая функция: 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;
4b9b3361

Ответ 1

Чтобы ответить на исходный вопрос, наиболее элегантной и аккуратной реализацией функции noop в чистом Javascript (как также обсуждается здесь) является Function.prototype. Фрагмент ниже показывает его использование:

setTimeout(Function.prototype, 10000);

Все три браузера (Chrome, Firefox и IE 11) не приводят к тому, что интерпретатор возвращается через 10 секунд при выполнении вышеуказанного (вы можете выполнить пошаговое тестирование, используя режим "step over" в отладчике).

Хотя это и есть "настоящий noop", поскольку большинство браузеров, похоже, ничего не делают для выполнения noop, определенного таким образом (и, следовательно, для сохранения циклов ЦП), могут быть некоторые проблемы с производительностью, связанные с этим (как также упоминалось другими в комментариях или в другие ответы).

Однако, как говорится, вы можете легко определить свою собственную noop-функцию, и на самом деле многие библиотеки и фреймворки также предоставляют noop-функции. Ниже приведены некоторые примеры:

var noop = function () {};           // Define your own noop in ES3 or ES5
const noop = () => {};               // OR Define your own noop in ES6
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 angular 1.x
setTimeout(jQuery.noop, 10000);      // Using with jQuery

Вот алфавитный список различных реализаций функций noop (или связанных обсуждений или поисков Google):

Angular 1.x, Angular 2+ (не похоже на собственную реализацию - используйте свою собственную, как показано выше), Ember, jQuery, Lodash, NodeJS, Ramda, React (не похоже на собственную реализацию - используйте вашу собственные, как показано выше), RxJS, Underscore

НИЖНЯЯ ЛИНИЯ: Хотя Function.prototype - это элегантный способ выражения noop в Javascript, однако, могут возникнуть некоторые проблемы с производительностью, связанные с его использованием. Таким образом, вы можете определить и использовать свой собственный (как показано выше) или использовать тот, который определен библиотекой/структурой, которую вы можете использовать в своем коде.

Ответ 2

Самый лаконичный и эффективный noop - это пустая функция стрелки: ()=>{}.

Функции со стрелками изначально работают во всех браузерах, кроме IE (при необходимости есть преобразование babel): MDN


()=>{} против Function.Prototype

  • ()=>{} на 87% быстрее, чем Function.prototype в Chrome 67.
  • ()=>{} на 25% быстрее, чем Function.prototype в Firefox 60.
  • ()=>{} на 85% быстрее, чем Function.prototype в Edge (15/06/2018).
  • ()=>{} на 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!')

Ответ 3

все, что вы пытаетесь достичь здесь, неверно. Тернарные выражения не должны использоваться как полный оператор, только в выражении, поэтому ответ на ваш вопрос:

никаких ваших предложений, а не:

var a = 2;
if (a === 1)
    alert(1)
// else do nothing!

тогда код может быть легко понятен, доступен для чтения и настолько эффективен, насколько это возможно.

Почему сложнее, когда это может быть просто?

изменить:

Итак, значит, команда "no-operation" в основном указывает на структуру нижнего кода?

Вам не хватает моей точки. Все вышесказанное относится к тройному выражению x ? y : z.

Но команда no no does not имеет смысл на языках более высокого уровня, таких как Javascript.

Обычно он используется на языках нижнего уровня, таких как сборка или C, как способ заставить процессор ничего не делать для одной инструкции для целей синхронизации.

В JS, независимо от того, выполняете ли вы 0;, null;, function () {}; или пустой оператор, есть большие шансы, что интерпретатор будет проигнорирован при чтении, но до того, как он будет интерпретироваться, поэтому в конце концов, вы просто заставите свою программу загружаться медленнее на очень крошечный период времени. Nota Bene: Я предполагаю это, так как я не участвую в широко используемом интерпретаторе JS, и есть вероятность, что у каждого интерпретатора есть своя стратегия.

В случае, если вы используете что-то более сложное, например $.noop() или var foo = function () {}; foo(), тогда интерпретатор может выполнить неиспользуемый вызов функции, который в конечном итоге испортит несколько байтов вашего стека функций и несколько циклов.

Единственная причина, по которой я вижу, что такая функция, как $.noop(), будет существовать, - это возможность предоставить функцию обратного вызова какой-либо функции события, которая генерирует исключение, если оно не может вызвать этот обратный вызов. Но тогда это обязательно функция, которую вам нужно дать, и присвоение ей названия noop - это хорошая идея, поэтому вы говорите своим читателям (а может быть, вам через 6 месяцев), что вы намеренно даете пустую функцию.

В конце концов, нет такой вещи, как "низшая" или "высшая" структура кода. Вы либо правы, либо ошибаетесь в том, как используете свои инструменты. Использование троичного кода для вашего примера - это использовать молоток, когда вы хотите его завинтить. Это сработает, но вы не уверены, что можете повесить что-нибудь на этот винт.

Что можно считать либо "неполноценным", либо "высшим" - это алгоритм и идеи, которые вы вводите в свой код. Но это другое.

Ответ 4

Я думаю, что jQuery noop() в основном предназначен для предотвращения сбоя кода, предоставляя функцию по умолчанию, когда запрашиваемый не доступен. Например, учитывая следующий пример кода, $.noop выбирается, если fakeFunction не определено, предотвращая сбой следующего вызова 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');

Чтобы ответить на ваш вопрос, я думаю, что "обычная операция не является", которая никогда не записывается.

Ответ 5

Я использую:

 (0); // nop

Чтобы проверить время выполнения этого запуска как:

console.time("mark");
(0); // nop
console.timeEnd("mark");

результат: отметка: 0.000мс

Использование Boolean( 10 > 9) может быть уменьшено до простого ( 10 > 9), которое возвращает true. Придумав идею использования одного операнда, я полностью ожидал, что (0); вернет false, но он просто вернет аргумент обратно, как можно проверить, выполнив этот тест на консоли.

> var a = (0);
< undefined
> a
< 0