Каковы правила 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;
javascript
function
kmiklas
источник
источник
0
фактически не лучше (или хуже). Я бы сказал, что правильно - этоif (a === 1) doSomething();
не использовать,? :
когда это не имеет смысла.if (statement) action; else ;
false
или0
будет работать;null
это хороший способ выразить отсутствие работы.Ответы:
Чтобы ответить на исходный вопрос, самой элегантной и изящной реализацией функции noop в чистом Javascript (что также обсуждается здесь ) является Function.prototype . Это потому что:
Хотя это "истинный noop", поскольку большинство браузеров, похоже, ничего не делают для выполнения noop, определенного таким образом (и, следовательно, для экономии циклов процессора), могут быть некоторые проблемы с производительностью, связанные с этим (как также упоминалось другими в комментариях или в другие ответы).
Однако, как уже было сказано, вы можете легко определить свою собственную функцию noop, и, фактически, многие библиотеки и фреймворки также предоставляют функции noop. Вот несколько примеров:
Вот алфавитный список различных реализаций функций noop (или связанных обсуждений или поиска в Google):
AngularJS 1.x , Angular 2+ (похоже, не имеет собственной реализации - используйте свою, как показано выше), Ember , jQuery , Lodash , NodeJS , Ramda , React (похоже, не имеет собственной реализации - используйте свою собственную как показано выше), RxJS , Underscore
ИТОГ : Хотя Function.prototype - это элегантный способ выразить сообщение в Javascript, тем не менее, могут возникнуть некоторые проблемы с производительностью, связанные с его использованием. Итак, вы можете определить и использовать свой собственный (как показано выше) или использовать тот, который определен библиотекой / фреймворком, который вы можете использовать в своем коде.
источник
Function.prototype()
если вам не нужен тайм-аут и вы хотите, чтобы он выполнялся сразу.setTimeout(Function(), 10000);
(( )=>{};)
технически чистый JS и намного короче,function () {}
но точно эквивалентен.Наиболее краткая и производительный Noop является пустой функцией стрелка :
()=>{}
.Стрелочные функции изначально работают во всех браузерах, кроме IE (при необходимости есть преобразование babel ):
()=>{}
противFunction.Prototype
()=>{}
на 87% быстрее, чемFunction.prototype
в Chrome 67.()=>{}
на 25% быстрее, чемFunction.prototype
в Firefox 60.()=>{}
на 85% быстрее, чемFunction.prototype
в Edge (15.06.2018) .()=>{}
на 65% меньше кода, чемFunction.prototype
.В приведенном ниже тесте используется функция стрелки для смещения
Function.prototype
, но функция стрелки является явным победителем:источник
Function.prototype
работает значительно медленнее, но ни один из других вариантов не имеет явного преимущества._=>{}
на один символ меньше и делает то же самое._=>{}
имеет единственный параметр. Если кто-то использует TypeScript с достаточно строгой конфигурацией, он не будет компилироваться. Если вы его вызовете, ваша IDE, скорее всего, сообщит вам, что принимает один параметр, который может быть любого типа (как JavaScript, так и особенно TypeScript в vscode).все, чего вы здесь добиваетесь, неправильно. Тернарные выражения не должны использоваться в качестве полного оператора, только в выражении, поэтому ответ на ваш вопрос:
ни одно из ваших предложений, вместо этого сделайте:
тогда код будет легко понятным, читаемым и настолько эффективным, насколько это возможно.
Зачем усложнять, если можно просто?
редактировать:
Вы упускаете мою точку зрения. Все вышесказанное касается троичного выражения
x ? y : z
.Но команда без операции не имеет смысла в языках более высокого уровня, таких как Javascript.
Обычно он используется на языках более низкого уровня, таких как ассемблер или C, как способ заставить процессор ничего не делать для одной инструкции для целей синхронизации.
В JS, делаете ли вы
0;
,null;
,function () {};
или пустое выражение, есть большие шансы , что он будет игнорироваться интерпретатором , когда он читает, но прежде , чем она будет интерпретироваться, так что в конце концов, вы просто сделать вашу программа будет загружается медленнее на очень крошечный промежуток времени. Nota Bene : я предполагаю это, поскольку я не участвую в широко используемых интерпретаторах JS, и есть вероятность, что у каждого интерпретатора есть своя собственная стратегия.Если вы используете что-то более сложное, например
$.noop()
илиvar foo = function () {}; foo()
, тогда интерпретатор может выполнить бесполезный вызов функции, который в конечном итоге испортит несколько байтов вашего стека функций и несколько циклов.Единственная причина, по которой я вижу такую функцию,
$.noop()
которая могла бы существовать, - это возможность по-прежнему передавать функцию обратного вызова некоторой функции события, которая генерирует исключение, если не может вызвать этот обратный вызов. Но тогда вам обязательно нужно передать эту функцию, и дать ейnoop
имя - хорошая идея, поэтому вы говорите своим читателям (и это может быть вы через 6 месяцев), что вы намеренно даете пустую функцию.В конце концов, не существует таких понятий, как «низшая» или «высшая» структура кода. Вы либо правы, либо ошибаетесь в том, как вы используете свои инструменты. Использование троичного для вашего примера похоже на использование молотка, когда вы хотите завинтить. Это сработает, но вы не уверены, что сможете что-нибудь повесить на этот винт.
То, что можно считать «низшим» или «превосходным», - это алгоритм и идеи, которые вы вкладываете в свой код. Но это другое дело.
источник
Я думаю, что jQuery
noop()
в основном предназначен для предотвращения сбоев кода, предоставляя функцию по умолчанию, когда запрошенная недоступна. Например, учитывая следующий пример кода,$.noop
выбирается, еслиfakeFunction
не определено, что предотвращаетfn
сбой следующего вызова :Затем
noop()
позволяет экономить память, избегая многократного написания одной и той же пустой функции повсюду в вашем коде. Кстати,$.noop
это немного корочеfunction(){}
(6 байтов на токен). Итак, нет никакой связи между вашим кодом и шаблоном пустой функции. Используйтеnull
,false
или0
если хотите, в вашем случае побочных эффектов не будет. Кроме того, стоит отметить, что этот код ...... совершенно бесполезно, так как вы никогда не вызовете функцию, а эта ...
... еще более бесполезно, поскольку вы вызываете пустую функцию, которая в точности совпадает с ...
Давайте заменим тернарное выражение на
if
оператор, чтобы увидеть, насколько оно бесполезно:Вы можете просто написать:
Или даже короче:
Чтобы наконец ответить на ваш вопрос, я предполагаю, что «обычная операция без операции» - это та, которая никогда не записывается.
источник
mypromise.then($.noop, myErrorhandler);
Я использую:
Чтобы проверить время выполнения этого запуска как:
результат: оценка: 0,000 мс
Использование
Boolean( 10 > 9)
может быть сведено к простому( 10 > 9)
возвращениюtrue
. Придумывая идею использовать один операнд, я полностью ожидал,(0);
что он вернетсяfalse
, но он просто возвращает аргумент, который можно просмотреть, выполнив этот тест на консоли.источник
argument 0 is not a function
noop
должна быть функцией, которая оцениваетundefined
результат.function(){}
решение. Вызов(0)()
вызоветTypeError: 0 is not a function
var a = (0);
. Отсутствие операции не должно изменять память, и ваш пример присваивания делает именно это. Сам(0)
по себе может считаться бесполезным бездействием (в JavaScript их бесконечное количество, поэтому нет ничего, что делало бы ваш пример здесь особенным).Нет абсолютно никаких проблем или снижения производительности при использовании
Function.prototype
over() => {}
.Основное преимущество
Function.prototype
- наличие одноэлементной функции вместо того, чтобы каждый раз заново определять новую анонимную функцию. Особенно важно использоватьFunction.prototype
запретные действия, например, при определении значений по умолчанию и запоминании, поскольку это дает вам согласованный указатель на объект, который никогда не изменяется.Причина, по которой я рекомендую,
Function.prototype
а неFunction
потому, что они не совпадают:Кроме того, тесты из других ответов вводят в заблуждение . Фактически,
Function.prototype
работает быстрее, чем() => {}
зависит от того, как вы пишете и запускаете тест:Вы не можете доверять тестам JS << Конкретно вызываем тесты по этому вопросу.
Не стилизуйте свой код на основе тестов; делайте все, что можно поддерживать, и позвольте интерпретатору понять, как оптимизировать в конечном итоге.
источник