Почему "~ undefined" - -1 в JavaScript?
В соответствии с этим сообщением запустите следующие коды
> ~function () { console.log('foo');}()
foo
-1
Как мы все знаем, возвращаемое значение выше анонимной функции undefined
. Почему ~undefined
есть -1
? Я не мог найти подобного вопроса.
Ответы
Ответ 1
~
побитовое НЕ. Он использует ToInt32
для преобразования аргумента в число. ToInt32
определяется как:
- Пусть число должно быть числом (аргументом).
- ReturnIfAbrupt (номер).
- Если число NaN, +0, -0, + ∞ или -∞, return +0.
...
В свою очередь, ToNumber(undefined)
возвращает NaN
, поэтому согласно шагу 3, ToInt32
возвращает 0
.
И ~0
- -1
.
Ответ 2
всякая вещь, которая не может быть представлена в битах в JS, например "undefined, NaN" обрабатывается как 0
или 0000000000000b
для оператора ~
, поскольку она преобразует операнд в целое число со знаком см. @felixkling answer для получения более подробной информации об этом, а так как операция ~
не является BITwise или 1s дополнением, которая переворачивает биты, поэтому оператор приводит к 111111111111b
как последовательность 1
и при работе с числами на двоичном уровне MSB (самый старший бит) рассматривается как sign
, поэтому при преобразовании всех 0s
в 1s
он приводит к десятичному значению -1
try ~0
, например. и использовать этот код для получения двоичного представления числа (-3 >>> 0).toString(2))
Ответ 3
По-видимому, бит-представление undefined
- это все 0
s. Это можно увидеть, если: undefined | 0
, которое оценивается как 0
. Из-за этого мы знаем, что представление undefined
- это все нули.
Если теперь мы очистим все биты (именно это делает ~
), мы получим все 1
, которые являются представлениями -1
.
Все это работает из-за когерентности типа javascript