function empty( mixed_var ) { // Determine whether a variable is empty
//
// + original by: Philippe Baumann
return ( mixed_var === "" || mixed_var === 0 || mixed_var === "0" || mixed_var === null || mixed_var === false || ( is_array(mixed_var) && mixed_var.length === 0 ) );
}
Приведенная функция не аналогична PHP-шной функции empty. В PHP функция empty применима к переменным которые не определены, то есть перед проверкой на пустоту фактически производится скрытый вызов isset(). На самом деле все немного сложнее, но, если смотреть "невооруженным" глазом - все именно так. Полностью смоделировать такое поведение в javascript, к сожалению, невозможно, так как в PHP возможен вариант когда в качестве параметра функции empty передается НЕСУЩЕСТВУЮЩАЯ переменная, например:
В данном случае результат будет, естественно, true.
В javascript (булыжник в огород эксмо), передать в качестве параметра несуществующую переменную попросту невозможно - интерпретатор нам тут же надает по рукам - мол нефиг впихивать несуществующее. Однако представьте себе такой вариант:
Так вот, если вызвать doTest() и не передавать в качестве параметра ничего, что собственно (второй булыжник в огород эксмо), нам никто делать не запрещает, то функция empty, вернет false, что, как мне кажется, не совсем гуд. В принципе это всего-лишь одна из возможных ситуаций, но иллюстрирует проблему она очень даже неплохо.
Отсюда вывод - надо бы добавить в условие проверки строку следующего вида:
При таком подходе результат приведенной функции действительно, за исключением мелких особенностей обоих языков, будет практически соответствовать PHP-шному аналогу.
С уважение
hacpaka
P.S. Автору сайта огромный поклон как профессионалу и истинному мастеру своего дела.
Именно так))) спс, помогло не таскать лишних функций
Добавлю, что при таком коде:
if(a.value != undefined)
задача у меня решается в 99 случаях из 100, так как возвращаемые значения обычно сгенерированная строка.
JS умеет работать с необъявленными переменными, но только внутри оператора typeof:
Однако речь идет не об использовании несуществующей переменной, а о заявленном параметре функции который не был передан в некоторой цепочке вызовов. С точки зрения javascript такая переменная вроде как и существует, но равна 'undefined'.
То есть в таком варианте:
На нас будут ругаться. Долго и матом.
В то же время в таком варианте:
что эквивалентно фактически:
Все пройдет как по маслу. А вышеприведенная функция в исходном виде вернет неверный результат. И если использовать её без указанного мною изменения - такое обстоятельство вполне способно подпортить нервы непосвященным во все тонкости стандартизированного ЭКСМО эфира, обывателю)
Вы говорили, что в JS нельзя определить передачу несуществующей переменной, я показал как это сделать средствами языка. Что же касается передачи необъявленной переменной в функцию или использование ее в выражении, то тут JS делает все правильно: использование необъявленных переменных - дурной тон.
Да, и если Вам нужно отдельно обрабатывать случай, когда в функцию ничего не передали, проверяйте
P.S. ЭКСМО это издательство в РФ, а организация, стандартизирующая JS (ECMAScript) зовется ECMA.
Уважаемый коллега - приведенные примеры демонстрируют существование проблемы. Речь идет не о дурном тоне, а о правильности результата функции. Использование arguments.length вообще имеет смысл когда явные параметры функции не заданы. То есть подразумевается их произвольное количество. Если аргументы заданы - как-то весьма глупо проверять arguments.length, если существует способ проверить существует ли переданное значение непосредственно.
Если функция empty используется в составе длинного выражения и в качестве параметра ей передается результат другой функции либо цепочки функций, то логично предположить что проверка на существование аргумента ложна осуществляться внутри самой функции а не полагаться в таких делах на сторонние проверки.
Вынесение проверок, способных повлиять на итоговый результат за пределы функции либо блока кода, который собственно и занимается получением этого результата - это и есть плохой стиль, как вы поспешили отметить)
P.S. Насчет издательства в россии в курсе - но так уж получилось - привык. Это как "чмо" и "мачо" из анекдота, если вы понимаете о чем я)))
По одному только списку аргументов функции Вы никогда не узнаете, сколько на самом деле было передано аргументов функции. Если они все undefined - еще неизвестно, действительно ли были переданы undefined'ы, или просто функция была вызвана без аргументов. arguments.length позволит точно ответить на этот вопрос.
Почему проверка переменной должна проводиться где-то там, глубоко в других функциях - непонятно. Ведь уже на текущем этапе видно, что переменная не существует и делать с ней нечего.
И еще: в php isset и empty это ни разу не функции. Это конструкции языка. Поэтому такое употребление допустимо.
К сожалению, вы разводите холивары по несущественному поводу. Макросы isset и empty в PHP действительно не являются функциями, но задача этого топика - смоделировать их поведения средствами javasctript. Подумайте сами - если существует аргумент функции который может принимать то или иное значение, то проверка допустимых значений должна проводится внутри функции, особенно если при различных значениях аргумента функция может давать неверный результат - что вообще бич слаботипизированных языков. Необходимость такой внутренней проверки, вызвана в первую очередь тем фактом, что вы не в состоянии гарантировать что именно сторонний разработчик передаст в вашу функцию. И полагаться на то что проверка будет произведена до вызова функции - это не просто плохой стиль, это, пардом, говнокод. Причем мне кажется, вы сами это прекрасно понимаете, а спорите просто из желания похоливарить)
Дальше, вы говорите:
Скажите пожалуйста, уважаемый колега, а зачем мне в данном конкретном случае, знать количество аргументов переданных функции? Как я уже говорил знать количество аргументов мне важно только если функция подразумевает передачу произвольного числа аргументов. Если же количество аргументов фиксировано, то узнать передан аргумент или нет лучше именно по его имени. Это означает в частности, что если количество переданных аргументов больше количества явно объявленных, то объявленные будут иметь какое-нибудь значение, и, соответственно, наоборот.
Скажите пожалуйста почему функция которая должна вести себя аналогично empty в PHP должна вызывать ошибку если ей банально не будет передан аргумент? Она должна вернуть true, потому что ничего - оно и есть ничего, правда физики со мной не согласятся)))
Далее
А какая именно вам разница? В любом случае вернет true. Или вам так хочется выводить внутри функции алерт с текстом "Чего впихуешь невпихуемое, отрок позорный?!!". Не вижу смысла. Зачем вообще лишняя проверка?
Далее
Я уже писал выше почему. Скажите пожалуйста, а если не видно? Или вы не можете представить себе такую ситуацию?
Предлагаю 'mixed_var === "" ' поменять на 'trim(mixed_var) === "" ' для отлавливания и "пробельных" INPUT-ов, а также: return поменять на IF, чтобы функция всегда возвращала только истину или ложь. Окончательный вариант:
По trim() см.:
http://javascript.ru/php/trim
http://javascript.ru/php/trim-0
насчет trim - оно, пожалуй, таки неплохо будет, а вот if - там грамоздок и излишен. При таком варианте например всегда будет либо истина либо ложь:
Конструкции языка на то и встроены в язык, что их нельзя реализовать самостоятельно. Они могут работать с внутренностями движка, недоступными для пользовательского кода.
Ну и неполноценность многих решений из этого раздела очевидна.
Каких значений? У необъявленной переменной нет и не может быть значения. Зачем делать что-то, когда ясно, что нас ждет ошибка (см. ответ на последний абзац)?
А кто говорит, что она должна вызывать ошибку? Своим примером я лишь хотел указать на возможность индивидуальной обработки случая, в котором переменная не передается.
Никакой. Но это единственный способ отличить передачу undefined'а от вызова функции без аргументов. Может ли это понадобится - не знаю, но иметь такую возможность не помешает.
Нет, не могу. Или Вы рассчитываете, что где-то там, внутри переменная определится? Опять же, это нарушение логики (Вспоминаем про процедуры, возвращающие значение по ссылке, переданной аргументом).
Опять вы за свое. неугомонный вы мой, моляр))) (с)
Что значит "нельзя реализовать самостоятельно"? А что вам мешает написать, например, свою php-функцию _empty(), которая будет полностью повторять поведение макроса empty? Разница только в том лишь будет что empty "вкомпиливается", если так можно выразиться, непосредственно в исходный код - на то он и макрос, а ваша функция будет вести себя как обычная функция языка. Это конечно "изврат" - но это не означает что этого сделать нельзя))) В большинстве случаев, впрочем, к сожалению)))
Цель топика, еще раз оговорюсь, реализовать аналоги со стороны javascript - понятно дело что доступными средствами. Вы со мной согласны?
Именно так. Поэтому я и предложил способ сделать приведенный код "более полноценным" что ли. А вы вот чем-то недовольны)
Такой подход хорош в компилируемых языках. В концепции javascript не объявленная переменная это так сказать "неименованное" ничто - анонимная пустота, если хотите) причем тут ошибка? Если в функцию каким-либо образом запихнули эту самую пустоту - надо бы не ругаться, а деловито сообщить - да, действительно пустота - то есть вернуть true, в нашем случае.
И как по вашему должна повлиять такая возможность "под рукой" на результат ДАННОЙ КОНКРЕТНОЙ функции? Очень интересно услышать)
Кхм. А вы о чем?
У меня возвращает "false true". А в исходном варианте? Думаете тоже самое? Я что-то сомневаюсь.
По вашему проверка этой функцией существование, пардон, члена объекта - это тоже "плохой стиль". А для чего она тогда вообще нужна?
Мешает использование необъявленной переменной в этом случае. Покажите мне функцию, полностью повторяющую empty, в том числе и при
Мой первоначальный пост был лишь поправкой, в которой я говорил, что в JS все-таки можно работать с необъявленными переменными, не вызывая ошибок. И, опять же, в пределах конструкции языка.
Что-что? Где в стандарте о чем-либо таком написано? В концепции JS, как и многих других языков, необъявленная переменная вообще не существует.
Очевидно, что для проверки на пустоту. Считать ли необъявленные переменные / свойства объектов пустыми - вопрос (хотя если стоит цель скопировать поведение php, то можно не задумываться об этом)
Вот есть такие люди, уважаемый коллега, которые готовы спорить почем зря, проявляя некомпетентность и, даже порой, неграмотность, с той лишь целью, что бы их пост оказался последним) Мир полон загадок как говорится...
Как-то странно получается, уважаемый коллега, вам это мешает а мне нет. Невольно вспоминается поговорка про танцора - уж простите). Делается это просто и валидно - с использованием ссылки:
А что бы вы опять не изобретали доводы - вот вам даже код:
Что-то типа того. Впрочем может я что-то и не учел - линь читать доку. Естественно использование указателя накладывает некоторые ограничения на использование функции, но в том-то и проблема что макрос empty обладает практически такими же ограничениями, разе что тексты ошибок несколько изменятся)
Далее
Этот так сказать аспект подразумевается не стандартом (любой стандарт о таких вещах попросту умалчивает), а реализацией интерпретатора. Покалупайте как-нибудь на досуге палочкой какую-нибудь реализацию эксмо - убедитесь сами.
Это вопрос с точки зрения философии, уважаемый коллега, а вот с точки зрения программирования они либо являются пустыми, либо нет. Я так понимаю вы предлагаете считать их, так сказать, полными? Чтож, оптимизм - дело похвально. Только малооплачиваемое, к сожалению.
Поэтому предлагаю послать все подальше, и по старой славянской традиции, вмазать по пивку)))
Хорошо, думаю, пора прекратить этот бессмысленный спор.
Преабсолютнейше с вами согласен, уважаемый коллега. Тем более пользы от него непосвященному лицу - мало. Надо бы еще уговорить "власть имущих" подправить таки функцию. Не к лицу такому солидному порталу выкладывать дырявый код)
*** продублировалось ***
((( в мире нет ничего идеального
Что интересно - приведенный код все также остается неизменным))) Несовершенство этого мира иногда просто поражает)
Блин,все примеры - на 0 - говорят что пусто,а НОЛЬ то блэть может изпользоватся как и ЧИСЛО,а оно напишет что числа НЕТ!...
мой вариант:
А вы вообще заголовок топика читали? Здесь приводятся аналоги функций PHP и ведется обсуждение насколько, собственно, эти аналоги являются аналогами в действительности. В концепции PHP "0" это действительно, пардон, пусто. Причем пусто, несмотря на то чем этот ноль является в действительности - целочисленным нулевым значением, либо строкой, содержащей "0". Поэтому приведенный вами фрагмент никакого отношения к этому топику не имеет.
Я посоветовал бы вам в следующий раз внимательно читать что и где вы пишете, а заодно и воздержаться от написание подобных "перлов", особенно с использованием switch-блоков где не попадя.
С уважением
hacpaka
Уважаемые, но is_array - это вообще-то не javascript функция.
Далее. Если я передам в функцию массив вида:
var address = new Array();
address.street = "Строителей";
empty(address); // вернет true. Хотя массив не пустой.
Классическая ситуация в лучших традициях жанра. "Знаток" пришёл, написал бред и не подписавшись ушел. Наверное что бы потом не краснеть.
Вы, уважаемый комментатор, вообще разницу между массивом и объектом понимаете?
Если вы напишете так:
То массив останется пустым. Но вот Объект инкапсулирующий функционал массива получит новое свойство "street". Можете проверить длину массива если не верите. Если вы хотите добавить что-то в массив - используйте такой синтаксис:
или такой:
Другими словами ваш пример ошибочен, а логика работы функции empty правильная.
Что касается "is_array" - обратите внимание в какой теме вы находитесь и какую статью комментируете. Безусловно is_array не функция javascript, но существует аналог, точно также как и empty.
Учите матчасть, товарищи)