2017-03-04 165 views
0

我一直在試圖調試一個腳本,當我在編寫代碼時,我發現問題的根源可能是我使用的Array.prototype.find()方法在當前版本的Google Apps腳本中完全不受支持(如2017年3月4日)。我懷疑這樣做的原因是因爲下面的代碼,我試圖在兩種不同的環境中運行:如何查找我的Web瀏覽器支持的JavaScript版本?

// ran this locally on Chrome version 56.0.2924.87 (64-bit) 
// result is 3 
var t = [1,2,3,4]; 
var x = t.find(function(v) { 
    return v == 3; 
}); 
document.write(x); 

==========

// ran this on Google Apps Script (whatever the version is as of March 4th, 2017) 
// attempting to run this function produces the error: "TypeError: Cannot find function find in object 1,2,3,4." 
var t = [1,2,3,4]; 
var x = t.find(function(v) { 
    return v == 3; 
}); 
Logger.log(x); 

的唯一結論,我可以借鑑從這個實驗中可以看出,Google Apps腳本基於過時的JavaScript版本,這導致了我的主要問題:我如何才能找到哪種版本的技術(無論是JavaScript還是HTML,或CSS等)通過Chrome網絡瀏覽器和Google Apps腳本?我怎樣才能最好地讓自己知道任何重大變化?

回答

1

我找到的最好的資源(它是一個很好的資源)是this link

它不僅提供瀏覽器支持,還提供移動和轉譯器支持,並且您可以在JavaScript版本(甚至是未來版本)之間切換,以瞭解瀏覽器的進展情況。我認爲它不涵蓋Google Apps腳本。

這個網站是擠滿了功能。我的最愛之一是點擊左側的語言功能並查看支持該功能所需的各個方面。它甚至提供驗證一致性的代碼示例。

我經常參考的一個驚人的資源。

如果您想獲得特定環境中發生的事情的運行時間感,那麼您可以考慮將此鏈接中提供的功能測試複製到您自己的測試腳本中,並將其作爲確定合規性的方法一個特定的功能。

例如,假設我們要測試ES6功能的基本支持 - 默認功能參數。如果我們點擊「默認函數參數」,然後在一個圓圈點擊小「c」來的「基本功能」,我們​​得到這個代碼片段右:

return (function (a = 1, b = 2) { return a === 3 && b === 2; }(3)); 

所有的代碼片段是爲了作爲單元測試運行,如果支持則返回true,否則返回false。

所以,如果你有像這樣的代碼:

function testDefaultParameters() { 
    return (function (a = 1, b = 2) { return a === 3 && b === 2; }(3)); 
}; 

if (!testDefaultParameters()) { 
    // log or polyfill or ... 
} 

會告訴你,如果你的環境,你在運行支持此功能。

我會添加這些作爲我添加新的語言結構到我的代碼庫,所以你可以立即檢測,如果你應該添加一些進一步的支持或可能使用該構造。

+0

很好的資源!感謝你的分享。 – Manuel

2

這看起來似乎是一個無法回答的問題,但那是因爲您問的是錯誤的問題。你不應該問「支持哪個版本的JavaScript」,而是「功能可用於這個 JavaScript環境」,你可以在運行時測試它。 (環境可能支持ES6的某些部分,而不支持其他環境,因此這些環境既不是純粹的ES5也不是ES6--沒有簡單的「Google Apps使用版本___」的答案。)

功能測試是編寫可移植的JavaScript的正規途徑,而且由於要求的東西是不存在返回undefined 而不是拋出一個錯誤,你可以很容易地看到什麼是提供給您。

例如:

if (Array.prototype.find) { 
    // Arrays have find() 
} else { 
    // Arrays do not... maybe polyfill an implementation? 
} 

一些所謂的「本地對象」(不是單純的JavaScript對象,而是由嵌入環境中提供的)可能不行爲這種方式。着名的是,當你訪問一個不存在的屬性時,某些瀏覽器中的某些DOM對象會拋出。 (但是,當我們有像jQuery一樣的庫時,爲什麼要直接操作DOM?)

+0

謝謝你,這是非常有用的知道。 但是現在我想知道是否有辦法一次檢查任何一個環境中支持哪些功能,而不必逐個測試每種方法,或者通過編寫一個長長的if-and- else語句。例如,我嘗試將Array.prototype保存到一個變量中,並使用for-in循環來打印其屬性,但是這不會在屏幕上打印任何內容,並且當我檢查對象的長度(即obj.length)時,會打印一個長度爲0。 – Manuel

相關問題