javascript中的参数不需要声明类型吗?

问题描述 投票:0回答:3

我在学习 javascript 时注意到,它不需要像 java 那样在函数的参数中声明类型。编译器如何知道传递的是什么类型?有类型检查吗?假设我的函数处理数字而不是字符串,并且我传递了一个字符串?

通常在 javascript 中,您不需要在传递函数的参数中指定吗?再说一遍,编译器是如何知道的?

function invokeAdd(a,b){
    return a()+b();
}
javascript function parameters callback arguments
3个回答
1
投票

JavaScript 不是编译语言;它是一种解释性语言。所以没有静态类型检查。

回答您的具体问题之一:

假设我的函数处理数字而不是字符串,并且我传递了一个字符串?

你可以很容易地尝试一下:

let number = 1;
let string = "STRING";

let addition = number + string;

console.log(addition);

请注意,这只是连接两个变量。所以 1 + "STRING" 是 1STRING (结果是字符串类型)。

还值得注意的是,变量没有类型,但有。在上面的代码中,addition可以设置为任何值。您可以将其设置为一行上的字符串,然后在另一行上设置为数字,并且不会抛出任何错误(直到您尝试使用数字或字符串执行无效的操作)。如果您想在对变量执行某些操作之前检查变量的值,您可以执行类似

typeof addition === "string"
的操作(例如,查看加法变量的值是否为字符串)。


1
投票

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 中进行静态类型检查; TypescriptFlow 是可转换为 JS 的替代语言。


0
投票

要针对您的特定代码块,请查看以下代码

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是一本很好的书,有详细的解释

© www.soinside.com 2019 - 2024. All rights reserved.