我发现有些人称JavaScript为"动态,弱类型"的语言,但有些人甚至说"无类型"?这到底是哪个?
JavaScript 是无类型的:
http://no.gd/p/untyped-20120205-235300.jpg
甚至Brendan Eich也这么说.在Twitter上,他回复了一个与此问题相关的主题:
......学术类型使用"无类型"来表示"没有静态类型"......
所以问题是对无类型的定义有一些不同.
在上面的一个答案中已经讨论了一个定义 - 运行时没有标记值,只是将每个值视为位.JavaScript 会标记值,并根据这些标记具有不同的行为.所以JavaScript显然不适合这个类别.
另一个定义来自编程语言理论(Brendan所指的学术事物).在这个域中,无类型只意味着一切都属于单一类型.
为什么?因为语言只能在证明类型对齐时生成程序(也就是Curry-Howard对应 ;类型是定理,程序是证明).这意味着使用无类型语言:
始终生成程序
因此类型总是匹配
因此,必须只有一种类型
与打字语言相反:
可能不会生成程序
因为类型可能不匹配
因为程序可以包含多种类型
所以,你去,在PLT中,无类型只是意味着动态类型和键入只是静态类型.JavaScript在此类别中绝对是无类型的.
也可以看看:
辩论类型系统之前要了解什么
"无类型"是否也意味着学术CS世界中的"动态类型"?
强弱/弱 可以被认为与编译器(如果适用)如何处理键入有关.
弱类型意味着编译器(如果适用)不会强制执行正确的键入.如果没有隐式编译器插入,则指令在运行时会出错.
"12345" * 1 === 12345 // string * number => number
强类型意味着有一个编译器,它需要一个从字符串到整数的显式转换.
(int) "12345" * 1 === 12345
在任何一种情况下,一些编译器的功能可以在编译时隐式地改变指令,为你做转换,如果它可以确定这是正确的做法.
到目前为止,JavaScript可以归类为Not-Strongly-Typed.这或者意味着它是弱类型或非类型的.
动态/静态 可以被认为与语言指令如何操纵类型有关.
动态类型表示强制执行值的类型,但变量只表示任何类型的任何值.
x = 12345; // number x = "string"; // string x = { key: "value" }; // object y = 123 + x; // error or implicit conversion must take place.
静态类型意味着强制实施变量类型,并且值类型的强制执行程度较低.
int x = 12345; // binds x to the type int x = "string"; // too late, x is an integer - error string y = 123; // error or implicit conversion must take place.
到目前为止,JavaScript可以归类为非静态类型.此外,它似乎是动态类型,如果打字的话.所以我们需要看看打字的含义.
Typed表示该语言区分不同的类型,如字符串,数字,布尔值,对象,数组,空值,未定义等.此外,每个操作都绑定到特定类型.所以你不能用字符串除整数.
2 / "blah" // produces NaN
无类型装置分割的操作整数由串将导致在治疗的头四个字节的字符串作为整数.这是因为Untyped操作直接在位上发生,没有可观察的类型.结果将是非常意外的:
2 / "blah" // will be treated as 2 / 1500275048
由于JavaScript的行为符合Typed的定义,因此必须如此.因此它必须是动态类型和弱类型.
如果有人声称JavaScript是Untyped,那它仅仅是学术理论,而不是实际应用.
JavaScript是弱类型的.它绝对不是"无类型",但其弱类型性质允许在隐式转换方面具有很大的灵活性.
请记住,JavaScript也是动态类型的.这种打字方法允许所谓的"鸭子打字".
为了进行比较,请考虑JavaScript不是强类型,也不是静态类型. 有时理解什么不是可以帮助你更好地了解它是什么.
对于作者来说,JavaScript也被归类为动态类型.Wiki声明动态类型语言在运行时而不是在编译器中进行类型检查,而Weakly Typed指的是在代码中动态更改类型的能力.所以它是动态类型和弱类型.
这里令许多程序员感到困惑的问题是,这样的定义在某处并不是标准化的.术语无类型编程语言含糊不清.这是指没有数据类型的语言还是lambda演算无类型变体的语言?
JavaScript/ECMAScript有一个类型系统,它的所有函数域都接受任何Reference规范类型.这意味着JavaScript实际上只有一种数据类型.这是一个实现问题,对于非常高级的JavaScript程序员来说更为重要.普通的JavaScript程序员只关心ECMAScript指定的抽象 语言数据类型.
在日常程序员而非研究人员或理论计算机科学家的背景下,无类型术语是用词不当,因为大多数人都没有做lambda演算.因此,该术语混淆了群众并且似乎声明JavaScript没有任何数据类型,这根本不是真的.任何使用过的人都typeof
知道JavaScript有自己的语言数据类型:
var test = "this is text"; typeof(test);
产量
"串"
ECMAScript中定义了以下类型的语言:undefined
,null
,string
,boolean
,number
,object
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
JavaScript的更准确的名称将被隐式输入,动态类型或弱/松散类型(或其某种组合),因为JavaScript 在某些情况下使用类型强制,这使得类型隐式,因为您不必明确指定变量的类型.它属于弱类型,因为与一些区分浮点数和整数等的语言不同,它只使用一种number
类型来包含所有数字,并利用前面提到的类型强制[ECMAScript Spec的第9节],与a形成鲜明对比强类型语言,它具有非常特定的数据类型(即您必须指定int
或float
).
静态和动态类型语言的定义不是标准化的,但是当计算机开始发展时,字节的大小也不是标准化的.静态和动态类型通常指的是某些语言功能的存在.其中之一是在运行时进行类型检查,或者称为动态类型检查.如果您已经使用过JavaScript,那么您已经知道它一直等到运行时检查类型,这就是为什么TypeError
在执行代码期间会遇到异常的原因.这里的例子
我认为最高投票的答案是混淆了JavaScript函数的多态性和几乎可以接受任何事物的函数(如同Lambda Calculus的无类型变体),这是一个关联谬误.