第三章 基本概念
3.3 变量
-
var message 定义了一个 message 变量 保存一个特殊的值 undefined。
-
var message = “hi” 并不会标记为字符串类型,只是给变量赋值,可随时修改(不推荐)。
-
在函数中 var mes 为局部变量,退出函数后会被销毁,而省略 var 则创建了全局变量。
-
- function test(){message=“全局变量”};
-
- 但不推荐,难以维护,在严格模式下会报错;
3.4 数据类型
-
-
ECMAScript 有 5 种简单数据类型(也称为基本数据类型):
-
- Undefined;
- Null;
- Boolean
- Number;
- String;
-
- Object
-
ECMAScript 不支持任何创建自定义类型的机制。
-
ECMAScipt 数据类型具有动态性。
-
3.4.1 typeof 操作符
-
-
对一个值使用 typeof 操作符返回字符串
-
- “undefined” 如果这个值未定义;
- “boolean” 如果这个值是布尔值;
- “string” 如果这个值是字符串;
- “number” 如果这个值是数值;
- “object” 如果这个值是对象或 null;
- “function” 如果这个值是函数;
-
3.4.2 Undefined 类型
-
- 声明变量但未对其初始化时,变量的值就是 undefined。
- var message = undefined 与未初始化是等价的。
- 包含 undefined 的变量与尚未定义的变量(直接使用 message)是不一样的,后者会报错,只能执行 typeof。
- 对未初始化的变量与未定义的变量使用 typeof均返回 undefined。
- 因此即便未初始化的变量会被自动赋予 undefined 值,但我们仍应该显式的初始化变量,避免 typeof 返回 undefined 时,我们会混淆变量时未声明还是未初始化。
3.4.3 Null 类型
-
-
Null 类型只有一个值,那就是 null。
-
从逻辑角度看,null 值表示一个空对象指针,所以 typeof 返回的是 object。
-
如果定义的变量将用于保存对象,最好初始化为 null,这也只要直接检查 null 值就可以知道是否已保存一个对象的引用。
-
实际上,undefined 是由 null 派生而成,因此相等性测试返回 true。
-
- if (undefined == null ) // 通过
-
尽管如此,但用途完全不同,无论何时都没必要把变量显式设为 undefined,而对 null 而言,任何变量还没有真正保存对象,它就应该保存 null 值,不仅体现 null 作为空指针的惯例,也助于区分 null 和 undefined。
-
3.4.4 Boolean 类型
-
-
Boolean 类型只有两个字面值 true 和 false,与数字值不同,true 不一定等于 1,false 也不一定等于 0。
-
虽然 Boolean 类型的字面值只有两个,但 EMCAScript 种所有类型的值都有与 Boolean 的等价值,可使用 Boolean()函数转换 e.g. var mes =“HAHA”; var mesBl=Boolean(mes); //true
-
- if (mes) {} // 在该情况下 mes 会自动转换为对应的 boolean 值(true),所以可执行。
-
数据类型 | 转换为 true 的值 | 转换为 false 的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “” (空字符串) |
Number | 任何非零数字(包括无穷大) | 0 和 NaN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
3.4.5 Number 类型
-
-
各种数值类型
-
- 十进制整数可直接输入;
- 八进制整数,字面值的第一位必须是零(0),然后是(0~7),如果字面值超出了范围(出现 8 或 9),那么前面的 0 将会被省略,后面的值当作十进制解析;
- 十六进制,字面值前两位必须是 0x,后面是(0
9&AF),其中 A~F 不区分大小写; - 进行算术计算时,所有八进制和十六进制数值最终都将被转换为十进制数值;
-
浮点数值
-
- 数值中必须包含一个小数点,小数点后必须至少有一位数字;
- 如果小数点后没有数字,或浮点数本身表示一个整数(10.0),那么该值会被转换为整数。
- 极大极小值可以使用 e 表示法,如 1.8e10,3e-10(e 不区分大小写);
- 浮点数值最高精度是 17 位小数,0.1+0.3 的结果不是 0.3,而是 0.30000000000000004,永远不要直接比较两个浮点的大小(原因);
-
数值范围
-
- 由于内存限制,当 ECMAScript 中的值大于 Number.MAX_VALUE(1.7976931348623157e+308)或小于最小值 Number.MIN_VALUE(5e-324),将自动转换为(-)Infinity;
- 如果某次运算返回了 Infinity,将无法继续下一次计算,想要确定是否在可计算范围内,可使用 isFinite()函数,返回 true 则在范围内;
-
NaN
-
-
NaN 即非数值(Not a Number)是一个特殊的值,表示未返回数值的情况(如数值与字符串的计算);
-
任何涉及 NaN 的操作都会返回 NaN,NaN 与任何数不相等,包括 NaN 本身;
-
isNaN()函数,接受一个参数(任何类型),确定是否是 NaN
-
- isNaN(NaN) //true;
- isNaN(10) //false;
- isNaN(“10”) //false;
- isNaN(“red”) //true;
- isNaN(true) //true;
-
isNaN()会先调用 valueOf()方法看是否返回数值,再调用 toString()方法,再测试返回值;
-
-
数值转换
-
-
Number()方法
-
-
Boolean 值,true(1),false(0);
-
数字值,传入和返回;
-
null 值,0;
-
undefined,NaN;
-
字符串
-
- 只包含数字(保留正负号),转为十进制,数字前的“0”会被忽略;
- 包含有效浮点格式,转为对应的浮点数值(忽略前导的“0”);
- 包含有效的十六进制格式,如“0xf”,转为对应十进制数值;
- 空字符串,转为 0;
- 包含上述以外的字符,转换为 NaN;
-
如果是对象,则调用对象的 valueOf()方法,然后依照前面规则转换。如果返回的是 NaN,则调用 toString(),然后再次按照前面规则转换;
-
-
parseInt()方法
-
- 在转换字符串时,会忽略字符串前的空格,直到找到第一个非空字符,如果不是负号或数字,则返回 NaN,空字符也是 NaN;
- 不能识别八进制,会忽略 0 转为十进制,可识别 0x 十六进制,转换为十进制返回;
- 可使用第二参数设置进制,parseInt(“10”,2/8/10/16);
-
parseFloat()方法
-
- 与 parseInt()类似,从位置 0 开始解析到最后,或遇到无效的浮点数字字符为止,即第二个小数点会被忽略;
- 可识别所有浮点数值,但十六进制始终会被转换为 0;
- 若包含可被解析整数,则返回整数,e.g"1234blue" 返回 1234;
-
-
3.4.6 String 类型
-
- 转义符只算一个长度,如“HAHA\u03a3” length 为 5;
- 字符串一旦创建不改变,改变后销毁原先字符串
- toString()转字符串,toString(2/8/10/16)可选择转为什么进制的字符串
- String()方法,若有 toString()先调用,没有的话,null 和 undefined 返回 null 和 undefined;
3.4.7 Object 类型
- ECMAScript 中 Object 时所有对象的基础,因此所有对象都具有基本的属性和方法;
3.5 操作符
-
- ++1 是先进行自身运算再进行总的运算,i++则相反。
- 如果加法中一个操作数是字符串,则将另一个操作数转位字符串,然后将两个字符串拼接
-
e.g num1=5 num2=10 alert(“5+10 等于”+num1+num2) //5+10 等于 510;
-
- 想避免则加括号(num1+num2),先进行算术运算;
-
-
关系操作符 ><
-
- 字符串对比时,先转换为字符编码(全部大写或小写),不然只会对比首字母;
- 一个是数字一个字符串时,会将字符串转为数值,无法转换则和 NaN 对比;
- 两个字符串数字则是对比首数字的字符编码 “23” “3”,相等则继续往后对比;
-
相等操作符
-
- 相等和不相等 == / != 会对字符串进行转换后再对比,null 和 undefined 也相等;
- 全等不不全等 === / !== 不会进行转换,直接对比,null 和 undefined 不全等;
-
条件操作符
-
- var max =(num1 > num2 ) ? num1:num2; true 则 max 赋值 num1;
-
3.6 语句
-
- for 语句,循环内部定义的变量可以在外部访问;
- for-in 遍历 for (var I in a ) {};
- break 退出循环 continue 退出当前循环,继续下一次循环;
- with 语句 with(location){var I = href;} //简化多次编写同一个对象的工作 不建议使用
- js 中 switch 可以使用任何数据类型,包括字符串,对象,case 的值不一定是常量,可以是变量,表达式; // switch 中使用的是全等操作符,不会发生类型转换 “10”不等于 10;
3.7 函数
-
-
return 语句后的任何代码都不会执行,函数会执行了 return 语句后停止并立即退出;
-
ECMAScript 中不介意传进来多少个参数,可以不显示地使用命名参数;
-
- 传进来的参数可以用 arguments(类似数组)对象访问,如 arguments[0];
- 可以用过 length 属性获知传递了多少个参数;
- arguments 对象可以和命名参数一起用,如 num1+arguments[1];
- arguments 值永远和命名参数的值保持同步,如 num2=0,arguments[1]也会改为 2(内存空间独立)
- 没有被传递值得命名参数赋予 undefined 值,arguments 的长度由传入参数数量决定,与命名参数无关;
-
没有重载,后定义函数会覆盖前定义函数,可通过检查传入参数中的类型和数量作出不同反应(模仿重载);
-