2012-05-04 74 views
1

我創建了一個簡單的網站與nodejs使用快速框架,couchdb爲數據庫和EJS爲模板。有些時候,我的一些字段在我的一些JSON文檔中爲空或未定義,我需要處理它。Express,EJS,挑戰與測試未定義

<% if (typeof test !== 'undefined') { %> 
    <p><%= test %></p> 
<% } %> 

的代碼位似乎處理「測試」字段爲未定義就好了,但下面的代碼拋出,上面寫着「測試未定義」

<% if (test) { %> 
    <p><%= test %></p> 
<% } %> 

爲什麼不JavaScript的錯誤理解測試是未定義的,然後在if子句中加入false?

+0

...因爲它的不確定不假?我個人很高興它不喜歡「哦,嘿,兄弟,你必須意味着這未定義爲假」 – Loktar

回答

10

由於「未定義」的概念是比在JavaScript語言中定義的變量存在的狀態不同。原因是可以理解的,但效果可能會令人困惑,特別是在變量名稱與對象屬性方面。

您已經演示瞭如何試圖訪問未定義的變量將引發異常。不要用「未定義」類型混淆狀態(沒有定義的變量):

if (bogusVariable) { // throws ReferenceError: bogusVariable is not defined. 
typeof(bogusVariable); // => undefined - wow, that's confusing. 

然而,這是沒有定義對象的屬性可以被安全地測試:

var x = {}; // an object 
x.foo; // => undefined - since "x" has no property "foo". 
typeof(x.foo); // => undefined 
if (!x.foo) { /* true */ } 

你可以請注意,所有變量實際上都是「全局」對象(在Web瀏覽器中爲「全局」或「窗口」)的屬性。

bogus; // => ReferenceError: bogus is not defined. 
global.bogus; // => undefined (on node/rhino) 
window.bogus; // => undefined (on web browsers) 

那麼你也許可以寫你的代碼EJS這樣:

<% if (global.test) { %> 
    <p><%= test %></p> 
<% } %> 

是的,這是令人困惑,因爲是JavaScript語言的許多部分。

+0

感謝這樣一個詳細的答案,我的問題其實不是在JavaScript中。 js很好,錯誤來自express,變量在那裏不存在。該模板中的變量很好,因此express的渲染函數正在拋出該錯誤。謝謝! – Costa

+0

如果測試'if(global.test)'的答案中的代碼不適用於我,那麼使用最後一塊。它總是拋出異常。我不得不用'if(typeof(global.text)!=='undefined')'來檢查它。 – Patryk

4

大多數語言是這樣的:

irb 
    >> foo 
    NameError: undefined local variable or method `foo' for main:Object 
     from (irb):1 
+0

謝謝,我的問題其實不是JavaScript。 js很好,錯誤來自express,變量在那裏不存在。該模板中的變量很好,因此express的渲染函數正在拋出該錯誤。謝謝! – Costa

1

要檢查測試的定義,你需要做的是:

<% if (this.test) { %> 
    here, test is defined 
<% } %>