如何在javascript中使用类型变量?

问题描述 投票:8回答:11

有没有办法在javascript中使用类型变量?像integer,string,float ...

javascript
11个回答
20
投票

JavaScript变量未输入。

但是,JavaScript值是。相同的变量可以更改(分配一个新值),例如,从未初始化到数字到布尔到字符串(不是你想要这样做!):

var x;       // undefined
x = 0;       // number
x = true;    // boolean
x = "hello"; // string

0
投票

您可以使用TypeScript作为值的定义类型


0
投票

虽然JavaScript并不是一种明确的类型语言,但它类似于语言三明治中的无类型填充,具有上面(在IDE中)和下面(在编译器中)更强类型的表示。为了支持IDE友好和优化器友好的代码,有您可以使用许多技巧来获取显式类型。

JavaScript实现包括即时编译器(JIT),可将JavaScript转换为快速机器语言。他们使用的一个技巧是将其转换为中间的强类型形式。如果您的目标是性能,那么您可以通过支持const变量并将类型强制转换为更明确的类型来简化生活。

例如,JavaScript支持类型化数组之外的两种数字类型:64位Float(a.k.a。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的角度来看),它有助于编译器轻松猜测源文件如何连接在一起,支持consts,并避免编写返回多种类型的函数。


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"

1
投票

Javascript的一个主要特征是它是弱类型语言。为什么你还需要强大的类型?


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不允许这样,只接受动态值,如ruby .. 。

我希望这有帮助,你可以理解我可怜的英语:D


1
投票

在Javascript中不可能,但如果你真的需要它,你应该检查TypeScript。它是Javascript的超集,增加了可选的静态类型。它还具有基于类的编程。


0
投票

Javascript是一种松散类型的语言,所以不,没有像其他语言习惯的类型。


0
投票

人们写“为什么不应该使用它/你不应该使用它”是错误的。在下一个Java Script 2.x规范中,有一个计划来添加强类型变量。

同时,您可以使用非常简单的解决方案来模拟强类型:

var = Object.create( String );

之后,在很多IDE(包括IntelliJ IDEA)中自动完成将很有效,并且您已声明并初始化了指定类型的对象。

阅读更多关于my blog的信息。


0
投票

有一个简单的hack来使用类型化数组在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


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>

© www.soinside.com 2019 - 2024. All rights reserved.