有没有办法在javascript中使用类型变量?像integer,string,float ......
答案 0 :(得分:20)
未输入JavaScript变量。
但是,JavaScript值。相同的变量可以更改(分配一个新值),例如,从未初始化到数字到布尔到字符串(不是你想要这样做!):
var x; // undefined
x = 0; // number
x = true; // boolean
x = "hello"; // string
答案 1 :(得分:6)
Javascript是动态类型的,而其他语言,例如C#和Java,是静态类型的。这意味着在Javascript变量中可以重新分配给任何类型的值,因此您不需要显式地表示变量的类型或函数的返回类型。如果您在静态类型语言中看到这样的代码
int x = 5;
x = "hello";
你理所当然地期望编译器开始抛出一个令人讨厌的TypeError
。另一方面,Javascript将很乐意运行此代码,即使类型已更改。
var x = 5;
x = "hello";
因为变量可以更改类型,所以编译器无法了解有关它们的更多信息。你应该期望Javascript的工具不如Java / C#的工具,就像代码完成那样有用的细节而言。在编译时会捕获更少的错误,您将不得不进行比以往更多的运行时调试。
也就是说,这也让您可以更自由地使用变量,并且可以随意更改类型,这通常很方便。如果你愿意,你可以编写这样的代码:
var x; //typeof x === "undefined"
x = "Hello, world!"; //typeof x === "string"
x = 42; //typeof x === "number"
x = false; //typeof x === "boolean"
x = {}; //typeof x === "object"
答案 2 :(得分:2)
在Javascript中不可能,但如果你真的需要它,你应该检查TypeScript。它是Javascript的超集,增加了可选的静态类型。它也有基于类的编程。
答案 3 :(得分:1)
Javascript的一个主要特征是它是弱类型语言。为什么你还需要强大的类型呢?
答案 4 :(得分:1)
我建议你读这个:
http://en.wikipedia.org/wiki/Strong_typing
javascript是一个弱且动态的类型..它是动态的,因为变量类型是在运行时确定的,并且是松散类型的,因为你可以执行此操作,例如
var letter = "2";
var number = 2;
console.log(letter+number);
这在java,c#或任何其他静态和严格类型的语言中都会出错,但在javascript中你会得到一个" 22"结果(这是因为javascript是弱类型或松散类型)
现在..你使用其他语言而不是使用类型值,比如clojure或dart,出于性能原因,你可以使用带有类型参数的函数或方法,javascript不允许这样做,只接受动态价值观,如红宝石......
我希望这有帮助,你可以理解我可怜的英语:D
答案 5 :(得分:0)
Javascript是一种松散类型的语言,所以不,没有其他语言习惯的类型。
答案 6 :(得分:0)
人们写作"为什么不能使用它/你不应该使用它"错了。在下一个Java Script 2.x规范中,计划添加强类型变量。
同时,您可以使用非常简单的解决方案来模拟强类型:
var = Object.create( String );
之后,在很多IDE(包括IntelliJ IDEA)中自动完成功能将很有效,并且您已声明并初始化了指定类型的对象。
详细了解my blog。
答案 7 :(得分:0)
使用类型化数组在Javascript中模拟类型变量有一个简单的方法。
var a = new Int8Array(1);
a[0]=5;
a[0]=~a[0]; // -6
var b = new Uint8Array(1);
b[0]=5;
b[0]=~b[0]; // 250
我知道永远这样做的唯一有用的原因是,当你需要在一个类型化的语言中转换代码时,你需要对无符号整数使用按位运算,这种语言必须在Javascript中完全相同。默认情况下会对Javascript整数进行签名,按位操作会使符号变得混乱。
仅为单个变量创建类型化数组通常不利于性能。
...常
var b=5;
b=(~b)&0xff; // 250
会很好地完成这个技巧,只需要在Javascript中输入32位无符号整数,以避免按位操作出现问题。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays#Typed_array_views
答案 8 :(得分:0)
<html>
<head>
<meta charset="utf-8">
<title>JS_Byte</title>
<script>
class Byte
{
constructor(Value)
{
this.Number = new Uint8Array(1);
this.Number[0] = Value;
}
get Get()
{
return this.Number[0];
}
set Set(newValue)
{
this.Number[0] = newValue;
}
};
//On load
function Load_Page()
{
let Byte_Num = new Byte(12);
document.write(Byte_Num.Get.toString() + "<br>");// -> 12
Byte_Num.Set = 14;
document.write(Byte_Num.Get.toString() + "<br>");// -> 14
Byte_Num.Set = 256;
document.write(Byte_Num.Get.toString() + "<br>");// -> 0
}
</script>
</head>
<body onload="Load_Page()">
</body>
答案 9 :(得分:0)
您可以使用TypeScript来定义值的类型
答案 10 :(得分:0)
虽然JavaScript不是明确的类型化语言,但就像无类型填充语言三明治一样,上面(在IDE中)和下面(在编译器中)具有更强类型的表示形式。为了支持IDE友好和优化程序友好的代码,您可以使用许多技巧来获取显式类型。
JavaScript实现包括即时编译器(JIT),可将JavaScript转换为快速的机器语言。他们使用的技巧之一是将其转换为中间的强类型形式。如果您的目标是性能,则可以通过偏爱const
变量并将类型强制为更明确的类型来使生活更轻松。
例如,JavaScript支持类型化数组之外的两种数字类型:64位浮点数(又称double)和32位整数。虽然默认为double,但是您可以使用|0
将数字强制为整数,如下所示:
const myInt = 3.0 | 0;
您会在高性能代码中看到很多这种模式,尤其是在键入数组之前编写的内容。
拥有显式类型的另一个原因是使开发人员的生活更轻松。 Microsoft发明了TypeScript,以便IDE(尤其是Visual Studio)可以提供代码完成,重构(尤其是重命名)和错误检测的功能。它是通过强类型语言来实现的。 TypeScript的语言目标之一是为JavaScript提供未来的方向。由于这个目标,TypeScript是JavaScript的超集,因此不会向TypeScript添加任何在将来的JavaScript版本中无法提供的功能。同样,如果将来的JavaScript版本破坏了TypeScript,则会更改TypeScript以匹配JavaScript。
TypeScript不是JavaScript,那么为什么要启动它呢?因为即使您没有使用它,您的编辑器也可能会使用。由于TypeScript是JavaScript的超集,因此TypeScript编译器可以解析JavaScript,并为所有函数和变量生成类型信息。因此,如果您使用Visual Studio,WebStorm或带有TypeScript插件的编辑器,即使使用纯JavaScript,也可以获得类型信息! (如果您在JavaScript中使用TypeScript功能,聪明的人会警告您。)
事实上,我最近听到的反对使用TypeScript的争论之一是JavaScript编辑器已经变得如此出色(由于嵌入的TypeScript编译器),以至于优势不再超过拥有另一种语言的负担。
但是,具有强类型(从IDE的角度来看),有助于使编译器轻松猜测源文件如何连接在一起,支持const
,并避免编写返回多个函数的函数。类型。