第3章 基本概念
严格模式
- 要在整个脚本启用严格模式,可以在顶部添加如下代码:
"use strict"
也可以在指定函数的严格模式下进行:
1
2
3
4function doSomething(){
;
//函数体
}严格模式下,JS的执行结果会有很大的不同
关键字和保留字
- 保留字在JS中还没有任何特性的用途,但它们有可能在将来被用作关键字
变量
- var操作符定义的变量将成为定义该变量的作用域中的局部变量。
- 省略var操作符,就可以创建一个全局变量。但不是推荐的做法,因为在局部作用域中定义的全局变量很难维护。
数据类型
- 5种简单数据类型:Undefined、Null、Boolean、Number、String。1种复杂数据类型:Object。
- typeof操作符是一个操作符而不是函数。
Undefined类型
- Undefined类型只有一个值,就是undefined。在使用var生命变量但未对其甲乙初始化时,这个变量的值就是undefined。
但是undefined值的变量与上位定义的变量是不一样的。
1
2
3var message;
alert(message); //"undefined"
alert(age); //age未声明,产生错误对于尚未声明过的变量,只能执行typeof操作检测其数据类型。
- 对未初始化和未声明的变量执行typeof操作符都反悔了undefined值
1
2
3var message;
alert(typepf message); //"undefined"
alert(typeof age); //"undefined"
Null类型
- Null类型只有一个值,就是null。
typeof null
会返回object,因为特殊值null会被认为是一个空的对象引用underfined值是派生自null值的。
1
alert(null==undefined); //true
不需要把一个变量的值显式地设置为undefined,但是保存对象的变量最好显示初始化为null。
数据类型 | 转换为true | 转换为false |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “”空字符串 |
Number | 任何非零数字值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | 不适用 | undefined |
Number类型
- 八进制字面值的第一位必须是0,十六进制的前两位必须是0X
- 由于浮点型数值在计算时有精度,所以0.1+0.2=0.300000000004
- ECMAScript的最大数和最小数分别保存在Number.MAX_VALUE和Number.MIN_VALUE中,如果超出范围,则会被转换成-Infinity和Infinity。
- isFinite()参数在最大值和最小值之间会返回true。
- NaN用于表示本来要返回数值的操作数未返回数值的情况。
NaN有两个特点:
- 任何涉及NaN的操作都会返回NaN;
- NaN与任何值都不相等,包括NaN本身。
isNaN()函数,确定参数是否不是数值。
数值转换
1
2Number(""); //0
ParseInt(""); //NaNparseFloat()和parseInt()的区别:
- parseFloat的小数点有效;parseInt小数点无效,只输出整数
- parseFloat忽略前导的0,只解析十进制数;parseInt能够解析八进制和十六进制数
String
- 字符串可以由双引号或单引号表示
- 字符串是不可变的,要改变某个变量保存的字符串,首先要销毁原来的字符串,再用另一个包含新值的字符串填充该变量。
- 数值、布尔值、对象和字符串值都有toString()方法,但是null和undefined没有这个方法。
- String()函数如果值有toString()方法,则调用该方法并返回相应的结果;如果是null,则返回“null”;如果是undefined,则返回“undefined”
Object
var o=new Object()
操作符
一元操作符
num=+num
对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换。位操作符
~
非操作:操作数的负值减一&
与操作:将两个二进制数的每一位对齐按与操作|
或操作:将两个二进制数的每一位对齐按或操作^
异或操作:将两个二进制数的每一位对齐按异或操作。1^1=0;0^0=0;1^0=1<<
左移:将数值的所有位向左移动指定的位数。左移不会影响操作数的正负号>>
右移:将数值的所有位向右移动指定的位数。右移不会影响操作数的正负号,补上的值是符号位的值>>>
无符号右移:正数的无符号右移与有符号右移相同,但是负数的结果不同,因为用0来填补空位。
布尔操作符
- Boolean()与!!效果相同
- 不能在逻辑与和逻辑或中使用为定义的值,会发生错误。
乘性操作符
- Infinity*0=NaN
- Infinity1=Infinity ; Infinity(-1)=-Infinity
- Infinity*Infinity=NaN ; Infinity/Infinity=NaN ; Infinity%Infinity=NaN
- 0/0=NaN
- 1/0=Infinity ; -1/0=-Infinity
- Infinity/1=Infinity ; Infinity/(-1)=-Infinity
- Infinity%1=NaN
- 1%0=NaN
- 1%Infinity=1
- 0%1=0
加性操作符
- Infinity-Infinity=NaN
1
2
3
4
5
6var message="The sum of 5 and 10 is "+5+10;
alert(message);
//The sum of 5 and 10 is 510
var message="The sum of 5 and 10 is "+(5+10);
alert(message);
//The sum of 5 and 10 is 15
关系操作符
- “23”<”3” //true 因为字符串比较的是字符编码
- “23”<3 //false 在比较字符串和数值时,字符串会被转换成数值,再进行比较
- NaN<3 //false
- NaN>=3 //false
- “a”>3 //false
相等操作符
相等和不相等
- 如果有一个操作符是布尔值或字符串,就在比较值前先转换成数值
- 如果有一个操作数是NaN,相等操作符返回flase,不相等操作符返回true
- null==undefined //true
全等和不全等
- 全等与不全等操作符 相等与不相等操作符的区别: 比较之前不转换操作数
- “55” == 55 //true
- “55” ===55 //flase
- null===undefined //false 不同类型的值
逗号操作符
- 在用于赋值的时候,逗号操作符总会返回表达式中的最后一项
- var num =(5,1,4,8,0) //num的值为0
语句
循环语句
- 不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到
- for-in语句,如果要迭代的对象的变量值是null或undefined,for-in语句会抛出错误。ECMAScript 5更正这一行为,不再抛出错误,而是不执行循环体。
label语句
- label:startement语句可以在代码中添加标签,以便将来使用。经常与break和continue连用
添加该标签break不仅会退出内部的for循环,还会退出外部的for循环
1
2
3
4
5
6
7
8
9
10
11var num=0;
outermost:
for(var i=0; i<10; i++) {
for(var j=0; j<10; j++) {
if(i==5&&j==5) {
break outermost;
}
num++;
}
}
alert(num); //55强制从外部的outermost标签处继续开始循环。53 54 60 61 …
1
2
3
4
5
6
7
8
9
10
11var num=0;
outermost:
for(var i=0; i<10; i++) {
for(var j=0; j<10; j++) {
if(i==5&&j==5) {
continue outermost;
}
num++;
}
}
alert(num); //95
with语句
- with(expression) statement 语句目的是为了简化多次编写同一个对象的工作
Switch
- 每个case的值不一定是常量,可以是变量,甚至是表达式
- 使用表达式作为case值可以有如下操作,在外面定义变量num,则可以
1
2
3
4
5
6
7
8
9var num = 25;
switch (true) {
case num < 20:
alert("less than 20");
break;
case num >20:
alert("more than 20");
break;
}
函数
- 函数在执行完return语句后停止并立即退出。因此return之后的任何代码都永远不会执行。
return;
语句可以不带有任何返回值,函数停止执行后将返回undefined值- 严格模式对函数有一些限制:
- 不能把函数命名为eval或arguments
- 不能把参数命名为eval或arguments
3.不能出现两个命名参数同名的情况
参数
- 函数体内可以通过arguments对象来访问参数数组,从而获取传递给函数的每一个参数。
- 重要:传递与函数命名参数个数不同也没有关系,参数在函数内部用一个数组表示。命名的参数只提供便利,不是必需的。
- 修改arguments[1],就会修改num2。这两个值内存空间独立,但是值同步,且影响是单向的。
- 如果只传入一个参数,那么srguments[1]设置的值不会反映到命名参数中。因为arguments对象的长度由传入的参数个数决定。num2还是undefined
1
2
3
4
5
6
7
8function doAdd(num1,num2){
arguments[1]=10;
alert(arguments[0]+num2);
alert(arguments[1]);
alert(num2);
}
doAdd(1,2); // 11 arguments[1]=10 num2=10
doAdd(1); // NaN arguments[1]=10 num2=undefined
没有重载
- 如果定义两个名字相同的函数,则该名字只属于后定义的函数