我不知道为什么我从未问过自己过去几年的质疑,但突然间我找不到自己或谷歌的任何答案。
众所周知,Javascript没有变量类型。真是件好事。 但不知何故,它必须确定类型并使用它。
var a = 1;
var b = 2.0;
var c = 'c';
var d = "Hello World!";
所以我们有一个整数,双重/浮点数,字符,字符串(可以作为字符*删除)
我知道JS使用运行时解释器,但想到逻辑和“类型”必须以任何方式实现..
那么Javascript Interpreter如何识别并在内部处理变量? 在我的想象中,假设我会编写C ++,我会想到一种模板和容器以及一些逻辑,它会重载运算符并尝试检查它到底是什么。但这并没有想到最后。
请与我分享您的知识: - )
答案 0 :(得分:2)
JavaScript根据值赋值设置变量类型。例如,当JavaScript遇到以下代码时,它知道myVariable
应该是类型编号:
var myVariable = 10;
类似地,JavaScript将在以下示例中检测到变量类型是字符串:
var myVariable = "Hello World!";
JavaScript比许多其他编程语言更灵活。对于Java等语言,必须在创建变量时将变量声明为特定类型,并且一旦创建,就不能更改该类型。这称为 strong typing 。另一方面,JavaScript允许在任何时候仅通过指定不同类型的值(更好地称为 loose typing )来更改变量的类型。
以下示例完全有效地使用了JavaScript中的变量。在创建时,变量显然是类型编号。稍后将字符串分配给此变量会将类型从数字更改为字符串。
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 Language Specification 强>
<强> ECMAScript BNF Grammar 强>
<强> JAVAScript BNF Gramar 强>
答案 1 :(得分:1)
我在ES5 spec中找到的唯一有用的行是:
在本规范中,符号“Type(x)”用作“x的类型”的简写,其中“type”是指ECMAScript语言和本节中定义的规范类型。
我假设当运行时需要执行需要知道某个值的类型的操作时,它会针对每种类型检查该grammar defined in the spec的值,直到它找到一场比赛。
例如,布尔文字的语法如下:
BooleanLiteral ::
true false
如果值恰好是true
或正好false
(例如没有引号),那么该值的类型为boolean。
答案 2 :(得分:0)
JavaScript本身确实有类型,并且在内部,每个赋值都接收适当的类型。在您的示例var foo = 2.0;
中,类型将为float
。程序员不必过于担心(起初),因为JS是 loosly typed (!== type-free)。
这意味着如果我要将数字字符串与浮点数进行比较,引擎会将字符串强制转换为数字,以便可以进行比较。
松散类型和强类型语言之间的主要区别不是类型强制。在C(++)中转换为您需要的类型是很常见的,在某些情况下,值会自动转换为正确的类型(2/2.0 == 2.0/2.0 == 1.0
==&gt; int将被隐式转换为float)。 loosly类型语言和强类型语言之间的主要区别在于您声明了一个具有不同类型的变量:
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
...等功能/关键字提示:有类型,它们是'只是有点灵活。变量不限于单一类型。
答案 3 :(得分: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比这更复杂和优化,但你应该能够得到一个粗略的画面。