2013-06-25 89 views
0

此代碼有什麼問題?「||」運算符在爲變量賦值時不起作用

var sha = 6; 
var secondParameter = dan || sha; 
alert(secondParameter); 

我試了很多瀏覽器。沒有警報。 如果我加上var dan這樣:

​​

警報將會發生。所以在「||」中的問題。我看到很多代碼,它使用這樣的操作符!所以我不知道..

+8

'dan'沒有被定義。看看錯誤控制檯。 – akonsu

+1

嘗試訪問未定義的變量會導致錯誤。 – Barmar

+5

未定義變量和具有未定義值的變量之間存在很大差異。 – thefrontender

回答

3
var sha = 6; 
var dan = null; 
var secondParameter = dan || sha; 
alert(secondParameter); 

試試這個。您可以使用||運算符進行合併,但必須聲明所有變量以便引用

+0

順便說一句,你不需要將它設置爲null只是'var dan;'就足夠了。 – PSL

+0

@PSL是的,我同意。 – TGH

+0

我問過之前我試過了兩個版本。他們兩個都不行。 –

7

您沒有定義dan。執行停止在該錯誤。檢查瀏覽器控制檯是否有錯誤。

當你定義dan時,執行繼續,但這可能不是你想要的。

這種代碼的JavaScript中的目的是爲了說,如果dan具有falsy值(計算結果爲false值的任何值,即0''nullfalseundefined,或NaN),然後使用的值sha

如果在定義dan超出你的責任,(即其他一些腳本應該已經設置),那麼你可以使用結構檢查其存在類似如下:

secondParameter = typeof(dan) == 'undefined' ? sha : dan;

(未測試,希望它的作品:)無論如何,它應該給你一個想法)

Check here for documentation on logical operators

而且,這個問題可能會給你更深入的瞭解:Javascript || or operator with a undefinded variable

+1

其實我試圖用「||」而不是三元操作符。現在我知道何時使用它們中的每一個。謝謝。 –

1

這是在它被賦予的東西像一個參數,但沒有分配一個值的情況下使用,或者是falsy

falsy0, false, null or undefined

例如:

var sha = 6; 
var dan = undefined; 
var secondParameter = dan || sha; 
alert(secondParameter); 

你西港島線升得6

一個很好的例子使用,這將是這樣的:

function funcWithCallback(callback){ 
    callback = callback || function(){}; 
    callback(); 
} 

在這個例子中,如果回調是不確定的(或falsy)然後設置回調的函數的新實例

在這樣的情況下使用它將確保沒有錯誤

+0

由於允許你將'undefined'明確地分配給一個變量,所以使得這個混淆更加激化,它不同於沒有首先定義變量。 – Barmar

+0

這是回答這個問題嗎? – Ryan

+0

我更願意解釋你可以使用它的情況。 與代碼的問題是,'丹'沒有定義的答案是什麼,但這很容易.. – FabianCook

0

說明:作品是:如果第一個條件是假的,那麼它檢查第二個條件。因此,爲了顯示第二個參數,您必須將第一個參數設爲null。

1

JavaScript在處理未聲明的變量(未定義的變量)和未定義的值方面存在差異。在以下示例中,變量dan已聲明但從未設置,因此它的值爲undefined。返回它可以找到的第一個true值,所以如果我傳遞除空字符串,0,false,NaN,undefined或NULL之外的任何值,它將console.log傳遞的值。否則它會記錄「默認值」。

function test(dan){ 
    console.log(dan || "default value"); 
    return dan===undefined; 
} 
console.log(test());//default value, then true 
console.log(test(22));//22 then false 

檢查是否是通過一個變量將是看是否該變量的值是未定義的更健壯的方式:

function test(dan){ 
    dan = (typeof(dan)==='undefined')?"default value":dan; 
} 

在你的榜樣變量dan完全不聲明(變量未定義),這就是爲什麼你會得到錯誤「丹沒有定義」,因爲丹沒有聲明。

function test(){ 
    return dan===undefined;//ReferenceError: dan is not defined 
} 
console.log(test()); 

你可以更改您的代碼如下:

var sha = 6, dan;//dan is declared here but no value is set 
var secondParameter = dan || sha; 
console.log(dan===undefined);//true 
console.log(secondParameter);//6 

如果你想檢查某個對象有一個屬性,然後它會不會引發錯誤:

function test(){ 
    return window.neverSetOrDeclared===undefined; 
} 
console.log(test());//true 

當您嘗試檢查未定義的屬性或空值時,它會引發錯誤:

null.something//throws error 
undefined.something//throws error 
window.neverSetOrDeclared===undefined//throws error 
+1

它不安全的比較變量直接'undefined '在某些情況下,未定義本身可以被分配給其他東西,在這種情況下,這些檢查將失敗。更好的方法是檢查typeof運算符:typeof(dan)==='undefined' – BuddhiP

+0

@BuddhiP你是對的,但是他們正確的心態會重新定義undefined還是window?解決方法是像jQuery一樣:(function(window,undefined){your code})(window);如果你正在製作一個圖書館供任何人使用(甚至是那些重新定義窗口和/或udefined的人),而不是你提出一個有效的觀點。 – HMR

+0

當dan沒有聲明時(未定義變量),typeof(dan)不會拋出錯誤。所以示例代碼不會表現相同。 – HMR