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

时间:2015-02-01 08:15:30

标签: javascript types prototype

我来自Java背景,一切都是面向对象的。在深入了解Javascript(更多关于javascript的类区域)时,我注意到了完全的变化。对我来说最大的就是习惯了javascript所谓的“类”的原型。所以,我的问题是你是否需要初始化你传递给类函数构造函数方法的变量。例如:

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中的方法如何知道它传递的数据结构类型是什么?就像他们传入一个数组中的一个,然后我的代码试图将整数和数组一起添加?这也不会推动数组吗?

很抱歉有点疑惑,我一直在谷歌寻找答案......而且现在已经很晚了。

感谢您的帮助

Uneveris

2 个答案:

答案 0 :(得分:2)

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

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

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

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

由于类型松散,javascript的类型为typeof,以帮助确定如果需要强类型,变量类型实际上是什么。

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

详细,但它实现了它的目的。

typeof reference

就像他们传入a的数组一样,然后我的代码尝试将整数和数组一起添加?这也不会推动阵列的推算吗?

你试过这个吗?

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

>> string

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

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

如果您纯粹为自己编写这些课程,那么鸭子打字可能很有用。如果它看起来像一只鸭子,那就像鸭子一样嘎嘎叫它然后就是一只鸭子。当使用像JS这样的松散类型的语言时,这与语义有关。两个假设=== true。

What is duck typing

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

答案 1 :(得分:0)

您无法确定将哪些参数类型传递给您的方法。这是一个主要的Javascript语言特征,可用于好的和坏的。

那么,如果参数类型错误会发生什么? Javascript会尝试将它们静默地转换为常见的东西。 例如:

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

添加数组和整数(以及字符串)将产生一个字符串" 100,2,35"。请注意,数组首先转换为String,然后简单地将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/