是否需要初始化在 Javascript 中作为 "class" 构造函数参数传递的变量?

Is there a need to initialize variables that are passed as a "class" constructor arguments in Javascript?

我来自 Java 背景,那里的一切都是面向对象的。在更多地了解 Java 脚本(更多地了解 javascript 的 class 区域)时,我注意到了完全的变化。对我来说最大的就是习惯了所谓"classes"javascript的原型了。所以,我的问题是,您是否需要初始化传递给 class 函数构造函数方法的变量。例如:

function Foo(a, b, c) {
    this.a = a;
    var b = b;
    this.c = "";

    this.d = a + b;
}

现在 javascript 这有必要吗?因为在 Java 中,你必须在参数本身中显示变量类型定义: Foo(int a, int b, string c) 现在 Javascript 中的方法如何知道它也被传递的数据结构类型?就像他们为 a 传入一个数组,然后我的代码尝试将整数和数组相加会怎样?那不会将 int 推入数组吗?

抱歉有点问题,我一直在 Google 上寻找答案……现在已经晚了。

感谢您的帮助

Uneveris

所以,我的问题是您是否需要初始化传递给 class 函数构造函数方法的变量。

他们需要初始化吗,不需要。 Javascript 是一种松散类型的语言,声明的变量可以是任何类型。

您无需为参数声明变量类型,它们可以是任何类型。另请注意,变量是构造函数范围内的私有变量。

现在 Javascript 中的方法如何知道它正在传递的数据结构类型?

作为松散类型的结果,javascript 有一个类型 typeof 可以在需要强类型时帮助确定变量的实际类型。

if (typeof this.a !== 'function')
    throw "Expected a function, received a " + typeof this.a;

冗长,但达到了目的。

typeof reference

比如他们为 a 传入一个数组,然后我的代码尝试将整数和数组相加?那不会将 int 推入数组吗?

你试过吗?

var a = new Array();
var b = 1;
var c = a + b;
console.log(typeof c);

>> string

在 Node.js 中,输出是一个字符串,其中数组值连接在一起,整数作为字符串附加在末尾。

当期望特定的数据结构时,重要的是您传递的数据就是您所期望的。在 JS 中,这是通过条件检查。

如果您编写这些 class 纯粹是为了自己,鸭子打字会很有用。如果它看起来像鸭子,叫起来像鸭子,那么它就是鸭子。这与使用松散类型的语言(如 JS)时的语义有关。两个假设 === 正确。

What is duck typing

希望这有助于回答您的问题。

您无法确定传递给您的方法的参数类型。这是一个主要的 Java 脚本语言特性,可用于好的和坏的。

那么,如果参数类型错误会怎样? Java脚本会尝试将它们默默地转换为通用的东西。 例如:

var a = [100,2,3];
var b = 5;
var c = a + b;

添加一个数组和一个整数(以及字符串)将得到一个字符串“100,2,35”。请注意,首先将数组转换为字符串,然后将 5 简单地附加到末尾。此行为非常类似于 Java 的行为,即在需要连接时调用任何对象的 toString() 方法。

您可以通过两种方式避免错误类型。首先,自己转换它们。喜欢,

a = Number.parseInt(a, 10); // now a is of type number

其次,如果您的方法很重要并且高度依赖于数据的正确性,您不应该转换参数,但如果它们的类型错误则完全避免使用它们:

if (typeof a != "number") throw "Param must be int";

终于可以看到这个支持严格类型的JS框架了:

http://betterjs.org/