指定变量类型和函数返回类型有什么优势吗?

4
我总是会为我的变量和函数设置类型,这是我从学习Java时养成的习惯,似乎是正确的做法。
但是我经常在别人的代码中看到“弱类型”,但我无法反驳,因为我不知道保持所有内容都强类型的真正优势在哪里。
我认为我的问题很明确,但我会举一些例子:
var id = "Z226";

function changeId(newId){
    id = newId;
    return newId;
}

我的代码可能会像这样:

我的代码可能会像这样:

var id:String = "Z226";

function changeId(newId:String):String{
    id = newId;
    return newId;
}
4个回答

7

是的,使用类型化语言的优点如下:

  1. 代码执行更快,因为运行时知道类型,不必评估调用
  2. 更好的工具支持:自动完成和代码提示将与有类型的参数和返回类型一起使用
  3. 可读性更强

好的回答,而且它极大地提高了编译时错误检查的实用性。 - BadFeelingAboutThis

5

1
这个例子并不适合此目的。它比较了动态对象和封闭对象的初始化。性能差异与强/弱类型关系不大。 - cleong

3
正如florian所指出的,强类型的两个优点是开发工具可以利用这些信息提供更好的代码提示和代码完成,而类型作为变量或方法用途的明确指示符,可以使代码更易于理解。
性能问题似乎存在争议。然而,stackoverflow上的this answer表明,在某些基准测试中,类型化肯定比未类型化更快,但正如作者所述,在正常条件下你不会注意到它。
然而,我认为强类型的最大优点是如果您尝试分配或返回错误类型的值,您将获得编译器错误。这有助于防止只有通过运行程序才能跟踪的顽固错误。
考虑以下假想情况,其中ActionScript在返回之前自动将结果转换为string。强类型化方法的参数和返回将确保程序无法编译并发出警告。这可能会节省您数小时的调试时间。
function increment(value) {
    return value + 1;
}

trace(increment("1"));
// 11

1
虽然其他答案中关于代码提示和错误检查的观点是准确的,但我想谈一下性能方面的说法。这并不完全正确。理论上,强类型允许编译器生成更接近本地代码的代码。但是,在当前的VM中,这种优化并没有发生。在某些情况下,AS3编译器会使用整数指令而不是浮点指令。否则,类型指示符对运行时影响不大。
例如,考虑以下代码:
function hello():String {
    return "Hello";
}

var s:String = hello() + ' world';
trace(s);

以下是由此产生的AVM2操作码:

getlocal_0 
pushscope
getlocal_0 
getlocal_0 
callproperty 4 0 ; call hello()
pushstring 12    ; push ' world' onto stack
add              ; concatenate the two
initproperty 5   ; save it to var s
findpropstrict 7 ; look up trace
getlocal_0       ; push this onto stack
getproperty 5    ; look up var s 
callpropvoid 7 1 ; call trace
returnvoid 

现在,如果我删除类型指示器,我会得到以下结果:

getlocal_0 
pushscope 
getlocal_0 
getlocal_0 
callproperty 3 0 
pushstring 11 
add 
initproperty 4 
findpropstrict 6 
getlocal_0 
getproperty 4 
callpropvoid 6 1 
returnvoid 

它完全相同,只是所有名称索引都减少了一个,因为“String”不再出现在常量表中。

我并不想阻止人们使用强类型。只是不应该对性能有奇迹的期望。

编辑:如果有人感兴趣,我已经将我的AS3字节码反汇编器放到了网上:

http://flaczki.net46.net/codedump/

我已经改进了它,使其现在可以取消引用操作数。


用向量替换常规数组可以显著提高性能。然而,在这一点上,强类型确实有所不同。 - cleong
这是我写的一个 PHP 脚本。 - cleong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接