1. 变量
在局部作用域中省略var操作符可以定义全局变量,但是这么做会导致该变量难以维护,且在严格模式下会导致抛出ReferenceError错误。
2. 数据类型(js共用6种数据类型,分别是 Undefined,Null,Boolean,Number,String,Object)
2.1 typeof操作符
对一个值使用typeof操作符可能会返回下列某个字符串:
□ "undefined" ---如果这个值未定义或者未初始化;
□ "boolean" ---如果这个值是布尔值;
□ "string" ---如果这个值是字符串;
□ "number" ---如果这个值是数值;
□ "object" ---如果这个值是对象或null;
□ "function" ---如果这个值是函数;
注:如果这个值是正则表达式,旧浏览器会返回"function",新浏览器会返回"object"。
2.2 Undefined类型
var message; // 这个变量声明之后默认取得了 undefined 值 // 下面这个变量并没有声明 // var age; alert(message); // "undefined" alert(age); // 产生错误 alert(typeof message); // "undefined" alert(typeof age); // "undefined"
2.3 Null类型
① null值从逻辑上表示一个空对象指针,所以 typeof null 返回 "object";
② 实际上undefined值派生自null值,因此ECMA-262规定对它们的相等性测试要返回true,即 null == undefined 为true;
③ 当定义的变量在将来用于保存对象,那么最好将该变量初始化为null。
2.4 Boolean类型
任何一种数据类型都可以调用Boolean()函数,在一些流控制语句(如if语句,while语句等)会自动执行相应的Boolean转换
数据类型 | 转换为true的值 | 转换为false的值 |
Boolean | true | false |
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数字值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
2.5 Number类型
2.5.1 整数
① 八进制数以0开头,若后面的数值超出范围,那么前导零将被忽略,后面的数值当成十进制数值解析(如 070解析为56;079解析为79),且八进制字面量在严格模式下是无效的,会报错。
2.5.2 浮点数值
① js保存浮点数值需要的内存空间是保存整数值的两倍(4*2=8字节),以下两种情况下浮点数会被解析成整数
var a = 1.; // 小数点后面没有数字,解析为1 var b = 10.0 // 解析为10
② 浮点数值最高精度是17位小数,且进行算术运算时精确度远远不如整数,如0.1加0.2结果不是0.3 ,而是0.30000000000000004
③ 尽可能不用除法(/)和模(%)运算,因为大多数情况下它们直接导致出现浮点数。如果必须使用除法,立即用Math.round()方法回归整数运算。
2.5.3 数值范围
① ECMAScript能表示的最大值储存在Number.MAX_VALUE上;最小值储存在Number.MIN_VALUE上(能表示的最接近0的数,值为5e-324);超过这个范围视为无穷,其中正无穷表示为Infinity,负无穷表示为-Infinity,判断一个数是否是有穷的,可以使用 isFinite() 函数,返回true则是有穷的。
2.5.4 NaN
① NaN,即非数值是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)
② 任何涉及NaN的操作(例如NaN/10)都会返回NaN,且NaN与任何值都不相等,包括NaN本身。
③ isNaN()函数接受一个任何数据类型的参数,该函数会帮我们确定这个参数是否能被转换为一个数值,且该函数用于对象时会自动调用对象的valueOf()方法,然后确定返回的值是否可以转换为数值,如果不能,则基于这个返回值再调用toString()方法,再测试返回值。
2.5.5 数值转换
Number(param):参数param可以是任何数值类型,其转换规则如下
① 如果是Boolean值,true和false分别转换为 1 和 0 。
② 如果是数字,只是简单的传入和返回。
③ 如果是null,返回0。
④ 如果是undefined,返回NaN。
⑤ 如果是字符串,遵循以下规则:
-
-
- 如果字符串中只包含数字,则将其转换为十进制数值,且忽略前导零,如果是十六进制格式,则将其转换为想通大小的十进制整数;
- 如果字符串为空,则将其转换为0;
- 其余皆转换为NaN。
-
⑥ 如果是对象,先调用对象的valueOf()方法,然后依照前面的规则转换,如果转换的结果是NaN,则调用对象的toString()方法,然后再依照上面的规则转换。
parseInt(string, radix):参数string为字符串(可以为数字),radix为基数。转换时,它会忽略前面的空格,直至遇到第一个数字字符或者负号,若不是返回NaN,若是则继续解析第二个字符知道遇到非数字字符,另外,ECMAScript3识别以0开头的八进制数,ECMAScript5不识别,以下是例子。
以下结果均返回15:
parseInt(" 0xF", 16); parseInt(" F", 16); parseInt("17", 8); parseInt(021, 8); //注意这里021是数字不是字符串, parseInt("021", 8)返回的是17 parseInt("015", 10); parseInt(15.99, 10); parseInt("FXX123", 16); parseInt("1111", 2); parseInt("15*3", 10); parseInt("15e2", 10); parseInt("15px", 10); parseInt("12", 13);
以下结果返回NaN
parseInt("Hello", 8); parseInt("546", 2);
以下结果在ECMAScript3返回0,在ECMAScript5返回8
parseInt("08");
parseFloat(string):parseFloat()与parseInt()类似,但是它始终都会忽略前导的零,且解析十六进制给事的字符串始终会被转换成0,如果字符串包含的是一个可解析为整数的数,parseFloat()会返回整数。
2.5.6 String类型
① 字符串的特点:
var lang = "Java"; lang = lang + "Script";
以上示例中实现的操作过程如下:首先创建一个能容纳10个字符的新字符串,然后在这个字符串中填充"Java"和"Script",最后一步是销毁原来的字符串"Java"和字符串"Script",因为这两个字符串已经没用了。
② 转换为字符串:
toString():除了null和undefined,其他数值类型都有这个方法,多数情况下该方法不必传递参数。但是在调用数值的toString()方法时,可以传递一个参数:输出数值的基数。如
var num = 10; alert(num.toString()); // "10" alert(num.toString(2)); // "1010" alert(num.toString(8)); // "12" alert(num.toString(16)); // "a"
String(param):String()函数遵循下列转换规则:
-
-
- 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
- 如果值是null,则返回"null";
- 如果值是undefined,则返回"undefined"。
-
2.5.7 Object类型
Object是所有对象的基础,因此所有对象都具有以下这些基本属性和方法:
constructor , hasOwnProperty(propertyName) , isPrototypeOf(object) , propertyIsEnumerable , toLocaleString() , toString() , valueOf()