2015-10-16 34 views
0

我適應從優秀CodeMirror我的罪惡陰謀的sql-hint.js代碼...的JavaScript片不帶參數或支架(以CodeMirror SQL-hint.js代碼)

但我已經遇到了一個線的JavaScript超越了我。我不明白,也找不到解釋它的任何東西。

這是行34 CodeMirror主\插件\提示\ SQL-hint.js,它看起來像這樣:

function getItem(list, item) { 
    if (!list.slice) return list[item];  // <--- THIS LINE!!!!! 
for (var i = list.length - 1; i >= 0; i--) if (getText(list[i]) == item) 
    return list[i]; 
} 

我不明白的命令是這樣的:

if (!list.slice) 

沒有參數,並且沒有括號。 這到底是怎麼回事?我認爲魔術......

請注意,它不此:

if (!list.slice()) 
+1

檢查slice是否存在,無論它是對象,字符串,日期還是... ** function ** - 如果list.slice沒有任何錯誤,那麼該代碼將爲true false(false,0,'' ,未定義,null) –

回答

1

JavaScript是一種truthy/falsy語言,這意味着我們可以斷言一個給定的對象是否爲真或基於某些標準爲假。在JavaScript中,始終報告爲false的值爲:false,0 (zero)"" (empty string),null,undefined,NaN

此處的支票正在查找list.sliceundefined,如果是,則返回索引item處的列表項。

如果您是console.log(list.slice),您會希望得到類似function() {}的東西。我們不想調用函數,因爲如果slice未定義,那將失敗。

1

如果你有

var obj = { 
    foo: function() { return "string"; } 
} 

而且要檢查是否foobar在OBJ存在,你需要這樣做:

console.log(obj.foo); // returns "function obj.foo()" 
console.log(obj.bar); // returns "undefined" 

不能定義在JavaScript接口所以您沒有其他選擇來檢查對象中是否存在屬性/方法。

而作爲@Jamie說,什麼都沒有falsy在例如評估爲真,那麼上述

  • obj.foofunction obj.foo(),並在if語句中使用時,它的true(或任何布爾上下文)
  • obj.barundefined並在if聲明

的改變時會false原產於您所做的是以下內容:

if(typeof list.slice === "function") return list[item]; 

這是更長,但更明顯。

不知道,但我認爲你可以這樣做:

if(typeof list === "array" || typeof list === "object") 
    return list[item]; 

這是最不言自明的,我想。