2016-07-28 6 views
0

Первая часть этого скрипта, похоже, работает правильно, она выполняет итерацию через каждый документ и если имя документа соответствует определенному шаблону регулярного выражения, оно оно дает определенную переменную, которая будет использоваться позже в скрипте.Если переменная существует ..... объект vs переменная, null vs. undefined

Однако в конце сценария, когда я пытаюсь определить, существует ли переменная как условие для оператора if, вещи не оценивают истину или ложь, как ожидалось. Что я здесь делаю неправильно?

// iterate through all docs assigning variables to templates and art 
for (i = 0; i < documents.length; i++) { 
    var curDoc = app.activeDocument = app.documents[i]; 
    var curDocNoExt = curDoc.name.split("."); 
    var workingName = curDocNoExt[0]; 
    if (workingName.match(/^\d{5,6}$/) != null) { 
    var frontArt = app.documents[i]; 
    var targetName = frontArt.name 
    } else { 
    if (workingName.match(/^\d{5,6}(b))$/) != null) { 
     var backArt = app.documents[i]; 
     var backToggle = 1; 
    } else { 
     if (workingName.match(/^fkeep$/) != null) { 
     var frontTemp = app.documents[i]; 
     } else { 
     if (workingName.match(/^fxkeep$/) != null) { 
      var frontSquare = app.documents[i]; 
     } else { 
      if (workingName.match(/^bkeep$/) != null) { 
      var backTemp = app.documents[i]; 
      } else { 
      if (workingName.match(/^bxkeep$/) != null) { 
       var backSquare = app.documents[i]; 
      } 
      } 
     } 
     } 
    } 
    } 
} 

//use variables to do stuff! 

if (backArt != null) { 
    app.activeDocument = backTemp; 
    var namedBackTemp = backTemp.duplicate(targetName + "B"); 
} 
+2

Как вы знаете, вы можете использовать ['else if'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/if...else#Using_else_if), чтобы избежать все это гнездование. Это делает ваш код намного читабельнее. –

+0

, если первое условие, если в вашем коде истинно, тогда переменная backart никогда даже не определена .... следовательно, вы получаете опорную ошибку – Sai

+1

@Sai Они не получили бы ссылочную ошибку, это было бы просто «undefined». 'backArt' [hoisted] (https://developer.mozilla.org/en-US/docs/Glossary/Hoisting) находится в верхней части области функций. –

ответ

0

В JavaScript undefined является falsey, так что вы можете просто использовать переменную в if заявление следующим образом:

var var1 = '', // can be anything 
    var2; // this is an undefined var 
if (var1){ // var1 has been initialized so this evaluates to true 
    doSomething(); // this will execute 
} 
if (var2){ // var2 is undefined, so it evaluates as false 
    doSomethingElse(); // this will not execute 
} 

Тем не менее, лучше практика заключается в использовании typeof, который возвращает строку из Тип объекта:

var var1 = ''; 
var var2 = {}; 

typeof var1 == 'string'; 
typeof var2 == 'object'; 
typeof var3 == 'undefined'; 

if (typeof var1 !== 'undefined'){ 
    doSomething(); // this gets executed because var1 is a string 
} 

надеюсь, это даст вам лучшее понимание

+0

Я не думаю, что это изменило бы результат в случае OP, потому что их текущий 'if (backArt! = Null)' test будет 'true', если' backArt' 'undefined' * или *' null' (потому что от разницы между '! =' и '! =='). – nnnnnn

+0

@nnnnnn Я предполагаю, что он просто использует 'if (backArt) {...}' вместо 'if (backArt! = Null) {..}' –

+0

Да, и я говорю, что это не изменит поведение, если оно используется как неопределенный тест (потому что 'undefined == null' является' true'). – nnnnnn

 Смежные вопросы

  • Нет связанных вопросов^_^