Jump to content
  • 0

Проверка вариаблы на существование


animegirl
 Share

Question

Выработала привычку писать проверку через

if(typeof variable != 'undefined')if(typeof variable == 'undefined')

наткнулась где-то на утверждение, что если писать напрямую

if(variable)if(!variable)

то будет тот же самый результат, это правда?

Link to comment
Share on other sites

19 answers to this question

Recommended Posts

  • 0

Неправда. Проверить очень просто: открываем консоль и пишем if (!x) alert(1);, любуемся на ошибку.

Так можно проверять только внутри функций, т.к. там переменным уже присвоено undefined.

Link to comment
Share on other sites

  • 0

Неправда. Проверить очень просто: открываем консоль и пишем if (!x) alert(1);, любуемся на ошибку.

Так можно проверять только внутри функций, т.к. там переменным уже присвоено undefined.

То есть, если у меня весь код построен на функциях, то этот метод хорош и без негативных последствий?

Link to comment
Share on other sites

  • 0

Выработала привычку писать проверку через

if(typeof variable != 'undefined')if(typeof variable == 'undefined')

наткнулась где-то на утверждение, что если писать напрямую

if(variable)if(!variable)

то будет тот же самый результат, это правда?

 

Надо отметить, что второй вариант определит как несуществующую также переменную, значение которой — пустая строка, null, 0, false, NaN. А это могут быть уже присвоенные и нужные значения.

 

Первый вариант (с typeof) привык использовать и я, потому что значение undefined может быть переопределено, и простым сравнением тут не обойтись, если не уделить этому внимание явно. А проверка типа должна дать верный результат в любом случае.

Link to comment
Share on other sites

  • 0

 

Выработала привычку писать проверку через

if(typeof variable != 'undefined')if(typeof variable == 'undefined')

наткнулась где-то на утверждение, что если писать напрямую

if(variable)if(!variable)

то будет тот же самый результат, это правда?

 

Надо отметить, что второй вариант определит как несуществующую также переменную, значение которой — пустая строка, null, 0, false, NaN. А это могут быть уже присвоенные и нужные значения.

 

Первый вариант (с typeof) привык использовать и я, потому что значение undefined может быть переопределено, и простым сравнением тут не обойтись, если не уделить этому внимание явно. А проверка типа должна дать верный результат в любом случае.

 

У меня тут такая проблема, минимизатор от яху загнулся от нашего кода и мне сказали оптимизировать (минимизировать) код где есть возможность. А этого typeof у меня везде и повсюду тоннами, заглушки в основном, что бы ошибки не вылетали при неопределённой вариабле. Вот думала, о том, что с этим сделать бы такого. Может быть в функцию на одну-две буквы переделать? И минимально и логика не рушится вроде бы.

Link to comment
Share on other sites

  • 0

То есть, если у меня весь код построен на функциях, то этот метод хорош и без негативных последствий?

Да, но лучше так не делать. Можно потом запутаться и нажить себе (или тому кто будет потом код читать) геморрой.

UPD:

Если вы в глобальной области видимости находитесь, то можно так проверить:

if (!window.x) alert(1);
Link to comment
Share on other sites

  • 0

 

То есть, если у меня весь код построен на функциях, то этот метод хорош и без негативных последствий?

Да, но лучше так не делать. Можно потом запутаться и нажить себе (или тому кто будет потом код читать) геморрой.

UPD:

Если вы в глобальной области видимости находитесь, то можно так проверить:

if (!window.x) alert(1);

Нет, в глобальной определены несколько основопологающих вариабл + массив для взаимного обмена информацией в функциях. Всё остальное происходит исключительно с вызова функций, либо предопределённых через var, либо анонимных в евентах, на самый крайний случай анонимные самозапускаемые. Структура кода не позволяет вообще как-либо просачиваться в глобальную область. Большая часть проверок относятся к выше упомянутому массиву, когда функции нужна информация, но сначала надо проверить существует ли необходимая запись или надо её создать для начала.

Link to comment
Share on other sites

  • 0

Я всё равно не рекомендую отказываться о typeof. Вот вам две ситуации:

тут всё ок:

function foo(x, y, B) {  if (!B) alert(1);}foo(1, 2);
а тут плохо:

function foo(x, y, d) {  if (!B) alert(1);}foo(1, 2);
Запутаться будет очень просто.
Link to comment
Share on other sites

  • 0

Я всё равно не рекомендую отказываться о typeof. Вот вам две ситуации:

тут всё ок:

function foo(x, y,  {  if (! alert(1);}foo(1, 2);
а тут плохо:

function foo(x, y, d) {  if (! alert(1);}foo(1, 2);
Запутаться будет очень просто.

 

 

Я решила такой костыль сделать:

var cv=function(v){return (typeof v!='undefined'?true:false);}

Теперь вместо

if(typeof variable != 'undefined')if(typeof variable == 'undefined')

будет

if(cv(variable))if(!cv(variable))
Link to comment
Share on other sites

  • 0

непонятно, что такое cv (как читать, что значит).

 

Не надо так уж сильно экономить буквы, почему бы не

function exists(x) {    return typeof x != 'undefined';}

ну или саму функцию можно назвать 'defined', дело вкуса.

 

А если вы уж так сильно экономите байты (хотя gzip на сервере делает это занятие почти бессмысленным), то и вашу cv можно сократить:

function cv(v) {    return typeof v != 'undefined';}

Тернарный оператор там не нужен, да и зачем использовать Function Expression в этом случае? Тут Function Declaration, насколько я вижу, проблем не принесет, а запись короче.

 

Ну и надо заметить, что в момент вызова несуществующая переменная, похоже, приведет к ошибке. Так можно отследить только неопределенную переменную.

Link to comment
Share on other sites

  • 0

непонятно, что такое cv (как читать, что значит).

 

Не надо так уж сильно экономить буквы, почему бы не

function exists(x) {    return typeof x != 'undefined';}

ну или саму функцию можно назвать 'defined', дело вкуса.

 

Check Variable жеж

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

 

 

 

Тернарный оператор там не нужен, да и зачем использовать Function Expression в этом случае? Тут Function Declaration, насколько я вижу, проблем не принесет, а запись короче.

Подчёркнутое - незнакомые мне термины, можете пояснить о чём вы пишите?

 

 

Ну и надо заметить, что в момент вызова несуществующая переменная, похоже, приведет к ошибке. Так можно отследить только неопределенную переменную.

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

Link to comment
Share on other sites

  • 0

Тернарный оператор — это выражение «? :» — там первое выражение, которое вы проверяете, уже возвращает нужный результат, не надо явно возвращать true или false.

 

Function Expression — это в вашем случае объявление функции с явным присваиванием ее переменной (var cv = function…), Function Declaration — объявление сразу именованной функции (function cv(v) {…}) — в этом случае разницы не должно быть никакой для вас, а запись короче.

 

Ну и насчет ошибки (тут не могу утверждать со 100% уверенностью, что правильно понимаю работу интерпретатора, скорее моя версия) — при вызове функции cv(notexists) произойдет обращение к переменной notexists, чтобы передать ее в виде параметра, и если ее не существует — будет ошибка. До того, как внутри функции выполнится проверка.

Link to comment
Share on other sites

  • 0

Некоторое время назад (2 months ago) я положил на github небольшую "библиотеку" преимущественно для типизации и использования в тестах.

Можешь взять мега функцию оттуда :)

 

Кстати, надо функцию наследования туда добавить =)

Edited by nerv
Link to comment
Share on other sites

  • 0

Некоторое время назад (2 months ago) я написал для себя небольшую "библиотеку" преимущественно для типизации и использования в тестах.

Можешь взять мега функцию оттуда :)

 

Кстати, надо функцию наследования туда добавить =)

 

Ээээээ undefined можно писать без ковычек?????

Переняла функцию. А а то время, что вы её используете подводных камней не спотыкалось?

Link to comment
Share on other sites

  • 0

Ээээээ undefined можно писать без ковычек?????

Переняла функцию. А а то время, что вы её используете подводных камней не спотыкалось?

Можно без кавычек. Обратите внимание, что используется эквивалентность, а не равенство (===) и не используется typeof (но это сложно не заметить)

Также эта функция может дать сбой, если где-то в скрипте определена переменная с именем undefined (обычно так не делают, но если используется много скриптов от разных авторов, стоит быть осторожнее).

Link to comment
Share on other sites

  • 0

Можно без кавычек.

Тут надо сделать ремарку, что кто-то в программе может переопределить переменную undefined. Так что typeof + кавычки всё же надёжнее. Можно вот так извратится (если мы байты кода экономим):

function exists(x) {    return typeof x !== void 0;}
Link to comment
Share on other sites

  • 0
А а то время, что вы её используете подводных камней не спотыкалось?

Какие камни? Там одна проверка)

 

а не равенство (===)

равенство, это так ==

 

Также эта функция может дать сбой, если где-то в скрипте определена переменная с именем undefined

Не может, т.к. переменные в js имеют лексическую область видимости http://learn.javascript.ru/play/2srheb

 

что кто-то в программе может переопределить переменную undefined
 

В строгом режиме нельзя http://learn.javascript.ru/play/qEHpKb

 

А еще кто-то может удалить документ или переопределить глобальные конструкторы. От этого тоже защищаться будете?

 

---

 

В целом, на мой взгляд, вопрос задан неверно, т.к. обращение к несуществующей (необъявленной) переменной вызовет ошибку http://learn.javascript.ru/play/PN1gA

Другое дело, аргументы внутри функции. Т.к. в js функция может вызываться с произвольным кол-во аргументов, вне зависимости от того, с каким кол-вом параметров она объявлена, то, можно ориентироваться по кол-ву переданных в функцию аргументов http://learn.javascript.ru/play/Dylqcc

Link to comment
Share on other sites

  • 0
равенство, это так ==

Поэтому я и сказал, что используется именно эквивалентность, а не равенство, и обратил внимание, как записывается эквивалентность.

 

Насчет переменной undefined

Не может, т.к. переменные в js имеют лексическую область видимости

Разумеется речь идет о глобальной переменной. Разумеется, мы не можем гарантировать, что скрипт работает в строгом режиме. Разумеется, встретить такое на практике — надо еще поискать. Но если есть способ, устойчивый к этой ошибке — почему бы не использовать его?

Link to comment
Share on other sites

  • 0
Но если есть способ, устойчивый к этой ошибке — почему бы не использовать его?
А еще кто-то может удалить документ или переопределить глобальные конструкторы. От этого тоже защищаться будете?
 

Если кто-то захочет сломать ваш код и у него есть мозги, он его сломает. Напротив, если у кого то руки растут не из того места, вряд ли один undefined вас спасет.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy