Я трохи розгублений щодо невизначеного Javascript і null.
Не плутайте null
. Це, як правило, має сенс і поводиться аналогічно поняттям інших мов сценаріїв із позадіапазонних об'єктів "null", "nil" або "None".
undefined
з іншого боку, це дивна химерність JavaScript. Це однотонний об'єкт, який представляє позаполосні значення, по суті другий подібний, але різний null
. Виходить:
Коли ви викликаєте функцію з меншою кількістю аргументів, ніж список аргументів у function
списках висловлювань, встановлюються невикористані аргументи undefined
. Ви можете перевірити на це, наприклад:
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
За допомогою цього методу ви не можете визначити різницю між dosomething(1)
та dosomething(1, undefined)
; arg2
буде однакове значення в обох. Якщо вам потрібно сказати різницю, ви можете подивитися arguments.length
, але такі необов'язкові аргументи, як правило, не дуже читабельні.
Якщо функції немає return value;
, вона повертається undefined
. Взагалі не потрібно використовувати такий результат повернення.
Коли ви оголошуєте змінну, маючи var a
оператор у блоці, але ще не призначили їй значення, воно є undefined
. Знову ж таки, вам ніколи не потрібно покладатися на це.
Моторошний typeof
оператор повертається, 'undefined'
коли його операнд є простою змінною, яка не існує, замість того, щоб видавати помилку, як це було б зазвичай, якщо ви намагалися посилатися на неї. (Ви також можете надати йому просту змінну, загорнену в круглі дужки, але не повний вираз із участю неіснуючої змінної.) Не надто корисно для цього.
Це спірне. Коли ви отримуєте доступ до властивості об'єкта, який не існує, ви не одразу отримуєте помилку, як і на будь-якій іншій мові. Натомість ви отримуєте undefined
об’єкт. (І тоді, коли ви спробуєте використовувати цей undefined
об’єкт пізніше в сценарії, він піде не так, як це дивно, це набагато складніше відстежити, ніж якби JavaScript щойно видав помилку.)
Це часто використовується для перевірки наявності властивостей:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
Однак, оскільки ви можете призначити, undefined
як і будь-яке інше значення:
o.prop= undefined;
це насправді не визначає, чи є властивість надійно. Краще скористатися in
оператором, якого не було в оригінальній версії JavaScript Netscape, але зараз він доступний скрізь:
if ('prop' in o)
...
Підводячи підсумок, undefined
це специфічний для JavaScript безлад, який бентежить всіх. Крім необов'язкових аргументів функцій, де JS не має іншого більш елегантного механізму, undefined
слід уникати. Це ніколи не повинно бути частиною мови; null
працював би добре для (2) і (3), а (4) - це невдача, яка існує лише тому, що на початку JavaScript не мав винятків.
що if (!testvar)
насправді робить? Чи перевіряється це на невизначений і недійсний чи просто невизначений?
Такий «truthiness» тест перевіряє проти false
, undefined
, null
, 0
, NaN
і порожні рядки. Але в цьому випадку так, це дійсно undefined
це стосується. ІМО, слід про це більш чітко сказати і сказати if (testvar!==undefined)
.
як тільки змінна буде визначена, чи можу я очистити її до невизначеної (тому видалення змінної).
Ви, звичайно, можете призначити undefined
його, але це не видалить змінну. Тільки delete object.property
оператор дійсно видаляє речі.
delete
насправді призначений для властивостей, а не змінних як таких. Браузери дозволять вам відійти від прямого delete variable
, але це не дуже гарна ідея і не буде працювати в суворому режимі ECMAScript Fifth Edition. Якщо ви хочете звільнити посилання на щось, щоб воно могло бути зібрано сміття, було б звичніше сказати variable= null
.
чи можу я пройти невизначений як параметр?
Так.