Я делал упражнение по проверке, является ли переменная целым числом. x ^ 0 === x был одним из предложенных решений, однако, когда я пробую это в консоли Chrome, на codepen.io или здесь, он возвращает x. Почему это?

function isInteger(x) {
  console.log(x ^ 0 === x);
}

isInteger(5);
isInteger(124.124)
isInteger(0);
4
THE JOATMON 1 Мар 2018 в 19:36

3 ответа

Лучший ответ

Ваше состояние оценивается неправильно из-за того, что вы пропустили добавление () вокруг x^0:

function isInteger(x) {
  console.log((x ^ 0) === x);
}

isInteger(5);
isInteger(124.124)
isInteger(0);
5
messerbill 1 Мар 2018 в 16:38

В то время как ответ messerbill объясняет проблему, есть другой. Это не хороший метод для использования:

function isInteger(x) {
  console.log((x ^ 0) === x);
}

isInteger(281474976710656);

Причина в том, что побитовые операторы принуждают операнды до 32 бит. Лучше использовать это:

function isInteger(x) {
  console.log((x % 1) === 0);
}

isInteger(5);
isInteger(124.124)
isInteger(0);
isInteger(281474976710656);
3
Patrick Roberts 1 Мар 2018 в 16:44

В дополнение к предоставленным ответам, концепция, связанная с этой проблемой, является "приоритет оператора". На этой странице я ухожу, когда у меня возникают проблемы такого рода в JS (разные языки могут иметь несколько разные приоритеты операторов, например, оператор возведения в степень ** в js и php).

Итак из примеров в ответах:

(x ^ 0) === x

Требует скобок

Пока

x % 1 === 0

Не.

0
u.dev 1 Мар 2018 в 17:57