Питання Чи існує стандартна функція перевірки наявності нульових, невизначених або порожніх змінних в JavaScript?


Чи існує універсальна функція JavaScript, яка перевіряє наявність змінної та гарантує її відсутність undefined або null? У мене є цей код, але я не впевнений, що він охоплює всі випадки:

function isEmpty(val){
    return (val === undefined || val == null || val.length <= 0) ? true : false;
}

1609
2018-04-01 15:14


походження


можливий дублікат Як перевірити наявність порожньої рядка у JavaScript? - Dour High Arch
Я зробив скрипку для тестування: jsfiddle.net/J7m7m/886 - D-Money
Протип, ніколи не робіть (truthy statement) ? true : false;. Просто робіть (truthy statement);. - David Baucum
Можливі дублікати Як перевірити наявність порожньої рядка у JavaScript? - George Jempty
@GeorgeJempty не дуп, бо інша відповідь запитує про рядки зокрема, тоді як про це питаєш змінні. - Madbreaks


Відповіді:


Ви можете просто перевірити, чи є змінна має truthy цінність чи ні. Це означає

if( value ) {
}

оцінить до true якщо value є ні:

  • нуль
  • невизначено
  • NaN
  • порожня рядок ("")
  • 0
  • помилковий

Наведений вище список представляє все можливе falsy значення в ECMA- / Javascript. Знайдіть його в специфікація біля ToBoolean розділ

Крім того, якщо ви цього не зробите знати чи існує змінна (тобто, якщо така була оголосив) ви повинні перевірити з typeof оператор Наприклад

if( typeof foo !== 'undefined' ) {
    // foo could get resolved and it's defined
}

Якщо ви можете бути впевнені, що a змінна як мінімум оголошується, ви повинні безпосередньо перевірити, чи є він truthy значення, як показано вище.

Далі прочитайте: http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html


3313
2018-04-01 15:17



Що робити, якщо значення є помилковим логічним, який мав намір. Іноді ви хочете вказати значення за замовчуванням, якщо значення відсутнє, що не спрацює, якщо б помилковий логічний номер був переданий. - TruMan1
@ TruMan1: у такому випадку (де ваша логіка диктує перевірку), ви повинні піти, як if( value || value === false ). Те саме стосується і всіх фальшиві цінності, нам потрібно чітко перевірити їх. - jAndy
За винятком значення, яке є масивом. Тлумачення truthy може бути оманливим. У цьому випадку ми повинні перевіряти value.length != 0 для непустого масиву. - user
Просто хочете додати, що якщо ви відчуваєте це if Конструкція синтаксично занадто важка, ви можете використати трійковий оператор, наприклад: var result = undefined ? "truthy" : "falsy". Або якщо ви просто бажаєте примусити до логічного значення, скористайтеся !! оператор, наприклад !!1 // true, !!null // false. - KFL
Також зауважте, що це не буде перевіряти наявність рядків, які містять лише символи пробілу. - Christophe Roussy


Вербальний спосіб перевірити, чи значення невизначене або нульове:

return value === undefined || value === null;

Ви також можете скористатись == оператор, але це очікує на це знати всі правила:

return value == null; // also returns true if value is undefined

151
2018-04-01 15:20



Перевірка тільки для null або undefined можна зробити так: if (value == null). Пам'ятай == оператор, що примушує Якщо ви це зробите, перевірте це if (value === null || value === undefined), ви забули / не знаєте, як Javascript примушує. webreflection.blogspot.nl/2010/10/... - Christiaan Westerbeek
@ Християн Вестербек: ваш погляд, що arg == null виробляє ті самі результати, що й arg === undefined || arg === null. Однак я розглядаю останній приклад більш читабельним. - Salman A
arg == null є досить поширеним у моєму досвіді. - Bryan Downing
return value === (void 0) безпечніше, ніж тестування проти undefined яка, можливо, є законною змінною за обсягом, на жаль. - x0n
@ Sharky Існує різниця між невизначеною змінною та незадекларованою змінною: lucybain.com/blog/2014/null-undefined-undeclared - Christiaan Westerbeek


function isEmpty(value){
  return (value == null || value.length === 0);
}

Це повернеться вірно для

undefined  // Because undefined == null

null

[]

""

і функція нульового аргументу, оскільки функція length це кількість заявлених параметрів, які вона потребує.

Щоб заборонити останню категорію, ви можете просто перевірити наявність порожніх рядків

function isEmpty(value){
  return (value == null || value === '');
}

55
2018-04-01 15:19



undefined == null але undefined !== null - Ian Boyd
@IanBoyd це тому, що ви порівнюєте == ====. це означає, що undefined == null (true) undefined! = null (false) undefined === null (false) undefined! == null (true) було б краще дати трохи більше інформації, щоб бути корисним і штовхати людей в правильному напрямку. Моз Док на різницю developer.mozilla.org/en-US/docs/Web/JavaScript/... - Corey Young
@AdamLeggett, правдивість не входить до неї. - Mike Samuel
Вибачте, я помиляюся. - Adam Leggett


Я знаю, що це старе питання, але це найбезпечніша перевірка, і я не бачив, що він опублікував тут саме так:

if (typeof value != 'undefined' && value) {
    //deal with value'
};

Це буде охоплювати випадки, коли вартість ніколи не було визначено, а також будь-який з них:

  • нуль
  • undefined (значення невизначеного значення не співпадає з параметром, який ніколи не визначався)
  • 0
  • "" (порожня рядок)
  • помилковий
  • NaN

П.С. немає необхідності суворої рівності в Росії typeof значення! = 'undefined'


26
2017-11-10 16:13



Що з падінням голосів ?! Деякі строгі фанатики рівності в будинку. О, почекайте, вам сказали завжди використовувати сувору рівність, і ви завжди робите те, що вам сказали, чи не так? - guya
Я не зменшувався, але щодо суворого порівняння рівності, загальне правило полягає в тому, що, якщо ви треба Неявний тип перетворення, ніж суворе порівняння, слід використовувати. - J.Steve
Тонк для вашого коментарю Стів. Це загальне правило відмінно. Я просто очікую, що для ppl зрозуміють, чому вони використовують той чи інший. Кожен, котрий ви дивитесь, буде рада проповідувати вас про "завжди завжди суворо" - як це найголовніше в Javascript. Я бачив дуже багато справ, як якщо (val! == null) що, очевидно, призведе до небажаного результату. Добре сказати, що коли ви сумніваєтесь - використовуйте суворі, але краще не сумніватися. - guya
Я думаю, тут справа в тому, що ми очікуємо цього typeof Оператор повертає рядок таким чином, використовуючи строгу перевірку рівності, є технічно більш точною, конкретною та швидшою. Насправді, немає ніяких підстав скористатися вільним порівнянням, а не навпаки. Також val !== null цілком справедливо в багатьох випадках - я роблю це весь час. Я згоден з вашим аргументом невідповідності, але я думаю, що це поганий приклад, з яким це можна зробити. Не намагаюсь тебе тролліти. - Bryan Downing
Thanx для вашого коментарю Брайан, Ви використовуєте val! == null, тому що ви знаєте, що ви робите. Початківець хоче мати відставання, коли val є фальшивим. Але, val не буде нульовим, це буде невизначеною. Якщо тільки він не послухався цієї поради, "завжди завжди використовуйте суворі", у нього буде менше помилок. Я бачив, що це відбувається у виробничому коді. typeof завжди повертає рядок і швидкість diff буде зайвою. Отже, єдиним аргументом на користь застосування суворого у вищезгаданому випадку є узгодженість. Я сказав: "Немає потреби в суворій рівності". Це не означає, що ви не можете, якщо хочете, або якщо він робить ваш код більш послідовним. - guya


Перша відповідь з найкращим рейтингом неправильна. Якщо значення невизначене, він буде виключати в сучасних браузерах. Ви повинні використовувати:

if (typeof(value) !== "undefined" && value)

або

if (typeof value  !== "undefined" && value)

25
2018-03-19 13:23



Eee ... Я думаю, що це неправильно, якби (достатньо) цілком достатньо (крім порожніх об'єктів / масивів). якщо значення "undefined", конфінація "if" не пройде. - Oskar Szura
Це об'єднує змінні, які не визначені (які кидають ReferenceError на оцінку), які відрізняються від змінних з undefined вартість - Qantas 94 Heavy
Я отримав таку саму помилку тут. якщо (x), якщо (! x), якщо (!! x) буде все кидати помилку, якщо x не визначено. - shaosh
if(value === 0) gameOver();  ;) - Madbreaks
Ця відповідь також неправильна, тому що вона повертає помилково value дорівнює нулю, що є ні який ОП шукає - Madbreaks


Ви можете знайти таку корисну функцію:

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}

Або в ES7 (прокоментуйте, будь ласка, подальші вдосконалення)

function typeOf(obj) {
  const { toString } = Object.prototype;
  const stringified = obj::toString();
  const type = stringified.split(' ')[1].slice(0, -1);

  return type.toLowerCase();
}

Результати:

typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date

"Зауважте, що оператор зв'язку (: :) не є частиною ES2016 (ES7), ні будь-якої пізнішої версії стандарту ECMAScript, це наразі пропозиція 0 ступеня (соломин) для введення мови". - Саймон Келлберг. автор хоче додати свою підтримку цієї красивої пропозиції щодо отримання королівського сходження.


23
2018-02-12 10:32



+1, корисно знати об'єкт типу 'regexp', "масив" і "функція" - Yash
@ Вікс, чому версія ES7 краще? - GollyJer
Це не так, експериментував з більш читабельними способами вираження тієї ж функціональності, використовуючи: розподіл призначення, зв'язування оператора. - Vix
Зауважте, що оператор зв'язку (::) не є частиною ES2016 (ES7), ні будь-якої пізнішої версії стандарту ECMAScript. В даний час це етап 0 (соломин) пропозицію про те, щоб бути представленими на мову. - Simon Kjellberg


! перевірити наявність порожніх рядків (""), нульових, невизначених, помилкових та цифр 0 і NaN. Скажімо, якщо рядок порожній var name = "" потім console.log(!name) повертає true.

function isEmpty(val){
  return !val;
}

ця функція повернеться true, якщо вал є порожній, нульовий, невизначений, невірний, число 0 або NaN.


16
2018-01-23 06:56



Це незрозуміло, якщо змінна порожня, оскільки false і 0 можуть бути дійсними значеннями, а не порожнім. Значення функції isEmpty полягає в тому, щоб переконатися, що значення, які ви очікуєте, є порожніми true true. на мій погляд, null, undefined, NaN, а порожня рядок - значення, які мають сенс як порожні. - Corey Young
Навіщо використовувати isEmpty(val) якщо б ви могли просто зробити !val? - Allen Linatoc
Тобі вирішувати. Ви можете використовувати його для покращення читабельності. Інакше, якщо ви думаєте, що команда, яку ви працюєте, є більш заздалегідь програмістом, то ви можете використовувати це просто !val або !!val відповідно до вашого проблемного домену. - Arif


Ви трохи перевантажили це. Щоб перевірити, чи для змінної не вказано значення, потрібно буде лише перевірити значення undefined і null.

function isEmpty(value){
    return (typeof value === "undefined" || value === null);
}

Це припускає 0, "", а об'єкти (навіть порожній об'єкт і масив) є дійсними "значеннями".


10
2018-04-01 15:21



Перевірка тільки для null або undefined можна зробити так: if (value == null). Пам'ятай == оператор, що примушує Якщо ви це зробите, перевірте це if (value === null || value === undefined), ви забули / не знаєте, як Javascript примушує. webreflection.blogspot.nl/2010/10/... - Christiaan Westerbeek


Ось мій - повертає істину, якщо значення null, undefined і т. Д. Або пусте (тобто містить лише порожні пробіли):

function stringIsEmpty(value) {

    return value ? value.trim().length == 0 : true;

}

9
2018-02-12 15:45