5

我不知道为什么在过去几年我从来没有问过自己这个问题,但突然间我找不到自己或谷歌的任何答案。

众所周知,Javascript 没有变量类型。真是一件好事。但不知何故,它必须确定类型并使用它。

var a = 1;
var b = 2.0;
var c = 'c';
var d = "Hello World!";

所以我们拥有的是一个 Integer、Double/Float、Character、String(可以拆解为 char*)

我知道 JS 与运行时解释器一起工作,但考虑到逻辑和“类型”必须以任何方式实现..

那么 Javascript 解释器如何识别并在内部处理变量呢?在我的想象中,假设我会编写 C++,我会想到一种模板和容器,以及一些重载运算符的逻辑,并尝试检查它到底是什么。但这并没有想到最后。

请与我分享您的知识:-)

4

4 回答 4

2

JavaScript 根据值分配设置变量类型。例如,当 JavaScript 遇到以下代码时,它知道myVariable应该是 number 类型:

var myVariable = 10;

同样,JavaScript 将在以下示例中检测到变量类型为字符串:

var myVariable = "Hello World!";

JavaScript 也比许多其他编程语言灵活得多。对于 Java 等语言,必须在创建变量时将其声明为特定类型,并且一旦创建,该类型就无法更改。这称为强类型。另一方面,JavaScript 允许随时更改变量的类型,只需分配一个不同类型的值(通常称为松散类型)。

以下示例是 JavaScript 中变量的完全有效使用。在创建时,变量显然是 number 类型。稍后将字符串分配给此变量会将类型从数字更改为字符串。

var myVariable = 10;
myVariable = "This is now a string type variable";

变量的数据类型是 JavaScript 脚本引擎对变量当前持有的数据类型的解释。一个字符串变量保存一个字符串;一个数字变量保存一个数字值,依此类推。然而,与许多其他语言不同,在 JavaScript 中,同一个变量可以保存不同类型的数据,所有这些都在同一个应用程序中。这是一个由术语松散类型和动态类型所知的概念,这两者都意味着 JavaScript 变量可以根据上下文在不同时间保存不同的数据类型。

完整的文章在这里:http ://www.techotopia.com/index.php/JavaScript_Variable_Types

另一篇可能对您有所帮助的文章:http: //oreilly.com/javascript/excerpts/learning-javascript/javascript-datatypes-variables.html

有用的链接:

ECMAScript 语言规范

ECMAScript BNF 语法

JAVAScript BNF 语法

于 2012-09-11T07:26:11.620 回答
1

我可以在ES5 规范中找到的唯一有用的行是:

在本规范中,符号“Type(x)”用作“x 的类型”的简写,其中“type”是指本节中定义的 ECMAScript 语言和规范类型。

假设当运行时需要执行需要知道某个值类型的操作时,它会根据规范中为每种类型定义的语法检查该值,直到找到匹配项。

例如,布尔文字的语法如下:

布尔文字::

  true 
  false

如果该值完全true或完全正确false(例如没有引号),则该值是布尔类型。

于 2012-09-11T07:25:45.803 回答
0

JavaScript 本身确实有类型,并且在内部,每个赋值都会接收到适当的类型。在您的示例var foo = 2.0;中,类型将为float. 程序员不必担心太多(起初),因为 JS 的类型很松散(!== 无类型)。
这意味着如果我要将数字字符串与浮点数进行比较,引擎会将字符串强制转换为数字,以便可以执行比较。

不过,松散类型语言和强类型语言之间的主要区别不是类型强制。在 C(++) 中转换为您需要的类型是很常见的,在某些情况下,值会自动转换为正确的类型(2/2.0 == 2.0/2.0 == 1.0==> int 隐式转换为浮点数)。松散类型语言和强类型语言之间的主要区别在于您声明了一个具有不同类型的变量:

int i = 0;//ok
//Later:
i = 'a';//<-- cannot assign char to int

而 JS 允许你这样做:

var i = 1;//int
i = 1.123;//float
i = 'c';//char, or even strings
i = new Date();//objects

typeof但是,正如, instanceof, parseFloat, parseInt, ...这样的功能/关键字toString所暗示的:存在类型,它们只是更灵活一点。并且变量不限于单一类型。

于 2012-09-11T07:32:54.943 回答
0

想象实现的一种简单方法是所有值都保存在对象中,并且所有变量都是指针......在 C++ 中:

struct Value
{
    int type;
    Value(int type) : type(type) { }
    virtual ~Value() { }

    virtual std::string toString() = 0;
};

struct String : Value
{
    std::string x;
    String(const std::string& x) : Value(STRING_TYPE), x(x) { }
    virtual std::string toString()
    {
        return x;
    }
};

struct Number : Value
{
    double x;
    Number(double x) : Value(NUMBER_TYPE), x(x) { }
    ...
};

struct Object : Value
{
    // NOTE: A javascript object is stored as a map from property
    //       names to Value*, not Value. The key is a string but
    //       the value can be anything
    std::map<std::string, Value *> x;
    Object() : Value(OBJECT_TYPE), x(x) { }
    ...
};

例如,每当必须执行操作时(例如a+b),您需要检查变量指向的对象的类型以决定要做什么。

请注意,这是一个超简单的解释......今天的 javascript 比这更复杂和优化,但你应该能够得到一个粗略的画面。

于 2012-09-11T07:40:34.910 回答