Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проверка на наличие переменной (https://javascript.ru/forum/misc/57596-proverka-na-nalichie-peremennojj.html)

vuler 11.08.2015 12:43

Проверка на наличие переменной
 
Добрый день. К сожалению не нашел ответ на достаточно простой вопрос, не знаю как сформулировать :).
В общем есть объект с вложенными объектами и массивами, и нам нужно проверить существует ли определенная переменная в нем.
Пишу условие
function full_null(elem){//Проверка на полный ноль. отстутсвие или несуществование.
	if (elem=='undefined' || elem==null || elem==""){
		return true;
	}else return false;
}
if (full_null(this.form.rulers.format[this.name])) 
			this.rulers.format=this.form.rulers.format[this.name];

Тут идет проверка на существование в массиве формат, элемента с ключем this.name
Но выдается ошибка
TypeError: this.form.rulers.format is undefined
т.е. сам массив format не был задан. В результате приходится вначале делать проверку на наличие массива - format, а затем уже проверять на наличие в нем this.name. Можно как-то задать проверку в одну строку без двойных условий и try-catch конструкций?

javaQest 11.08.2015 13:02

Цитата:

Сообщение от vuler
существует ли определенная переменная в нем

то есть, в самом, а не во вложенных? Если так, то это очень просто
alert("a" in {a: 1})

vuler 11.08.2015 13:19

Это немного не то, все равно выдаст ошибку. Вариант только такой.
try{
			if (!full_null(this.form.rulers.format[this.name])) 
				this.rulers.format=this.form.rulers.format[this.name];
		}catch(err){
			// console.log(err);
		}

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

javaQest 11.08.2015 13:33

Цитата:

Сообщение от vuler
elem==""

Короче, хз, чего вам надо, но н всякий случай это уберите, это не входит в
Цитата:

Проверка на полный ноль. отстутсвие или несуществование.
впрочем и undefined тоже туда не входит, не говоря уже об "undefined"(в кавычках)

и используйте строгую проверку. ==/===

javaQest 11.08.2015 13:38

Цитата:

Сообщение от vuler
это увеличивает размер кода

Вам сейчас надо не о размере кода думать, а о том, чтобы освоить основы JS. О размере кода Вам еще не скоро задумываться придется:)

vuler 11.08.2015 13:53

Мы с тобой видимо на разных языках говорим :). Вроде все понятно объяснил, а ты все не в ту степь :)

vuler 11.08.2015 14:03

Я так понял тебя смутила функция full_null, давай ее уберем.
Этот код работает.
if (typeof this.form.rulers.format !='undefined' ){
			if (typeof this.form.rulers.format[this.name] !='undefined'){
				this.rulers.format=this.form.rulers.format[this.name];
			}
		}

Этот нет. (выдает ошибку)
if (typeof this.form.rulers.format[this.name] !='undefined'){
				this.rulers.format=this.form.rulers.format[this.name];
			}

Не работает потому-что this.form.rulers.format = undefined
Мне нужно убрать проверки условий..может быть запись obj1.obj2.obj3.obj4 и т.д.
мне делать проверки на существование каждого обекта?

if (typeof obj1 !='undefined'){
  if (typeof obj1.obj2 !='undefined'){
    и т.д.
 }
}

javaQest 11.08.2015 14:09

vuler,
Хорошо, сначала, по шагам. Определесь, для начала, что ты на самом деле чекаешь, переменную или ее значение. По вопросу, вроде, переменную, а по коду -- значение. Затем продолжим.

javaQest 11.08.2015 14:15

vuler,
Короче, как я понял по коду, тебе нужны значения ключей.

Первая твоя ошибка -- elem=="undefined", пиши, elem===undefined, но при этом ты должен учитывать, что так ты отсутствие элемента не определишь, это вычислиться в true и в случае отсутствия элемента, и в слуачае, если значение элемента undefined.

javaQest 11.08.2015 14:18

Цитата:

Сообщение от vuler
elem==""

это тоже непонятно, что тебе даст, элементу никто не запрещает быть пустой строкой.

Точно также, любой слот может быть выставлен в false, в [], в {} и так далее. Ты точно все еще хоцешь пилить свой код дальше? Ты хоть озвуч цель этой проверки, внятно.

javaQest 11.08.2015 14:33

В общем, если я тебя правильно понял, тебе нужна вот такая вот параша
check=function(object, name){
  return name in object&&object[name]!== undefined&&object[name]!==""
}

object={real: {}, emptyString: ""}

alert([
 check(object, "emptyString"), 
 check(object, "undef"),
 check(object, "real")
]
)

vuler 11.08.2015 14:48

Слушай я уже до самого простого упростил вопрос
Слушай. Я же уже до простого упростил вопрос, забудь то что выше, если не понятно. Объясни следующее.
//Как получается
If (typeof obj1 !=’undefined’){
	If (typeof obj1.obj2 !=’undefined’){
		If (typeof obj1.obj2.obj3 !=’undefined’){
			var value= obj1.obj2.obj3[0]
                  }
          }
}
//Нужно что-то вроде этого, но без остановки скрипта по ошибкам вроде:
//obj1 - undefined
//obj1.obj2 - undefinded

If (typeof obj1.obj2.obj3 !=’undefined’){
	var value= obj1.obj2.obj3[0]
}


Что касается full_null эта функция пользовательская, мне нужно чтобы значение не было пустым

javaQest 11.08.2015 14:54

вот так попробуй
if(window.obj1&&obj1.obj2&&obj1.obj2.obj3&&obj1.obj2.obj3!==undefined) somecode

javaQest 11.08.2015 15:01

vuler,
А вообще, тебе проще оборачивать в try. Но что-то у тебя явно там не так. В нормальном коде едва ли такое может понадобиться.

KosBeg 11.08.2015 15:42

для начала скажите чему равен
console.log(this.form.rulers.format)
:)
я так понял у вас ошибка в "this", попробуйте использувать напрямую нужную вам переменную)

KosBeg 11.08.2015 15:50

Цитата:

Сообщение от vuler
В результате приходится вначале делать проверку на наличие массива - format, а затем уже проверять на наличие в нем this.name. Можно как-то задать проверку в одну строку без двойных условий и try-catch конструкций?

аа, вот оно чё)
нет, тут наверное никак, если массива нету выдаст ошибку(так и есть)
можно попробывать так
function full_null(elem){//Проверка на полный ноль. отстутсвие или несуществование.
	if (elem=='undefined' || elem==null || elem==""){
		return true;
	}else return false;
}
if (full_null(this.form.rulers.format) && full_null(this.form.rulers.format[this.name]))
			this.rulers.format=this.form.rulers.format[this.name];

javaQest 11.08.2015 15:52

Цитата:

Сообщение от KosBeg
нет, тут наверное никак, если массива нету выдаст ошибку(так и есть)

http://javascript.ru/forum/misc/5759...tml#post383607

vuler 11.08.2015 15:58

Цитата:

Сообщение от KosBeg (Сообщение 383619)
для начала скажите чему равен
console.log(this.form.rulers.format)
:)
я так понял у вас ошибка в "this", попробуйте использувать напрямую нужную вам переменную)

Да нет тут все в порядке с this, просто думал в js есть какае-нибудь дельные функции для проверок :).
В php все проще.
if ($rrrr->ssss->form_rulersq['sss']) {
echo 'тут';
}else{
echo 'там';
}
Например этот код пройдет легко. php плевать на то что объекта rrrr не существует, что в нем не существует объект ssss, что в объекте ssss нет массива form_rulersq и т.д.
просто выдаст условие else и продолжит работу. А js начинает проверять существование всей этой цепочки

javaQest 11.08.2015 16:36

Цитата:

Сообщение от vuler
А js начинает проверять существование всей этой цепочки

да ничо он не проверяет. У тебя ошибка из-за доступа к свойству undefined, которого не существует.
undefined.foo

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

vuler 11.08.2015 16:53

Цитата:

Сообщение от javaQest (Сообщение 383636)
да ничо он не проверяет. У тебя ошибка из-за доступа к свойству undefined, которого не существует.
undefined.foo

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

А вот на счет этого я бы поспорил, что лучше :). Для тебя лучше на Сишке все переменные заранее объявлять, прежде чем с ними что-то делать? И ловить ошибки каждый раз, если ты их не объявил. Или лучше объявлять их динамически, кода понадобятся. Тут можно спорить долго конечно. Везде свои плюсы и минусы. Согласен, что ошибки из-за неверного написания переменных порой заставляют потратить время на их поиск.

javaQest 11.08.2015 16:56

Цитата:

Сообщение от vuler
Или лучше объявлять их динамически, кода понадобятся

кто тебе в js запрещает динамически объявлять переменные? Ты о чем вообше говоришь? В твоем случае не объявления, а обращение к несуществующему слоту.

KosBeg 11.08.2015 16:59

итог один - нужно проверять два раза :)
function full_null(elem){//Проверка на полный ноль. отстутсвие или несуществование.
	if (elem=='undefined' || elem==null || elem==""){
		return true;
	}else return false;
}
if (*!*full_null(this.form.rulers.format) && full_null(this.form.rulers.format[this.name])*/!*)
			this.rulers.format=this.form.rulers.format[this.name];

javaQest 11.08.2015 17:00

vuler,
То есть, ты хочешь сказать, что если я, допустим пишу
foo.bar.baz=1

и при этом foo не существует, все эти объекты будут созданы?

vuler 11.08.2015 17:09

Цитата:

Сообщение от javaQest (Сообщение 383653)
кто тебе в js запрещает динамически объявлять переменные? Ты о чем вообше говоришь? В твоем случае не объявления, а обращение к несуществующему слоту.

Да никто не запрещает, но на один уровень.
только вот так js не сможет :)
if ($rrr->ssss->form_rulersq['sss']) {
			
			}else{
				$rrr->ssss->form_rulersq['sss']++;
				var_dump($rrr->ssss->form_rulersq['sss']);//1
			}


Цитата:

и при этом foo не существует, все эти объекты будут созданы?
Да php создает всю цепочку обхектов, если с конечным элементом что-то сделать. А если просто выполнить проверку на существование, никаких объектов не создаст. Просто скажет, что такой цепочки объектов нет и все.

KosBeg - ну только так и остается. Все-таки гибкости JS языку не хватает.

javaQest 11.08.2015 17:11

Цитата:

Сообщение от vuler
Да php создает всю цепочку обхектов,

круто.

javaQest 11.08.2015 22:05

Цитата:

Сообщение от vuler
Да php создает всю цепочку обхектов, если с конечным элементом что-то сделать. А если просто выполнить проверку на существование, никаких объектов не создаст. Просто скажет, что такой цепочки объектов нет и все.

Слушай а ты ничо не путаешь? я у посонов поспрашал, говорят, что так нельзя.

vuler 11.08.2015 22:22

Цитата:

Сообщение от javaQest (Сообщение 383748)
Слушай а ты ничо не путаешь? я у посонов поспрашал, говорят, что так нельзя.

Да нет, не путаю.Пусть проверят код
if ($jjjd->dfdf->dfsdfs->fdsfdf){
	
}else{
	var_dump($jjjd);//NULL
	$jjjd->dfdf->dfsdfs->fdsfdf++;
	var_dump($jjjd);//object(stdClass)#2 (1) { ["dfdf"]=> object(stdClass)#3 (1) { ["dfsdfs"]=> object(stdClass)#4 (1) { ["fdsfdf"]=> int(1) } } } 
}
die();


Часовой пояс GMT +3, время: 03:38.