Що саме невизначено означає у JavaScript? Чому саме там? Які звички він має? Як це може бути корисним?


11

У JavaScript у нас є щось, що називається невизначеним . Я щось сказав, бо я не знаю, чи це базовий клас, чи вбудована змінна, чи ключове слово, чи щось інше. Я просто знаю, що там є.

Щоб побачити це в дії, ви можете просто написати:

undefined;
typeof undefined;

Чи можете мені хтось пояснити, чому ця річ була вставлена ​​в JavaScript? Ми nullцінуємо цю мову, тому це не повинно бути чимось подібним null. В інших мовах, коли ми не знаємо значення властивості чи змінної, ми просто встановлюємо її на нуль. Тут ми можемо зробити те саме.

Як ми можемо використовувати цю річ у JavaScript?



Про це обговорювали ad nauseum тут stackoverflow.com/questions/6999291/…
Павло

Відповіді:


13

Є дві речі, які потрібно зрозуміти щодо невизначеного ...

  • тип undefined , який може мати тільки одне значення .
  • змінна undefined

Тепер дуже уважно прочитайте наступне ...

  • Існує стільки значень типу number(10, 10.01, 1e1). Але може бути лише одне значення типу undefined, і це значення зберігається у змінній undefined. Це значення НЕ буквене представлення - наприклад, числові значення 1, 100- 1e-1це всі літерали типу номера, але значення, що зберігається у змінній, undefinedне має прямої форми.

  • undefinedце змінна, просто звичайна змінна, що JavaScript оголошує і присвоює їй значення типу undefinedв глобальній області. Таким чином, ви можете зробити всі наступні ...

  тип не визначений; // "невизначений"

  невизначений = 100;
  тип не визначений; // "число"

  undefined = недійсний 0;
  тип не визначений; // "невизначений"

  window.undefined === undefined; // правда
  window.undefined === void 0; // правда
  
  • якщо ви не хочете використовувати змінну undefined, ви можете генерувати значення типу undefinedза допомогою виразу void 0- єдиною метою якого є повернення значення типу undefined.

... може хто-небудь пояснить мені, чому ця річ була вставлена ​​в JavaScript ...

НЕМАЄ. Так само, як ніхто не може пояснити, чому незадекларовані змінні переходять до глобальної сфери замість локальної. Вам просто потрібно навчити себе розумно використовувати його, а не намагатися знайти виправдання для свого існування.

... у нас є нульове значення ...

Хоча це nullможе робити undefinedі так, це більш-менш пов'язано з objectsскалярами, а не з ними. Дійсно, JavaScript вважає nullсебе об’єктом - typeof nullповертає "об'єкт".

На мою думку, суть полягає в тому, щоб НЕ намагатися пояснити абсолютні цілі undefinedта null- і використовувати їх у своєму коді зрозуміло, щоб ваш код був читабельним, доступним для використання та використовувався повторно.


2
Гарне пояснення @greengit. the bottom line is to NOT try to reason the absolute purposes of undefined and null, здається, що JavaScript трохи далекий від логічної мови, і ми просто мусимо звикати до нього, як експериментувати новий світ.
Saeed Neamati

1
"єдиною метою є повернення значення типу undefined". Фактично voidоцінює вираз, ігнорує повернене значення і повертає undefinedзначення. Щодо відмінностей. undefinedвикористовується двигуном JS, щоб сказати, що ця річ не має значення. nullВи використовуєте ВАС, щоб сказати, що ця річ не має значення. Існує чітка відмінність.
Райнос

1
undefined = 100; typeof undefined;повертає для мене "невизначений", якщо ви спробуєте призначити нуль, ви отримаєте помилку. Просто хотів уточнити це для майбутніх читачів.
Джош Румбут

6

Вибачте за відповідь на більш старе запитання, але причина, що вам потрібна як невизначена, так і нульова, проста: у мові набору протоколу на основі прототипу ви повинні абсолютно розмежовувати "цей об'єкт не визначає значення для X" і "цей об'єкт говорить, що X є нічого / null / порожній ".

Без цієї можливості неможливо пройти ланцюжок прототипу, і тому спадкування не може працювати; ви повинні бути в змозі визначити, що obj.someProp не визначено, щоб ви могли подивитися на obj.prototype.someProp і вперед по ланцюжку, поки не знайдете значення. Якщо obj.someProp повернув null, не було б способу дізнатися, чи дійсно це було null або просто означало "подивіться на мій прототип". Єдиний інший спосіб це ввести кумедну магію за лаштунками, яка порушує вашу здатність метушитися з прототипами ланцюгів і робити різні інші біти чорної магії JS.

Як і у багатьох Javascript, ідея невизначеного та нульового здається спочатку хитрою і дурною, потім абсолютно блискучою (потім повертається до химерної та дурної, але з розумним поясненням).

Мова на зразок C # не буде компілюватися, якщо ви отримуєте доступ до властивості, яка не існує, а інші динамічні мови часто викидають винятки під час виконання, коли ви торкаєтесь властивості, яка не існує, тобто вам потрібно використовувати спеціальні конструкції для тестування на них. Плюс класів означає, що коли об'єкт інстанційований, ви вже знаєте його ланцюг успадкування та всі властивості, які він має - в JS я можу змінити прототип на 15 сходинок ланцюга, і ці зміни з’являться на існуючих об'єктах.


3

Існує глобальна змінна undefined, яка встановлюється на невизначене значення. Злі люди можуть налаштувати це на щось інше, тому, мабуть, краще не довіряти цьому.

  • Невизначене значення - це повернене значення функції, яке не повертає значення.
  • Невизначене значення - це значення змінної, яка не була призначена.
  • Невизначене значення - це значення параметра, який не був переданий.
  • Невизначене значення - це властивість, яка не була призначена.
  • 'undefined' - тип незадекларованої змінної. ( typeof undeclaredVariable == 'undefined'. спроба прочитати значення заниженої змінної призведе до вас ReferenceError.)

nullтонко зламаний, бо typeof null == 'object'. Я не знаю, чому у нас undefinedі null, можливо, якась історична аварія.


2

Ну, undefinedце дозорне значення, отримане при оцінці чогось, що не визначено на відміну від null, яке є значенням, точно визначеним, щоб нічого не представляло .

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

Так, наприклад, повернене значення функції, що не визначає значення повернення, не визначене. Значення властивості, не визначеного на об'єкті, не визначене. Повернене значення оператора, яке не є виразом, не визначене (хоча ви не побачите, що це відбувається, крім консолі).
Зауважте, що ви можете створити функцію, яка явно повертається, undefinedі ви можете явно визначити властивість зі значенням undefinedна об'єкті, оскільки врешті-решт це дійсне значення. Ви зробите це для того, щоб явно спілкуватися, щоб щось не було визначено .

Ви можете подумати про відносини undefinedі nullяк про це між NaNі 0.


"Повернене значення функції, що не визначає значення повернення, не визначене", ви маєте на увазі undefinedце void?
Saeed Neamati

@Saeed: Не зовсім. voidу JavaScript є унарним оператором , який приймає будь-який аргумент і повертає значення undefined .
back2dos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.