JavaScript是非类型化语言吗?
我发现有些人把JavaScript称为“动态的、弱类型的”语言,但有些人甚至说“非类型的”?它到底是什么?JavaScript是。它当然不是“非类型化”的,但它的弱类型特性允许在隐式转换方面有很大的灵活性 请记住,JavaScript也是动态类型的。这种打字方法允许所谓的JavaScript是非类型化语言吗?,javascript,types,Javascript,Types,我发现有些人把JavaScript称为“动态的、弱类型的”语言,但有些人甚至说“非类型的”?它到底是什么?JavaScript是。它当然不是“非类型化”的,但它的弱类型特性允许在隐式转换方面有很大的灵活性 请记住,JavaScript也是动态类型的。这种打字方法允许所谓的 比较一下,认为JavaScript不是,也不是有时理解什么是不可以帮助你更好地了解它是什么。Wiki指出,动态类型语言在运行时而不是在编译器中进行类型检查,而弱类型语言指的是在代码中动态更改类型的能力。因此,是的,它同时是动态
比较一下,认为JavaScript不是,也不是有时理解什么是不可以帮助你更好地了解它是什么。Wiki指出,动态类型语言在运行时而不是在编译器中进行类型检查,而弱类型语言指的是在代码中动态更改类型的能力。因此,是的,它同时是动态类型和弱类型。强/弱可以根据编译器如何处理类型(如果适用)来考虑
- 表示编译器(如果适用)不强制执行正确的键入。如果没有隐式编译器插入,指令将在运行时出错
强类型意味着有一个编译器,它希望您将字符串显式转换为整数 在这两种情况下,一些编译器的功能可以在编译时隐式地更改指令,以便为您进行转换,前提是它可以确定这样做是正确的 到目前为止,JavaScript可以归类为非强类型。这要么意味着它是弱类型的,要么是非类型的"12345" * 1 === 12345 // string * number => number
- 表示强制执行值的类型,但变量仅表示任何类型的任何值
静态类型意味着变量类型是强强制的,而值类型的强制程度较低x = 12345; // number x = "string"; // string x = { key: "value" }; // object y = 123 + x; // error or implicit conversion must take place.
到目前为止,JavaScript可以归类为非静态类型。此外,它似乎是动态类型的,如果键入的话。所以我们需要看看打字意味着什么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.
2 / "blah" // will be treated as 2 / 1500275048
由于JavaScript的行为是根据被类型化的定义进行的,所以它必须是。因此它必须是动态类型的,并且是弱类型的
如果有人声称JavaScript是非类型化的,那只是为了学术理论,而不是为了实际应用。虽然它是类型化的(你可以问“typeof someVar”并了解它的具体类型,但它非常弱
鉴于:
var a = "5";
您可能会说a是字符串。但是,如果您随后编写:
var b = a + 10;
var c = a + "Hello World";
b是一个等于15的整数,所以a的作用就像一个整数。当然,你可以这样写:
var b = a + 10;
var c = a + "Hello World";
c将等于“5Hello World”,因此a再次像字符串一样工作。请记住,JavaScript允许您询问(您的_变量)的
类型,并比较类型:5==“5”
返回false
。
因此,我认为你不能称之为非类型化
它是动态的(估计为)弱类型的。
您可能想知道它使用Duck类型(参见andrew的链接),并提供OOP而不是类和继承。JavaScript是非类型化的:
(来源:)
甚至Brendan Eich也这么说。在Twitter上,他回复了一条与这个问题相关的帖子:
所以问题是,对于非类型化有几种不同的定义
在上面的一个答案中讨论了一个定义-运行时不标记值,只将每个值作为位处理。JavaScript标记值,并基于这些标记具有不同的行为。因此JavaScript显然不适合这一类别
另一个定义来自编程语言理论(Brendan所指的学术事物)。在这个领域中,非类型化只是指
为什么?因为一种语言只有在能够证明类型对齐时才会生成程序(又称类型是定理,程序是证明)。这意味着在非类型语言中:
程序总是生成的
因此类型总是匹配的
因此,必须只有一种类型
与键入的语言相比:
可能无法生成程序
因为类型可能不匹配
因为一个程序可以包含多种类型
在PLT中,非类型化只是指动态类型,类型化只是指静态类型。JavaScript在这一类中绝对是非类型的
另见:
让许多程序员困惑的问题是,类似这样的定义在某些地方没有标准化。术语非类型化编程语言是不明确的。这是指没有数据类型的语言还是指lambda演算非类型化变体的语言
JavaScript/ECMAScript有一个类型系统,其所有函数的域都将接受任何引用规范类型。因此,实际上,这意味着JavaScript只有一种数据类型。这是一个对非常高级的JavaScript程序员来说更重要的实现问题。一般的JavaScript程序员只关心关于ECMAScript指定的摘要
在日常程序员的语境中,而不是研究人员或理论计算机科学家的语境中,非类型化的术语是m
var test = "this is text";
typeof(test);