首先介绍一下 typeof
typeof 是用于检测给定变量的数据类型的,其操作对象既可以是变量也可以是数值字面量,typeof 是一个操作符而不是函数,因此例子中的圆括号尽管可以使用,但不是必需的
返回值 | 说明 |
undefined | 如果这个值未定义 |
boolean | 如果这个值是布尔值 |
string | 如果这个值是字符串 |
number | 如果这个值是数值 |
object | 如果这个值是对象或 null |
function | 如果这个值是函数 |
下面举几个使用 typeof 的例子:
var message = "some string";
alert(typeof message); //string
alert(typeof (message)); //string
alert(95); //number
undefined 类型
- undefined 类型只有一个值,即特殊的 undefined。在使用 var 声明变量但未对其加以初始化时,这个变量的值就是 undefined。请看下面的两个等价的例子:
var message;
alert(message == undefined); //true
var message = undefined;
alert(message == undefined); //true
- 第二个例子使用 undefined 值初始化了变量 message,但我们没有必要这么做,因为未经初始化的值默认就会取得 undefined 值
Null 类型
- null 类型是第二个只有一个值的数据类型,这个特殊的值是 null。从逻辑角度看,null 值表示一个空对象指针,而这也正是 typeof 操作符检测 null 值时会返回 object 的原因,如下面的例子所示:
var car = null;
alert(typeof car); //object
-
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其它值
-
实际上,undefined 值是派生自 null 值的,因此 ECMA-262 规定对它们的相等性测试要返回 true:
alert(null == undefined); //true
- 尽管 null 和 undefined 有这样的关系,但它们的用途完全不同。无论在什么情况下,都没有必要把一个变量的值显示地设置为 undefined,可是同样的规则对 null 却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存 null 值,这样做不仅可以体现 null 作为空对象指针的惯例,而且也有助于进一步区分 null 和 undefined。
Boolean 类型
- 该类型只有两个字面值:true 和 false。这两个值和数字值不是一回事,因此 true 不一定等于 1,而 false 也不一定等于 0。
- 需要注意的是,Boolean 类型的字面值 true 和 false 是区分大小写的。也就是说,True 和 False(以及其它的混合打小写形式)都不是 Boolean 值,只是标识符。
- 虽然 Boolean 类型的字面值只有两个,但 ECMAScript 中所有类型的值都有与这两个 Boolean 值等价的值。要将一个值转换为其对应的 Boolean 值,可以调用转型函数 Boolean(),如下所示:
var message = "hello world";
var messageAsBoolean = Boolean(message);
- 可以对任何数据类型的值调用 Boolean() 函数,而且总会返回一个 Boolean 值,下表给出了各种数据类型及其对应的转换规则:
数据类型 | 转换为 true 的值 | 转换为 false 的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “”(空字符串) |
Number | 任何非零数字值,包括无穷大 | 0 和 NaN |
Object | 任何对象 | null |
Undefined | n/a(或N/A,是 not applicable 的缩写,意思是“不适用”) | undefined |
Number 类型
-
这种类型使用 IEEE754 格式来表示整数和浮点数值(浮点数值在某些语言中也被称为双精度数值)
-
进制相关知识:
-
除了十进制以外,整数还可以通过八进制或十六进制的字面值来表示。
-
八进制字面值的第一位必须是 0,然后是八进制数字序列(0~7),如果字面值中的数值超出了范围,那么前导零将被忽略,后面的数值将被当作十进制数值解析
var octalNum1 = 070; //八进制的56 var octalNum2 = 079; //无效的八进制数值,解析为79 var octalNum3 = 08; //无效的八进制数值,解析为8
-
十六进制字面值的前两位必须是 0x(零和小写的 x),后跟任何十六进制数字(0~9 及 A~F)。其中,字母可以大写也可以小写
var hexNum1 = 0xA; //十六进制的10 var hexNum2 = 0x1f; //十六进制的31
-
-
浮点数值: 即该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。
-
虽然小数点前面可以没有整数,但这种写法并不推荐
var floatNum1 = 1.1; var floatNum2 = 0.1; var floatNum3 = .1; //有效,但不推荐
-
浮点数值的最高精度是 17 位小数,但在进行算术计算时其精确度远远不如整数。例如,0.1 加 0.2 的结果不是 0.3,而是 0.30000000000000004(15 个 0)。这个小小的舍入误差会导致无法测试特定的浮点数值:
<script> var a = 0.1; var b = 0.2; if(a + b == 0.3) { alert("success"); }else { alert("not"); //弹出这个 } </script>
-
-
NaN: 即 Not a Number,是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况,这样就不会抛出错误了。例如,在 ECMAScript 中,任何数值除以非数值都会返回 NaN,而不是像在其它编程语言中一样会导致错误,从而停止代码运行。
-
NaN 的两个特点:任何涉及 NaN 的操作都会返回 NaN;NaN 与任何值都不相等,包括 NaN 本身
-
isNaN() 函数:该函数接受一个参数,参数可以是任何类型。函数会帮我们确定这个参数是否 “不是数值”,并且在接收参数之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,请看下面的例子:
alert(isNaN(NaN)); //true alert(isNaN(10)); //false(10 是一个数值) alert(isNaN("10")); //false(可以被转换为数值 10) alert(isNaN("blue")); //true(不能转换为数值) alert(isNaN(true)); //false(可以被转换成数值 1)
-
String 类型
-
String 类型用于表示由零或多个 16 位 Unicode 字符组成的字符序列,即字符串。字符串可以由双引号或单引号表示,因此下面两种写法都是有效的:
var firstName = "Nicholas"; var lastName = 'Zakas':
-
ECMAScript 中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
Object 类型
-
ECMAScript 中的对象其实就是一组数据和功能的集合,对象可以通过执行 new 操作符后跟要创建的对象类型的名称来创建。创建 Object 类的实例的方法如下:
var o = new Object();
这个语法与 Java 中创建对象的语法相似;但在 ECMAScript 中,如果不给构造函数传递参数,则可以省略后面的那一对圆括号,即:
var o = new Object; //有效,但不推荐这样做