Форум программистов, компьютерный форум, киберфорум
DimaDima1985
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 2.

В Javascript нет литералов отрицательного числа

Запись от DimaDima1985 размещена 20.05.2021 в 13:17
Обновил(-а) DimaDima1985 20.05.2021 в 14:58

Подумайте, что выведет этот код?
Javascript
1
console.log(-3 ** 3);
Казалось бы, что тут такого?
Вот только браузеры выдадут SyntaxError.

FireFox напишет:
SyntaxError: unparenthesized unary expression can't appear on the left-hand side of '**'

А Chrome для такой строки напишет:
SyntaxError: Unary operator used immediately before exponentiation expression. Parenthesis must be used to disambiguate operator precedence

Знак минус здесь - это оператор "unary negation" (унарное отрицание, т.е. унарный минус), а вовсе не часть литерала отрицательного числа и даже вовсе не оператор "subtraction" (вычитание).
В записи -3 литералом числа является только цифра 3, а слева от числа стоит оператор "unary negation".
Аналогичная ошибка была бы при использовании унарного плюса.

Чтобы возвести в степень "отрицательный литерал" (хотя реально это уже выражение, а не литерал), нужно использовать скобки:
Javascript
1
console.log( (-3) ** 3 ); // -27
Получается, когда мы пишем:
Javascript
1
let x = -6;
то литерал 6 возвращает правым операндом число 6 для оператора - (унарный минус), после чего возвращается число -6, которое присваивается переменной x.

Кстати, у унарного минуса приоритет 17, у возведения в степень приоритет 16, у вычитания приоритет 14.

P.S. Эта раскопанная информация стала очередной задачкой под номером 47 в моих тестах по знанию JS. Можете порешать остальные, если вам такое интересно.
Размещено в Без категории
Показов 1309 Комментарии 7
Всего комментариев 7
Комментарии
  1. Старый комментарий
    Интересные задачи вы решаете! Я бы не стал вычислять логарифм от отрицательного числа. Или это не логарифм?
    Запись от wer1 размещена 21.05.2021 в 08:16 wer1 вне форума
  2. Старый комментарий
    Унарный минус естественно должен иметь самый высокий приоритет (кроме скобок). Но в сочетании и использованием операции возведения в степень возможны варианты. Тут суть дела в том, что возведение в степень может использоваться натуральный логарифм, а для натуральных показателей степени - прямое произведение.
    Запись от wer1 размещена 21.05.2021 в 08:34 wer1 вне форума
  3. Старый комментарий
    А что выводит код?

    console.log(0 - 3 ** 3);
    Запись от wer1 размещена 21.05.2021 в 08:37 wer1 вне форума
  4. Старый комментарий
    Цитата:
    Сообщение от wer1 Просмотреть комментарий
    А что выводит код?

    console.log(0 - 3 ** 3);
    Здесь - - это уже оператор вычитания, а не унарный минус.
    Запись от DimaDima1985 размещена 21.05.2021 в 15:58 DimaDima1985 вне форума
  5. Старый комментарий
    Таким образом, вместо
    Javascript
    1
    
    +!+2**3
    нужно писать
    Javascript
    1
    
    (+!+2)**3
    Запись от politoto размещена 21.05.2021 в 19:08 politoto вне форума
  6. Старый комментарий
    politoto,
    я тут тоже подумал, что если использовать унарный +, то должна быть аналогичная ошибка
    console.log(+3 ** 3); (?). Проверить бы надо...
    Запись от wer1 размещена 22.05.2021 в 06:45 wer1 вне форума
  7. Старый комментарий
    Аватар для DrType
    Та же ошибка
    Запись от DrType размещена 22.05.2021 в 10:31 DrType вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.