JavaScript是无类型的:
(来源:no.gd)
甚至 Brendan Eich 也这么说。在 Twitter 上,他回复了一个链接到这个问题的帖子:
所以问题在于有几种不同的 无类型 定义。
其中一种定义已经在上面的答案中被讨论过 - 运行时不标记值,只将每个值视为位。JavaScript 会标记值,并根据这些标记具有不同的行为。因此,JavaScript 显然不属于该类别。
另一种定义来自于 编程语言理论(Brendan 所指的学术领域)。在这个领域,无类型 只是意味着 一切都属于单一类型。
为什么呢?因为只有当语言可以证明类型对齐(即Curry-Howard 对应;类型是定理,程序是证明)时,语言才会生成程序。这意味着在一个无类型的语言中:
Weakly typed means the compiler, if applicable, doesn't enforce correct typing. Without implicit compiler interjection, the instruction will error during run-time.
"12345" * 1 === 12345 // string * number => number
Strongly typed means there is a compiler, and it wants you an explicit cast from string to integer.
(int) "12345" * 1 === 12345
In either case, some compiler's features can implicitly alter the instruction during compile-time to do conversions for you, if it can determine that is the right thing to do.
Thus far, JavaScript can be categorized as Not-Strongly-Typed. That either means it's weakly-typed or un-typed.
Dynamically typed means the value's type is enforced, but the variable simply represents any value of any type.
x = 12345; // number
x = "string"; // string
x = { key: "value" }; // object
y = 123 + x; // error or implicit conversion must take place.
Statically typed means the variable type is strongly enforced, and the value type is less-so enforced.
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.
Thus far, JavaScript can be categorized as Not-Statically-Typed. Also, it appears to be Dynamically Typed, if typed at all. So we need to see what Typing means.
Typed 意味着该语言区分不同的类型,例如 字符串、数字、布尔值、对象、数组、null、undefined 等等。此外,每个操作都与特定的类型绑定。因此,您不能将一个 整数 除以一个 字符串。
2 / "blah" // produces NaN
Untyped 意味着将 integer 除以 string 的操作会将 string 的前四个字节视为 integer。这是因为 Untyped 操作直接在位上进行,没有类型可观察。结果将是非常意外的: 2 / "blah" // will be treated as 2 / 1500275048
由于JavaScript的行为是按照类型定义的,因此它必须是动态类型和弱类型。如果有人声称JavaScript是无类型的,那只是学术理论,而不是实际应用。
String a = "blah";
或者var a:String = 'blah';
(即有类型的变量)。这就是为什么它是无类型的。 - Jimbo Jonnyvar test = "this is text";
typeof(test);
yield(产出)
"字符串"
ECMAScript 定义了以下八种语言类型:Undefined、Null、Boolean、String、Symbol、Number、BigInt 和 Object。
更准确地说,JavaScript 的设计应该被称为隐式类型、动态类型或者弱类型/松散类型(或它们的某些组合),因为在某些情况下 JavaScript 使用类型转换来使类型变得隐式,因此你不必显式地指定变量的类型。它属于弱类型,因为与一些区分浮点数和整数等的语言不同,它只使用一个number
类型来涵盖所有数字,并利用前面提到的类型转换【ECMAScript 规范第9节】,这与强类型语言形成了鲜明的对比,后者将具有非常特定的数据类型(例如,你需要指定int
或float
)。
TypeError
异常的原因。此处有示例
我认为得票最高的答案混淆了JavaScript函数的多态与接受任何东西的函数(与Lambda Calculus的未类型化变体一样), 这是一个关联谬误。根据作者的观点,JavaScript 也被归类为 动态类型。维基百科指出,动态类型语言是在运行时进行类型检查而不是在编译器中进行的,而弱类型则是指能够在代码中随意更改类型的能力。因此,它既是动态类型又是弱类型。
请记住,JavaScript 允许您询问 typeof(your_variable)
是什么,并比较类型:5==="5"
返回 false
。因此,我认为你不能称它为无类型。
它是动态和(估计为)弱类型的。您可能想知道它使用鸭子类型(请参见安德鲁的链接),并通过 原型 而不是类和继承来提供 OOP。
String a = "blah";
或者var a:String = 'blah';
(即有类型的变量)。这就是为什么它是无类型的。 - Jimbo Jonny虽然它是有类型的(你可以问“typeof someVar”并了解其具体类型),但它非常弱。
假设:
var a = "5";
你可能会说a是一个字符串。然而,如果你接着写:
var b = a + 10;
b是一个等于15的整数,所以a的行为就像一个整数一样。当然,你也可以这样写:
var c = a + "Hello World";
而c将等于"5Hello World",所以a再次像字符串一样运作。
b
等于 510
:https://ideone.com/BRcSW7 - aioobe我认为 JavaScript 是强类型和动态类型的。
但这取决于一堆术语,这些术语似乎最好是松散定义的,因此如果您接受以下定义,上面的说法才是正确的...
JavaScript不会让您破坏内存(因此"strong"),但会在运行时执行所有检查和类型转换/强制转换(因此"dynamic")。
我发现将“强类型 vs 弱类型”与“静态类型 vs 动态类型”视为正交的概念是有帮助的。有些语言是强类型和静态类型(例如没有unsafe
上下文的C#),有些是强类型和动态类型(大多数“脚本”语言似乎属于这一类),还有一些是弱类型和静态类型(C/C++)。
不确定什么是弱类型和动态类型...也许是汇编语言吧 :)
另一个有趣的松散类型 JS 的例子:
console.log(typeof(typeof(5)))
结果是字符串。为什么?因为初始 typeof 的结果是 'integer',它本身就是一个字符串。我会认为在强类型语言中这种类型的转换不会存在。也许我错了,但那是我开始理解 JS 有多疯狂的第一个例子,哈哈。
1. 2. 3.
并不适用于 JavaScript。JavaScript 不只有一种类型,大约有四到五种类型。那么这如何证明 JavaScript 是弱类型语言呢? - Don Cheadle