我发现有人将JavaScript称为“动态,弱类型”语言,但有人甚至说“未类型”?到底是哪一个?
我发现有人将JavaScript称为“动态,弱类型”语言,但有人甚至说“未类型”?到底是哪一个?
Answers:
JavaScript 未输入类型:
(来源:no.gd)
甚至布伦丹·艾希(Brendan Eich)也是这样。在Twitter上,他回复了一个与此问题相关的话题:
因此,问题在于未类型化有几种不同的定义。
在上面的答案之一中已经讨论了一个定义-运行时不标记值,而只是将每个值视为位。JavaScript 会标记值,并基于这些标记具有不同的行为。因此,JavaScript显然不适合此类。
另一个定义来自编程语言理论(Brendan所指的学术东西)。在此域中,无类型只是意味着所有内容都属于一种类型。
为什么?因为一种语言只有在可以证明类型对齐时才会生成程序(又名Curry-Howard对应;类型是定理,程序是证明)。这意味着使用非类型化语言:
与输入语言相反:
所以你去,在PLT,类型化只是手段动态类型和类型化只是手段静态类型。在此类别中,JavaScript绝对是没有类型的。
也可以看看:
1. 2. 3.
的非键入语言与JavaScript不匹配。没有只有一个类型-大约有4 - 5。那么,如何演示JavaScript是无类型?
可以考虑强/弱与编译器(如果适用)如何处理类型有关。
弱类型意味着编译器(如果适用)不会强制执行正确的类型。没有隐式的编译器插入,指令将在运行时出错。
"12345" * 1 === 12345 // string * number => number
强类型表示有一个编译器,它希望您从 string显式转换为 integer。
(int) "12345" * 1 === 12345
无论哪种情况,如果编译器的某些功能可以确定正确的做法,它们都可以在编译时隐式地更改指令以为您进行转换。
到目前为止,JavaScript可以归类为“非强类型”。这意味着它是弱类型的或未类型的。
可以根据语言指令如何操纵类型来考虑动态/静态。
动态类型意味着值的类型是强制的,但变量仅表示任何类型的任何值。
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可以归类为非静态类型。另外,如果完全键入,它似乎是动态键入的。因此,我们需要了解“打字”的含义。
类型化是指该语言区分不同类型,例如字符串,数字,布尔值,对象,数组, null,未定义等等。同样,每个操作都绑定到特定类型。因此您不能将整数除以字符串。
2 / "blah" // produces NaN
无类型的装置分割的操作整数由串将导致在治疗的头四个字节的字符串作为整数。这是因为未类型化操作直接发生在位上,没有类型可观察。结果将是非常出乎意料的:
2 / "blah" // will be treated as 2 / 1500275048
由于JavaScript会根据“类型化”的定义来运行,因此必须如此。因此,它必须是动态类型的和弱类型的。
如果有人声称JavaScript是无类型的,那只是出于学术理论,而不是实际应用。
JavaScript的类型很弱。它肯定不是“无类型的”,但其弱类型的性质在隐式转换方面具有很大的灵活性。
请记住,JavaScript也是动态输入的。这种键入方法允许所谓的“鸭子键入”。
为了进行比较,请考虑不是强类型的 JavaScript 还是静态类型的 JavaScript 。 有时了解什么不是什么可以帮助您更好地了解它是什么。
这里使很多程序员感到困惑的问题是,这样的定义在某些地方没有标准化。术语无类型编程语言是不明确的。这是指没有数据类型的语言还是lambda演算的语言无类型变体吗?
JavaScript / ECMAScript具有类型系统,并且其所有功能的域都将接受任何参考规范类型。因此,实际上意味着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的无类型变体)混淆,这就是关联谬误。
请记住,JavaScript允许您询问什么是typeof(your_variable)
,并比较类型:5==="5"
return false
。因此,我认为您不能称其为无类型。
它是动态的(估计为)弱类型。您可能想知道它使用Duck键入(请参阅andrew的链接),并通过原型提供OOP,而不是类和继承。
String a = "blah";
或var a:String = 'blah';
(即键入变量)。这就是为什么它没有类型。
键入时(您可以询问“ typeof someVar”并了解其特定类型,但它非常弱。
鉴于:
var a = "5";
您可能会说a是一个字符串。但是,如果您再写:
var b = a + 10;
b是一个等于15的int,因此a的行为就像int一样。当然,您可以这样写:
var c = a + "Hello World";
并且c等于“ 5Hello World”,因此a再次像字符串一样工作。