当程序需要将值保存起来以备将来使用时,便将其赋值给一个变量,值的类型称作数据类型。
JavaScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说,每个变量仅仅是一个用于保存值的占位符而已。定义变量时要使用关键字
来声明的,如下所示:
- var
- var message;
这行代码定义了一个名为
的变量,该变量可以用来保存任何值(像这样未经过初始化的变量,会保存一个特殊的值
- message
)。JavaScript 也支持直接初始化变量,因此在定义变量的同时就可以设置变量的值,如下所示:
- undefined
- var message = "hello";
此时,变量
中保存了一个字符串值
- message
。像这样初始化变量并不会把它标记为字符串类型,因此,可以在修改变量值的同时修改值的类型。如下所示:
- "hello"
- var message = "hello";
- message = 100; // 有效的语句,不好的写法
在这个例子中,变量
一开始保存了一个字符串值
- message
,然后该值又被一个数字值 100 取代。虽然我们不建议修改变量所保存值的类型,但这种操作在 JavaScript 中完全有效。
- "hello"
有一点必须注意,即使用
运算符定义的变量是的该作用域中的局部变量。也就是说,如果在函数中使用
- var
定义一个变量,那么这个变量在函数退出后就会被销毁,例如:
- var
- function test() {
- var message = "hello"; // 局部变量
- }
- test();
- console.log(message); // 产生错误
这里,变量
是在函数中使用
- message
定义的,是局部变量。当函数被调用时,就会创建该变量并为其赋值。而在此之后,这个变量又会立即被销毁,因此例子中的下一行代码就会导致错误。不过,可以像下面这样省略
- var
运算符,从而创建一个全局变量:
- var
- function test() {
- message = "hello"; // 全局变量,不好的写法
- }
- test();
- console.log(message); // "hello"
这个例子省略了
运算符,因而
- var
就成了全局变量。这样,只要调用一次
- message
函数,这个变量就有了定义,就可以在函数外部的任何地方被访问到。
- test()
虽然省略
运算符可以定义全局变量,但这也不是推荐的做法,因为在局部作用域中定义全局变量很难维护,给未经声明的变量赋值在严格模式下会抛出
- var
错误。
- ReferenceError
JavaScript 中有 5 种简单数据类型(也称为「基本数据类型」或「原始数据类型」):
、
- Undefined
、
- Null
、
- Boolean
、
- Number
。还有 1 种复杂数据类型
- String
,
- Object
本质上是由一组无序的名值对组成的。JavaScript 不支持任何创建自定义类型的机制,所有值最终都将是上述 6 种数据类型之一。
- Object
运算符
- typeof
鉴于 JavaScript 是松散类型的,因此需要有一种手段来检测给定变量的数据类型,
就是负责提供这方面信息的运算符。对一个值使用
- typeof
运算符可能返回下列某个字符串:
- typeof
,如果这个值未声明或已声明但未初始化。
- "undefined"
,如果这个值是布尔值。
- "boolean"
,如果这个值是字符串。
- "string"
,如果这个值是数值。
- "number"
,如果这个值是对象或
- "object"
。
- null
,如果这个值是函数。
- "function"
下面是几个使用
运算符的例子:
- typeof
- var message = "some string";
- console.log(typeof message); // "string"
- console.log(typeof(message)); // "string"
- console.log(typeof 95); // "number"
从以上例子可以看出,
运算符既可以对变量使用,又可以对字面量使用。由于
- typeof
是一个运算符而不是函数,因此例子中的圆括号尽管可以使用,但并不提倡。
- typeof
结果是
- typeof null
是历史遗留 Bug,在 ECMAScript 6 中,曾经有提案为历史平反, 将
- "object"
的值纠正为
- type null
,但最后该提案被拒。理由是历史遗留代码太多,不如继续将错就错。
- "null"
从技术角度讲,函数在 JavaScript 中是对象,不是一种数据类型。然而,函数也确实有一些特殊的属性,因此通过
运算符来区分函数和其他对象是有必要的。
- typeof
来源: http://www.cnblogs.com/shi0090/p/5778255.html