Null и undefined в JS, почему undefined заменено на void 0?

JavaScript

причина

  Однажды я смотрел код одноклассника на js и обнаружил странную вещь в кодеvoid 0, хотя я не понимаю что это такое на первый взгляд, но по контексту, тут надо судить равно ли оно undefined, почему так пишется, есть ли происхождение? out как undefined, так и null для просмотра.

представлять

  undefined и null — это семь типов данных в js, разница между этими двумя типами данных

  • undefined - это объявление неопределенного
  • null - это нулевой указатель, если не определяется как null, иначе нуль не будет

null

   null — это что-то странное, например, общие вопросы на собеседовании

Почему тип объекта null?

Эта тема соприкоснулась со мной, когда я впервые начал изучать js.Говорили, что это ошибка в js-дизайне.Это было просто потому, что было слишком много старых кодов, и я боялся, что исправления повлияют, поэтому я оставил это все время, и некоторые говорили, что это нулевой указатель. , пустой объект, значит, это объект. Но я всегда чувствовал, что это недостаточно убедительно, поэтому я поискал некоторую информацию в Интернете.

В начальной версии javascript использовалась 32-битная система, а нижний слой был представлен как бинарный, для соображений производительности информация о типе переменной хранилась в младшем бите:

  • 000: Объект

  • 1: целое число

  • 010: число с плавающей запятой

  • 100: Строка

  • 110: логическое значение

  • Все 0: ноль

Таким образом, typeof использует этот механизм для оценки, поэтому, если все нули равны 0, 000 объекта составляется, поэтому он оценивается как объект

И еще одно замечание

null == undefined //true null和undefined用==比较结果是true,并且没有发生隐式转换,就是true

undefined

   Next не определено.В этом дизайне тоже есть очень большой баг.Такая важная вещь не ключевое слово,а переменная.Что означает переменная?Вы можете изменить его, как хотите!!

  Поэтому некоторые программисты будут использовать void 0 для замены undefined, призрак знает, будет ли оригинальный undefined заменен каким-нибудь зловещим злодеем.

Такvoid 0Как это произошло?

Согласно ECMAScript, то, что следует за void, равно undefined, и некоторые говорят, что void 0 — это привычка, перенесенная из других языков, что является старым способом написания драйверов, поэтому в следующий раз, когда мы захотим использовать undefined, нам нужно заменить его на void 0, так что выглядит как старый драйвер

Когда будет заменено undefined?

Вот и я испытал это на себе

  • В Google Chrome версии 69.0.3497.100
    var undefined = 2;
    console.log(undefined); //undefined 

Результат undefined, что означает, что undefined нельзя изменить в глобальной области видимости в новой версии Google Chrome.

    //这次改用const
    const undefined = 2; //Identifier 'undefined' has already been declared
    console.log(undefined); 

Использование const сообщит об ошибке, она была объявлена, и то же самое верно для let


  • Затем попробуйте Internet Explorer (IE11)
    var undefined = 2;
    console.log(undefined); //undefined 

Этот результат все еще не определен, поэтому его нельзя заменить в глобальной области видимости ie11.

  • Пока версия браузера ie8 не изменилась
    var undefined = 2;
    console.log(undefined); //2

Он изменился, глобальная область действия ie8 может измениться undefined

Кажется, что это бесполезно, не так ли?Многие компании ie8 не нуждаются в совместимости, подождите минутку

  • В Google Chrome версии 69.0.3497.100 давайте попробуем в рамках функции
(function () {
        var undefined = 2
        console.log(undefined);  //2 
    })()

Обнаружено, что это изменилось undefined

(function () {
        const undefined = 2
        console.log(undefined); //2
    })()

const также возможен, и в версиях 11, 10, 9 и 8 т.е. без исключения undefined перезаписывается

Почему это так?

   В это время я думал, что в глобальной области видимости глобальная переменная станет атрибутом окна.В это время мы можем проверить, что особенного в этом атрибуте, и мы узнаем причину.

console.log(Object.getOwnPropertyDescriptor(window, undefined)); //{value: undefined, writable: false, enumerable: false, configurable: false}

В это время, когда вы получаете атрибут данных, вы можете видеть, что его нельзя переопределить, перечислить, собственные значения нельзя изменить или удалить, поэтому его нельзя переопределить в глобальной области.

Как насчет IE8? Почему?

console.log(Object.getOwnPropertyDescriptor(window, undefined)); //{configurable: false, enumerable: false, value: undefined, writable: true}

IE8 не может быть пронумерован, не может удалить или изменить значение функции, но !!Можно перезаписать !!Таким образом, глобальная область IE8 перезаписывается !!

Вывод: Хотя undefined не может быть изменен в глобальной области действия большинства основных браузеров, его все же можно переписать в области видимости функции или на уровне блока.Конечно, большинство людей не должны делать такие глупости, но я все еще использую viod 0, на всякий случай, и это больше похоже на старый код драйвера.