← Назад к вопросам

Что такое void 0?

1.0 Junior🔥 171 комментариев
#Теория тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое void 0 в JavaScript?

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

Как работает void?

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

console.log(void 0);          // undefined
console.log(void 1);          // undefined
console.log(void "hello");    // undefined
console.log(void (2 + 2));    // undefined
console.log(void someFunctionCall()); // undefined (функция выполнится, но результат игнорируется)

Зачем использовать void 0 вместо прямого undefined?

В ES5 (2009 года) и ранее глобальное свойство undefined в браузерах не было защищено от перезаписи. Это означало, что в теории или в плохо написанном коде его значение можно было изменить, что приводило к непредсказуемому поведению.

// В ES3/ES5 (не в strict mode) это было возможно:
undefined = 42;
console.log(undefined); // 42 — катастрофа для логики проверок!

// Использование void 0 всегда давало настоящее undefined
console.log(void 0); // undefined (всегда!)
console.log(undefined === void 0); // false, если undefined перезаписан!

void 0 являлся надежным, коротким (меньше символов, чем undefined) и неизменным источником настоящего undefined.

Современная ситуация (ES5+)

Начиная с ES5, глобальное undefined стало неперезаписываемым, ненастраиваемым свойством в соответствии со спецификацией. В strict mode ("use strict") попытка его изменить вызовет ошибку.

"use strict";
undefined = 42; // TypeError: Cannot assign to read only property 'undefined'

Таким образом, в современном JavaScript (ES6/ES2020+) прямой доступ к undefined безопасен. Тем не менее, void 0 все еще встречается.

Типичные случаи использования void 0

  1. Явное возвращение undefined из функции. Оператор void гарантирует, что результат выражения будет undefined, даже если внутреннее выражение имеет другое значение.

    const button = document.querySelector('button');
    button.onclick = () => void doSomething(); // Обработчик вернет undefined
    
  2. Минификация кода. Для минификаторов (например, UglifyJS, Terser) void 0 — это всего 5 символов, в то время как undefined9 символов. Замена всех undefined на void 0 уменьшает размер бандла.

    // До минификации:
    if (value === undefined) { ... }
    
    // После минификации часто становится:
    if (value === void 0) { ... }
    
  3. Согласованность в проверках. В редких случаях, при работе со старыми системами или для абсолютной параноидальной гарантии, разработчики могли использовать void 0.

  4. Немедленный вызов функции (IIFE) в контексте, где важно значение. Использование void перед IIFE заставляет интерпретатор обрабатывать функцию как выражение и отбрасывать её возвращаемое значение.

    void function iife() {
        console.log("Выполняется немедленно");
    }();
    // Это работает, даже если не обернуто в скобки ()(), что иногда может быть полезно.
    

Сравнение с другими способами получения undefined

  • undefined: Предпочтительный, читаемый способ в современном коде.
  • void 0: Надежная, короткая альтернатива, особенно актуальная для минификации и совместимости.
  • Необъявленная переменная: typeof x === 'undefined' — это безопасный способ проверки на существование глобальной переменной, но не для получения значения.
  • Аргумент функции: function foo(undefined) { ... } — хак для старых сред, но крайне не рекомендуется.

Вывод для QA Automation инженера: В автотестах на JavaScript/TypeScript вы, скорее всего, не будете писать void 0. Однако вы можете увидеть его в минифицированном коде продукта, в библиотеках или в legacy-коде. Понимание этой конструкции важно для чтения и отладки минифицированного воркфлоу, анализа стек-трейсов, где может встретиться void 0, и для глубокого понимания эволюции языка, что является признаком экспертизы. В новом коде следует использовать прямое undefined для лучшей читаемости.