2017-09-26 133 views
21

我讀到JavaScript中的雙管道檢查變量是否是虛假的,而undefined是JavaScript中的一個虛假值,例如,JavaScript中的雙重管道(||)拋出錯誤而不是評估爲錯誤

It means that if the value is falsey (e.g. 0, "", null, undefined (see also All falsey values in JavaScript)), it will be treated as false; otherwise it's treated as true.

所以,我想這一點,並發現未定義確實沒有得到評估爲falsy而是拋出一個錯誤:

let elemContent = document.getElementById('content'); 

let a = null; 
let b = 2; 

elemContent.innerHTML += a || 'ok'; // "ok" 
elemContent.innerHTML += b || 'ok'; // "2" 
elemContent.innerHTML += whatever || 'ok'; // "ERROR: whatever is not defined" 

http://jsfiddle.net/ueqo6yko

undefined在JavaScript中falsy值或不,或者如何理解這個矛盾?

+1

用'window.whatever'替換'whatever'或聲明'whatever'。 –

+1

爲什麼沒有人指出雙管實際上是「Or Else」。這個陳述意味着什麼:評估第一個條件,如果第一個條件不是假,返回值或者 - 否則評估第二個條件並返回它的值。像任何條件一樣,它是危險的,因爲0的有效值被評估爲假,所以更好地希望a或b不會爲零或第二個條件將被評估。 –

回答

36

因爲在你的代碼,whatever不僅undefined但還沒有宣佈

爲了避免這種錯誤,你可以做到以下幾點:

let elemContent = document.getElementById('content'); 

let a = null; 
let b = 2; 

elemContent.innerHTML += a || 'ok'; // "ok" 
elemContent.innerHTML += b || 'ok'; // "2" 
elemContent.innerHTML += (typeof whatever !== 'undefined' && whatever) || 'ok3'; // "ok3" 
+1

是的,'elemContent.innerHTML + = undefined || 'ok''會起作用。 – Kokodoko

+1

明白了,謝謝。 http://jsfiddle.net/jtvcvmok –

+0

@Kokodoko嗯......它可以;-) https://jsfiddle.net/g3nxyvn1/ – laruiss

13

undefined確實falsy,但它的JavaScript中的錯誤是在聲明之前使用變量。

在某處添加一個let whatever = undefined以查看您期望的行爲。

7

undefinednot defined的錯誤是不同的。 undefined的值,聲明爲變量,如果與not defined錯誤表示您的變量未聲明。

undefined用一個例子:

let elemContent = document.getElementById('content'); 
 

 
let a = null; 
 
let b = 2; 
 
let whatever; 
 

 
console.log(whatever) 
 

 
elemContent.innerHTML += a || 'ok'; // "ok" 
 
elemContent.innerHTML += b || 'ok'; // "2" 
 
elemContent.innerHTML += whatever || 'ok'; // "whatever is undefined"
<div id="content"></div>

not defined錯誤的一個例子:

let elemContent = document.getElementById('content'); 
 

 
let a = null; 
 
let b = 2; 
 

 
elemContent.innerHTML += a || 'ok'; // "ok" 
 
elemContent.innerHTML += b || 'ok'; // "2" 
 
elemContent.innerHTML += whatever || 'ok'; // "ERROR: whatever is not defined"
<div id="content"></div>

這裏是一個例子,如何檢查,是可變的聲明,確實有一個值(不undefined):

let test = "test"; 
 

 
if (typeof test !== undefined) { 
 
    console.log("'test' is declared"); 
 
    if(test) { 
 
    console.log("'test' has a value"); 
 
    } 
 
}

1

要確認undefined是falsy:

var whatever = undefined; 
 
console.log(whatever || "undefined is really falsy");

0
let elemContent = document.getElementById('content'); 

let a = null; 
let b = 2; 
let c; 


elemContent.innerHTML += a || 'ok'; // "ok" 
elemContent.innerHTML += b || 'ok'; // "2" 
elemContent.innerHTML += c || 'ko'; // "ko" 
elemContent.innerHTML += whatever || 'ok'; // "ERROR: whatever is not defined" 

c是undefined。無論是undeclared