2015-04-07 89 views
0

我不知道爲什麼控制檯說'不能讀取屬性''未定義的'長度'當我結合兩個條件在一起嗎?如果聲明與&&和.length

//After two if's combined by &&: 
for(n= 0, len=i.length; n<len; n++) { 
    if(typeof n[i] !== 'string' && n[i].length > longest.length) 
     longest = n[i]; 
} 


// Before I combine two if's: 
for(n= 0, len=i.length; n<len; n++) { 
    if(typeof n[i] !== 'string') continue; 
    if(n[i].length > longest.length) longest = n[i]; 
} 
+2

檢查您的變量命名。你使用'n'就像是一個數組/字符串和一個數字在同一時間。 – Teemu

+0

你的兩個版本正在做完全不同的事情。如果'n [i]'不是字符串,第一個比較長度。第二個只有在它是一個字符串時才這樣做。但'n [i]'將永遠是'undefined',因爲數字不是數組。我想你應該使用'i [n]',其中'i'是一個可能包含一些字符串的數組。 – blex

+0

第一個條件如果n是零,那麼n [i] .length是多少? –

回答

0

我猜想,因爲無論n[i]未定義或longest是不確定的,而n[i]是從來沒有字符串類型。

在你的第一段代碼中,你對兩個測試進行邏輯「與」運算。如果我的爭論是正確的,那麼&&的LHS返回true。雖然&&提供短路行爲,但這不適用於此,因爲您有true && ...,因此必須測試...以確定結果。因此,必須評估表達式n[i].length > longest.length,這是觸發錯誤的原因。

在你的第二個代碼片段,第二次測試是從未到達,因爲,正如我剛纔推測,第一個測試typeof n[i] !== 'string'被返回true,所以它始終運行在continue;語句,所以它從不計算第二表達,你永遠不會看到錯誤。但它仍然存在。

編輯:正如@OmarElawady深刻指出的那樣,您實際上將一個整數賦值爲n,整數不能作爲數組索引。因此,n[i]肯定是未定義的。 (longest也可能未定義;我們無法從您的代碼中知道)。+1 to @OmarElawady。

1

n是一個整數,所以n [i]是未定義的。

在最後一個循環:typeof n[i] !== 'string'永遠是正確的,因爲typeof運算N [1]等於未定義

但在第N [1]未定義所以當您嘗試訪問的不確定

長度屬性瀏覽器中拋出錯誤
2

其他人指出爲什麼它不起作用,但沒有找到解決方案,因爲你的變量名稱不是很清楚。也許這就是它:

var i = ['a', 12, 'hello', 'hi', {}, 1.1, 'hey'], 
 
    longest = ''; 
 

 
for(n= 0, len=i.length; n<len; n++) { 
 
    if(typeof i[n] === 'string' && i[n].length > longest.length) longest = i[n]; 
 
} 
 

 
alert('Longest string found: ' + longest);

+0

其實我誤讀了== == ===然後弄糊塗....那是一個低級別的錯誤。感謝大家澄清它。順便說一句,你可以看看,看看這個解決方案是否也適用?它可能比你的要慢,但我仍然想知道它是否按預期工作。 http://codepen.io/anon/pen/yyWxgN – user2734550

+0

@ user2734550'Array.sort()'方法不返回任何東西,它改變了它應用到的數組。所以你需要在後面「彈出()」。還要確保你的函數名在你的函數調用中是一樣的(不是這種情況)。修正:http://codepen.io/anon/pen/RNmYpJ – blex

+0

謝謝。最後我彈出了()。無論如何,我只是想看看是否有任何奇怪的情況可能導致這種問題。 – user2734550

0

的陳述是不一樣的。

首先,n [i]永遠不會是一個字符串。 n是一個整數。 typeof n [i]將返回'undefined'。

這就是說,在下面的循環

for(n= 0, len=i.length; n<len; n++) { 
    if(typeof n[i] !== 'string') continue; 
    if(n[i].length > longest.length) longest = n[i]; 
} 

第一if語句將返回true,從而將continue和永遠不會達到第二if語句。結果是沒有錯誤。

在第二環路

for(n= 0, len=i.length; n<len; n++) { 
if(typeof n[i] !== 'string' && n[i].length > longest.length) 
longest = n[i]; 
} 

所述第一條件將返回true (typeof n[i] !== 'string') 所以作爲結果,第二條件將被檢查。 n[i]未定義,因爲n是一個整數。

錯誤'Cannot read property 'length' of undefined'是正確的。