Подтвердить что ты не робот

Почему "~ undefined" - -1 в JavaScript?

В соответствии с этим сообщением запустите следующие коды

> ~function () { console.log('foo');}()
  foo
  -1

Как мы все знаем, возвращаемое значение выше анонимной функции undefined. Почему ~undefined есть -1? Я не мог найти подобного вопроса.

4b9b3361

Ответ 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