我是一名非常初级的开发人员(第一年的CS学生),我一直在学习静态类型语言和动态类型语言之间的区别。如果我错了,请纠正我,但我的理解是,动态类型语言允许程序员初始化变量而不给它一个类型,然后在程序中稍后给该变量一个类型。只是为了好奇,是否有任何语言允许您在不初始化全新变量的情况下更改对象的类型/类?
答案 0 :(得分:1)
我认为您正在寻找的是weak typing。请注意,弱类型与强类型不同于静态与动态类型。
答案 1 :(得分:0)
这完全取决于你所谓的全新变量。例如,在PHP中:
<?php
$var = NULL; // $var is now of type null
$var = 1; // $var is now of type integer
?>
等等。但是,不能保证以前用于存储NULL值的空间现在用于存储1,所以你可以说你只是给自己一个同名的全新变量。
答案 2 :(得分:0)
这取决于您如何定义类型,但JavasScript没有“类”,并允许您轻松地将对象更改为对象。
我不知道任何具有强大OO基础的语言可以让你做类似的事情:
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
答案 3 :(得分:0)
静态/动态类型和强/弱类型有很多定义,因此很难具体回答任何一般性问题。话虽如此,我使用的(非常高级别)定义倾向于相当好地传达一般的想法(至少,我认为是这样)。
静态与动态类型
静态类型语言将类型应用于变量。变量count
可以定义为整数。它只能保存整数值。
动态类型语言将类型应用于值,但不应用于变量。值123是一个整数,“abc”是一个字符串,但变量result
可以在不同的时间点分配给其中一个或两个。
强势与弱势打字
在强类型语言中,值具有类型,并且只是该类型。例如,"123"
是一个字符串,123
是一个整数。您不能将字符串视为整数,反之亦然。你可以在它们之间进行转换(即“123”.toint()等),但你不能只将一种类型视为另一种类型(即以下内容无效:“123”+ 456 == 579)< / p>
在弱类型语言中,值只是一个值,您可以根据它的用途将其视为各种类型。例如,您可以说"123" + 234
并获得有用的结果(357或123234,具体取决于语言)。
静态和动态之间以及强弱之间存在很多灰色区域,但上面的定义给出了一般概念。
在一个相关的主题上,还有明确的vs隐式类型(程序员指定类型与编译器计算出类型),这是一个非常有趣的主题。