Комментарии 50
P.S. Если у них правда такие исходники, то я бы и сам отказался с таким работать.
(ключевые слова – точка следования/sequence point, в JavaScript такого вроде нету)
Если ответ утвердительный — бежим куда глаза глядят.
Если отрицательный — то спрашиваем, а нафига такой вопрос, но дорогу к выходу всё равно стоит прикинуть.
Вот не понимаю я таких программистов. Вам настолько в лом по-человечески разобраться в языке, на котором вы работаете, что все, что глубже текущего модного фреймворка, вы считаете бесполезной фигней?
Мне кажется, что это из той же серии, что и вопросы зачем в школе математику проходить, если у меня в кармане калькулятор есть. А кто думать учиться будет? А логику тоже за вас калькулятор будет продумывать?
С таким подходом и надеждой, что всю сложную работу за вас всегда будет делать компилятор с оптимизацией, очень скоро можно случайно обнаружить себя на обочине профессии, замененным нейросетью или более дешевым студентом, который знает более модный фреймворк.
В данном случае это полностью бесполезное занятие. Просто для развлечения. Дайте тогда уж реальный запутанный кусок логики и попросите разобраться.
После такого обфусцированный код на изи читается.
Кстати да: к запутанному куску логики можно задать вопрос "как бы вы это написали"/"перепишите нормально", сразу увидите и способность человека к чтению всякой ереси, и его стиль.
И самое главное — этот код нечитаем. Его сложно понять, сложно объяснить работу, сложно изменить.
Посчитать легко (ну, для JavaScript… Для C уже нет), писать нельзя.
Я возможно туплю после бессонной ночи дежурства, но тут разве не наоборот?
function ++x(x) {
const oldValue = x;
x = x + 1;
return oldValue;
}
function x++(x) {
x = x + 1;
return x
}
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Increment
If used postfix, with operator after operand (for example, x++), the increment operator increments and returns the value before incrementing.
If used prefix, with operator before operand (for example, ++x), the increment operator increments and returns the value after incrementing.
The values of the [[Prototype]] and [[Class]] internal properties of the global object are implementation-dependent.
15.1.2.2 parseInt (string, radix)
[If there are too many significant digits] mathInt may be an implementation-dependent approximation to the mathematical integer value that is represented by Z in radix-R notation.
15.3.4.2 Function.prototype.toString
An implementation-dependent representation of the function is returned.
15.4.4.11 Array.prototype.sort (comparefn) — likely the best example:
If comparefn is not undefined and is not a consistent comparison function for the elements of this array, the behaviour of sort is implementation-defined.
[…] If proto is not null and there exists an integer j such that all of the conditions below are satisfied then the behaviour of sort is implementation-defined:
obj is sparse (15.4)
0 ≤ j < len
The behaviour of sort is also implementation defined if obj is sparse and any of the following conditions are true:
The [[Extensible]] internal property of obj is false.
Any array index property of obj whose name is a nonnegative integer less than len is a data property whose [[Configurable]] attribute is false.
The behaviour of sort is also implementation defined if any array index property of obj whose name is a nonnegative integer less than len is an accessor property or is a data property whose [[Writable]] attribute is false.
Perform an implementation-dependent sequence of calls […]
15.5.4.9 String.prototype.localeCompare (that)
The two Strings are compared in an implementation-defined fashion
15.5.4.11 String.prototype.replace [In replacement symbols, if the number is greater than the number of groups], the result is implementation-defined.
Все, кто тут пишут про "если у них такой код — в баню такую контору" — может стоит иногда подумать, что не все в жизни может быть так прямолинейно?
Ну, то есть, есть категория задач на более практическое применение ваших знаний — например, написать какую-то ту-душку или еще что-нибудь в этом роде. Но есть и такие, где работодатель хочет "пощупать" будущего сотрудника и за другие его качества: знает ли он банальнейшую теорию (эта вот задачка решается в уме минут за 5 если вспомнить что к чему) и способен он в конце концов решать поставленные задачу вместо вот этого вот бухтения "а зачем это? да кому это нужно?". Более того, эта задача расчитана, возможно, также на то, что если ты все-таки забыл как там операторы работают и что когда присваивается (хотя ей Богу не могу себе представить человека, которому трудно это решить) — то тогда можно посмотреть как вы справляетесь с этим косяком — будете ли вы спрашивать / гуглить / ватевер. Ну, то есть, когда вам зрение проверяют на буквах, это еще не означает, что доктор долбан, потому что заставляет читать не рассказы Чехова, а какие-то никому не нужные буковки.
Мне эта задача тоже не оч, просто потому, что никакого финта ушами там делать не нужно. Вот могу подкинуть парочку тоже ориентированных на синтаксис JS:
1) В голове посчитать результат:
120 + 102 + 012 + 002 + .12 + (0,1 + 2,3)
2) Что будет в "х"?
let i
for (i = 0; i++; i < 5) {
i = i + 3
}
const x = i
Да-да, это не про солид и дядю Боба, это просто синтаксис.
Если бы нам пришлось думать таким образом, JavaScript был бы гораздо более запутанным
Ну-ну, не будь правой ассоциативности и приоритета операций — этой задачи вообще бы и не возникло. Читать и писать код стало бы проще, было бы меньше багов с операторами. Одни проблемы от этого наследия математики.
То, что негодующие по поводу таких задач, не понимают, как они соотносятся с реалиями, и это больше характеризует их. Даже если сам разраб и его коллеги не пишут грязный код, нужно чтобы лишний раз не тупить часами в дебаггере или на Стеке, когда есть проблема, которая упирается в незнание основ языка.
Дело не в усидчивости, а в том, что у всех разная оценка ценности собственного времени. Я на подобное не стал бы тратить своё время, потому что могу его применить с гораздо бо́льшей пользой для заказчика (и бо́льшей пользой для себя).
Буратино хитро подмигнул:
— Врете, ни одного…
— Я говорю, — терпеливо повторила девочка, — предположим, что у вас в кармане два яблока. Некто взял у вас одно яблоко. Сколько у вас осталось яблок?
— Два.
— Подумайте хорошенько.
Буратино сморщился, — так здорово подумал.
— Два…
— Почему?
— Я же не отдам Некту яблоко, хоть он дерись!
— У вас нет никаких способностей к математике, — с огорчением сказала девочка. — Займемся диктантом.
Есть разница между отсутствием желания и возможности правильно решить задачу. У некоторых отказников будет наблюдаться второе. Как я сказал, задача простая и скучная, и мне бы не хотелось, чтобы меня собеседовал дятел, который вычитал ее в интернетах. Но претензии ведь не к деталям задачи, а к самому факту, что вопрос о релевантных навыках, а возмущающиеся считают его ниже своего достоинства.
Свой код может быть сколь угодно красивым, но в библах говнокод сплошь и рядом, и ковыряться в сырцах и отлаживать их иногда приходится. Если спесивый мидл выбьет себе предложение, потому что по другим дисциплинам он волочет, а потом засыплется на основах из такой задачки и пойдет курить мануал вместо того, чтобы пофиксить баг еще вчера, то в чем тут польза для заказчика? Насчет себя знаю, что когда-то вовремя закрыв вопросы по матчасти, я себе сэкономил десятки часов. На примере коллег по цеху нередко вижу обратное.
Другими словами, сегодня вы можете получите 42, а завтра 54 из-за того, что реализация инкремента/декремента отдана на откуп компиляторам и, если я правильно помню, не стандартизирована.
Решение забавной задачки на JavaScript