Что я хочу сделать, так это проверить, есть ли элемент в массиве, если он есть, я хочу увеличить счетчик. Компилятор сообщает об ошибке, когда я делаю count++, но не когда я делаю count + 1, и он правильно увеличивается. Это потому, что count++ — это операция, а не выражение, а count+1 — это выражение?
let count = 0;
//not working
count = checkArr(arr) ? count++ : count;
//working
count = checkArr(arr) ? count + 1 : count;
Postfix ++
сначала возвращает старое значение, а затем увеличивает само значение. Если вы измените его на префикс один (например, ++count
), он будет работать. Однако нет необходимости изменять количество в тернарном операторе, потому что в результате вы присваиваете ему
Используйте префиксный оператор. Это потому, что с постфиксом значение увеличивается после его первого чтения. С префиксом вы получите обновленное значение count
до того, как оно будет прочитано.
count = checkArr(arr) ? ++count : count;
Должно сработать
Это сработает, но это действительно странная конструкция. Сначала вы увеличиваете переменную, а затем перезаписываете ее тем же значением. Было бы лучше без троичной ИМО.
Законно использовать тернарный оператор таким образом. Однако я бы поспорил о стиле кода здесь.
count = checkArr(arr) ? count + 1 : count;
В этой строке часть expressionFalse (после :) совершенно бесполезна и ничего не делает, и она нужна только для корректного синтаксиса тернарного оператора.
Для этого случая IMO следующая конструкция более читабельна:
if (checkArr(arr)) {
++count;
}
или
if (checkArr(arr)) ++count;
Нет ничего запрещенного, но можно взять на вооружение некоторые хорошие практики.
Смешивание присвоения count =
, кондиционирования ?:
и приращения поста ++
— это много внутри одной строки.
Всегда ищите самое простое решение при кодировании чего-либо. В твоем случае :
if (checkArr(arr)) {
count += 1;
}
намного легче понять, чем тернар, который кажется неуместным в этом конкретном контексте.
Существуют существующие инструменты проверки качества кода, такие как sonarqube, eslint...
Они всегда требуют простоты.
Пример о троичных правилах:
Пример о post/pre инкременте:
Они хотят, чтобы кодировщик избегал использования ++/--, потому что некоторых людей это может ввести в заблуждение. Многие люди не знают разницы между ++var
и var++
, что может привести к ошибкам. Отдайте предпочтение var += 1;
.
значение count++
и ++count
отличается.
Вкратце:
count = count++
: значение count++
— это значение ДО приращения.
count = ++count
: значение ++count
— это значение ПОСЛЕ приращения.
let count = 5;
console.log(count++); //return 5
console.log(count); //return 6
let count = 10;
console.log(++count); //return 11
console.log(count); //return 11
Это работает одинаково для count--
и --count
Однако здесь следует отметить одну вещь: в eslint это будет считаться ошибкой, и вместо этого рекомендуется использовать +=1
.
Ссылка для справки: https://eslint.org/docs/rules/no-plusplus
Если это работает, я не понимаю, почему его нельзя использовать: p