似乎令许多Java人士对JS感到焦虑的是它的“酷爸爸”性质;它不关心你是否抽烟或与你的朋友一起出去,直到凌晨2点。如果没有这种结构,就无法在“编译时”检查类型安全性......或者是它?
当然,javascript有类型,但它没有强类型。话虽如此,阅读以下摘录的人会注意到这将引发运行时异常:
function f(anArray) {
"use strict";
anArray.push("hi");
}
f(5); //runtime exception for sure
我们可以将其视为程序员,因为即使类型未明确声明(例如int c;),我们也可以收集各种其他特征来推断其类型(它是一个数字)没有引号)。似乎有一种算法(例如决策树)可以很容易地推断出给定对象的类型。
本质上,在动态类型语言中,存在类型,但它们的使用和转换是隐式。那么我的问题是:
linters是否可以使用隐式约定来确定方法的预期类型,并在“lint time”警告潜在的运行时错误?
提前谢谢。
答案 0 :(得分:1)
我建议您查看Tern,您可以将其安装到文本编辑器中(或者只是将其作为可执行文件运行),它会尝试确定某个变量的类型范围,并提供代码完成,方法建议(基于确定的类型),函数参数提示等工具。它不是完美的,但基于JavaScript的限制工作得非常好。
答案 1 :(得分:1)
考虑这个代码:
def percolateDown(currNode: Node): Unit = {
val maxChild = if (currNode.left.value > currNode.right.value) currNode.left else currNode.right
if (currNode.value < maxChild.value) {
val tempValue = currNode.value
currNode.value = maxChild.value
maxChild.value = tempValue
percolateDown(maxChild)
}
}
percolateDown(root)
这不是问题;但是如果 i 从2开始而不是1开始就会出现。通常,传递给 f 的值可能是复杂算法的结果,而代码检查员会必须实际运行代码才能知道结果。这当然不是这种工具的概念,因此在实践中只能找到类型不兼容的琐碎案例。