我在学习 javascript 时注意到,它不需要像 java 那样在函数的参数中声明类型。编译器如何知道传递的是什么类型?有类型检查吗?假设我的函数处理数字而不是字符串,并且我传递了一个字符串?
通常在 javascript 中,您不需要在传递函数的参数中指定吗?再说一遍,编译器是如何知道的?
function invokeAdd(a,b){
return a()+b();
}
JavaScript 不是编译语言;它是一种解释性语言。所以没有静态类型检查。
回答您的具体问题之一:
假设我的函数处理数字而不是字符串,并且我传递了一个字符串?
你可以很容易地尝试一下:
let number = 1;
let string = "STRING";
let addition = number + string;
console.log(addition);
请注意,这只是连接两个变量。所以 1 + "STRING" 是 1STRING (结果是字符串类型)。
还值得注意的是,变量没有类型,但值有。在上面的代码中,addition可以设置为任何值。您可以将其设置为一行上的字符串,然后在另一行上设置为数字,并且不会抛出任何错误(直到您尝试使用数字或字符串执行无效的操作)。如果您想在对变量执行某些操作之前检查变量的值,您可以执行类似
typeof addition === "string"
的操作(例如,查看加法变量的值是否为字符串)。
JavaScript 不需要知道您传递的参数类型。
JS 是一种“动态类型”语言,这意味着它可以随时确定类型。
在您给出的示例中,传递非函数类型会导致错误,因为这两种类型不是函数。 (但是,JS 完全可以进行各种其他转换)
以下是一些示例:
console.log("hello"+1);
console.log("2"+1);
console.log(15+true);
let a = (x)=>x+3;
console.log(a);
console.log(a(1));
console.log(a+1);
如果你希望在 JS 中进行静态类型检查; Typescript 和 Flow 是可转换为 JS 的替代语言。
要针对您的特定代码块,请查看以下代码
function sumA()
{
return 2;
}
function sumB()
{
return 3;
}
function invokeAdd(a,b){
return a()+b();
}
console.log(invokeAdd(sumA, sumB)); //5
上面的代码将导致 5。让我们将它们分成步骤。
当我们第一次调用函数
invokeAdd
时,我们传入2个变量sumA
作为第一个参数,即a
,将sumB
作为第二个参数,即b
。现在invokeAdd
变成如下所示:
return sumA() + sumB()
因此返回 5.
现在我们再举一个例子,将参数切换为数字。
console.log(invokeAdd(1, 2));
我们现在调用函数
invokeAdd
并传入2个参数,分别是1和2,我们的invokeAdd
变成了下面的
return 1() + 2();
因为 1 不是一个函数,而且我们在它旁边有一个括号
()
,所以 JS 引擎会抛出错误。 () 表示执行函数
类型错误:a 不是函数
如果你想了解更多
javascript
中的类型,你不知道的JS是一本很好的书,有详细的解释