2017-03-04 106 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

相关问题