2011-12-05 123 views
2

我是一个漂亮的初级开发人员(第一年CS学生),我一直在学习静态类型语言和动态类型语言之间的差异。纠正我,如果我错了,但我的理解是,动态类型语言允许程序员初始化变量而不给它一个类型,然后在程序中稍后给这个变量类型。只是为了好奇,是否有任何语言允许您在不初始化全新变量的情况下更改对象的类型/类别?是否有一种语言可以改变变量类型?

回答

1

我认为你要找的是weak typing。请注意,弱打字与强打字不同于静态打字与动态打字。

0

这一切都取决于你所说的一个全新的变量。例如,在PHP中:

<?php 
$var = NULL; // $var is now of type null 
$var = 1; // $var is now of type integer 
?> 

等等。但是,不能保证先前用于存储NULL值的空间现在用于存储1,因此您可以说您只是为自己创建了一个具有相同名称的全新变量。

0

它取决于你如何定义类型,但JavasScript没有“类”,并允许你轻松地将接口改变为对象。

我不知道有一个强大的面向对象的基础上,允许你这样做的任何一种语言:

typeof dog // Dog 
dog.turnIntoCat() 
typeof dog // Cat 

但是几乎所有的OO语言都支持类似:

typeof dog // Dog 
cat = dog.turnIntoCat() 
typeof cat // Cat 

我认为所有动态类型的语言(至少我所知道的所有)允许这样:

typeof dog // Dog 
dog = new Cat() 
typeof dog // Cat 
0

There ar e静态/动态类型和强/弱类型的定义很多,所以很难具体回答任何一般性问题。这就是说,我使用的(非常高的)定义倾向于相当好地传达总体思路(至少,我认为是这样)。

静态类型vs动态类型

静态类型语言适用类型变量。变量count可以被定义为一个整数。它只能保存整数值。

动态类型语言将值的类型应用于值,但不包含变量。值123是一个整数,“abc”是一个字符串,但变量result可以在不同的时间点分配给一个或两个。

强VS弱类型

在一个强类型语言,一个值都有一个类型,它是唯一的那种类型。例如,"123"是一个字符串,其中123是一个整数。您不能将字符串视为整数,反之亦然。你可以在它们之间进行转换(即“123”.toint()等),但是你不能只把一种类型看作另一种类型(即。以下将无效:“123”+ 456 == 579)

在弱类型语言中,值只是一个值,您可以根据它的用途将其视为各种类型。例如,你可以说"123" + 234并得到一个有用的结果(357或123234取决于语言)。

在静态和动态之间,以及强弱之间存在很多灰色区域,但上面的定义给出了一个总体思路。

关于相关话题,还有显式和隐式类型(程序员指定类型和编译器数字类型),这是一个非常有趣的话题。

相关问题