一:语法
1:区分大小写
- ECMAScript中的一切(变量名,函数名,操作符)都区分大小写
2:标识符
- 标识符:变量名,函数名,属性的名字,函数的参数;
- 开头:下划线 || 字符 || 美元符号$
- 其他:字母 || 数字 || 下划线 || 美元符号
- !:不能把true、false、null、关键字、保留字用做标识符
3:注释
/*这个*必须
* 这个*非必须
* 这个*非必须
*/
4:严格模式
- ECMAScript5引入了严格模式,为javascript定义了严格模式
- 作用:在严格模式下,ECMAScript3中的一些不确定行为将得到处理;而且将对某些不安全的操作抛出错误;
- 使用:在函数内部/脚本顶部添加 ** “use strict” **
5:语句
二:关键字和保留字
- ECMAScript全部关键字(带*是第五版新增的)
|
|
|
|
|
|
|
|
break |
do |
instanceof |
typeof |
case |
else |
new |
var |
catch |
finally |
return |
void |
continue |
for |
switch |
while |
debugger* |
function |
this |
with |
default |
if |
throw |
delete |
in |
try |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
abstract |
booleam |
byte |
const |
char |
class |
debugger |
double |
enum |
export |
extends |
float |
final |
goto |
int |
import |
interface |
implements |
long |
native |
public |
private |
package |
protected |
static |
short |
super |
synchronized |
throws |
transient |
volatile |
|
ECMAScript5 新增保留字
|
|
|
|
|
|
|
|
implements |
package |
public |
interface |
private |
static |
let |
protected |
ECMAScript5 非严格模式下保留字缩减为
|
|
|
|
|
|
|
|
class |
const |
enum |
export |
extends |
import |
super |
|
三:变量
四:数据类型
- 6种基本数据类型:Undefined,Null,Boolean,Number,String,Symbol
- 1种复杂数据类型:Object;
1:typeof操作符
- 用途:检测给定变量的数据类型;
- 用法:
typeof 95;
typeof(95)
;
- typeof操作符可能返回值
|
|
|
|
|
|
|
操作数 |
对象或null |
值未声明或声明未赋值 |
函数 |
布尔值 |
数值 |
字符串 |
返回值 |
“Object” |
“undefined” |
“function” |
“Boolean” |
“number” |
“string” |
2:Undefined类型
- 只有一个值
- 声明但是未初始化的变量的值为undefined;
var message; message==undefined;//true
- 未声明的变量;
typeof message;//undefined
3:Null类型
- 只有一个值;
- 若定义的对象在将来用于保存对象,最好将其初始化为null;
null == undefined; //true
4:Boolean类型
- 两个字面值:true和false;//true不一定等于1,false不一定等于0
- Boolean区分大小写,True和False都不是布尔值;
- 方法:
Boolean()
转型函数,将其他类型的值转为Boolean值;
转换规则
数据类型 |
转换为true的值 |
转换为false的值 |
Boolean |
true |
false |
String |
任何非空字符串 |
“”(空字符串) |
Number |
任何非零数字值(包括无穷大) |
0和NAN |
Object |
任何对象 |
null |
Undefined |
a/A(不适用) |
undefined |
5:Number类型
- 例子
var a=55; //整数
var b=025; //八进制的21
var c=029; //无效的八进制,解析为29
var d=0xA; //十六进制,解析为10
- 严格模式下八进制无效;
- 进行算数计算时,所有以八进制和十六进制表示的数值都会被转换为十进制数值;
5.1:浮点数值
- a、保存浮点数值所需空间是整数的二倍;
- b、e表示法:
var floatNum = 3.12e7; //等于31200000
- c、浮点数的最高精度是17位小数;
- d、
0.1+0.2; //0.30000000000000004
;
- e、永远不要测试某个特定的浮点数值;
5.2:数值范围
- a、ECMAScript表示的最小数值:Number.MIN_VALUE //5e-324
- b、ECMAScript表示的最小数值:Number.MAX_VALUE //1.7976931348623157e+308;
- c、若计算中得到一个超出JacaScript数值范围的值,则该值将被自动转换成Infinity值,(+Infinity或-Infinity)该值无法进行下一次的运算;
- 函数:isFinite(),判断某值是否位于最大和最小值之间,若是返回true;
5.3:NaN
- 用处:用于表示一个本来要返回数组的操作数但是未返回数值的情况;
- 特点1:0除以0返回NaN;正数/0 => Infinity;负数/0 => -Infinity;
- 特点2:任何涉及NaN的操作都会返回NaN;
- 特点3:NaN与任何职都不相等,包括NaN本身;
- 方法:isNaN(),接受一个参数,用于判断该参数是否"不是数值";
- 例子:
isNaN(NaN); //true
isNaN(10); //false
isNaN("10"); //false
isNaN("blue"); //true
isNaN(true); //false(可被转换为数字1)
- 在基于对象调用isNaN()时,会首先嗲用对象的valueOf()方法确定该对象能否被转为数值,若不能,则基于该方法调用toString()方法,在测试返回值;
5.4:数值转换
- 将非数值转换为数值的三个函数:Number()、parseInt()、parseFloat();
- Number()函数用于任何数据类型(转换字符串)
操作值 |
返回值 |
undefined |
NaN |
null |
0 |
Boolean |
true和false转换为1或0 |
Number |
简单的传入传出 |
String——【若字符串只包含数字(包括前面带正负号情况)】 |
数值 |
String——【若字符串包含有效浮点格式】 |
转换为对应的浮点数值,忽略前导0 |
String——【若字符串为空】 |
转换0 |
String——【若字符串包含有效十六进制】 |
转换为相同大小十进制 |
String——【若字符串包含除上述格式之外的自付】 |
转换为NaN |
Object |
调用对象的valueOf()方法,然后依照前面的规则转换返回值,若转换的结果是NaN,则调用对象的toString()方法然后依照前面的规则返回的字符串值 |
- parseInt() 方法:
- 始终忽略前导空格,直到找到第一个非空格字符;
- 若第一个字符不是数字字符或负号,返回NaN;
- 可指定进制;
例子 |
返回值 |
parseInt("") |
NaN |
parseInt(“70”) |
70(十进制) |
parseInt(“0xA”) |
10(十六进制) |
parseInt(“070”) |
【ECMAScript 5 =》70】【ECMAScript 3 =》56(八进制)】) |
parseInt(“070”,8) |
56(八进制) |
parseInt(“1234blue”) |
1234 |
parseInt(“22.5”) |
22 |
- parseFloat() 函数
- 第一个小数点有效,第二个无效
- 始终忽略前导0
- 只解析十进制;
操作 |
返回值 |
parseFloat(“1234bule”) |
1234 |
parseFloat(“0xA”) |
0 |
parseFloat(“22.5”) |
22 |
parseFloat(“22.5.6”) |
22.5 |
parseFloat(“0308”) |
308 |
parseFloat(“3.125e7”) |
31250000 |
6:String类型
|
|
|
|
|
|
|
|
|
|
字面量 |
\n |
\t |
\b |
\r |
\ |
’ |
" |
\xnn |
\unnnn |
含义 |
换行 |
制表 |
空格 |
回车 |
斜杠 |
单引号 |
双引号 |
以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示"A" |
以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ |
- \u03a3表示一个字符
- 方法一:toString() 方法
- 数值,布尔值,对象,字符串值都有toString()方法,null和undefined没有
- 返回字符串的副本
- 可给toString()方法指定基数
var num=10;num.toString(2); //"1010"
- 方法二:String() 方法
- 在不知道要转换的值是不是null或undefined的情况下,用这个安全;
- 转换规则
- 若值有toString()方法,则调用该方法并返回相应的结果;
- 若值是null,返回null;
- 若值是undefined,返回undefined;
7:Object类型
- ECMAScript中的对象:一组数据和功能的集合;
- Object的每个实例都具有下列属性和方法
- constructor:保存着用于创建当前对象的函数;
- hasOwnProperty(propertyName):用于检测给定的属性在当前对象中(而非实例的原型中)是否存在,其中作为参数的PrptertyName必须以自妇产形式指定;
- isPrototypeOf(Object):用于检查对象是否是传入对象的原型;
- propertyIsEnumerable(propertyName):用于检查给定的属性能否被for-in语句枚举;与 hasOwnProperty()方法一样,作为参数的属性名必须以字符
串形式指定;
- toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应;
- toString():返回对象的字符串表示;
- valueOf():返回对象的string、number或boolean表示。通常与 toString()方法的返回值相同;
- 在ECMAScript中Object是所有对象的基础,因此所有的对象都具有这些基本的属性和方法;
- 从技术上讲,ECMA-262中对象的行为不一定适用于JavaScript中的其他对象,浏览器环境中的对象,比如BOM和DOM中的对象,都属于宿主对象,他们是由宿主实现提供和定义的。ECMA-262不负责定义宿主对象,因此宿主对象可能会也可能不继承Object;
五:操作符
- 适用于很多值,如Boolean,String,Number,甚至对象,不过在应用于对象时相应的操作符通常都会调用对象的**valueOf()**和(或)**toString()**方法
1:一元操作符
- 定义:只能操作一个值的操作符
- 1.1:递增递减操作符
- 规则
- 应用于包含有效数字字符的字符串时:先将其转换为数字值,再执行加减1操作,字符串变量变成数值变量;
var s1 = "2";++s1; //3
- 应用于不包含有效数字字符的字符串时:先将变量设置为NaN,字符串变量变成数值变量;
var s2 = "aa";++s2; //NaN
- 应用于布尔值:分贝转换为0 和 1再执行加减1操作,布尔值变量变成数值变量;
var s3 = false;++s3; //1
- 应用于浮点数值:执行加减1操作;
var s4 = 0.2;++s4; //1.2
- 应用于对象时:先调用对象的valueOf()方法,以取得一个可供操作的值,然后对该值应用前述规则,若结果是NaN,则在调用toString()方法后再应用前述规则;对象变量变成数值变量;
var o = { valueOf: function() { return -1; } };
- 1.2一元加和减操作符
- 规则
- 应用于数值:和数学一样;
var a=5;a = +5; //5,无变化
- 应用于非数值:该操作符会像调用Number()函数一样对该值进行转换;布尔值转为0和1;字符串按照其规则转换;对象调用valueOf()和(或)toString()
2:位操作符
- ECMAScript 中的所有的数值都以IEEE-754 64位格式存储,但位操作符并不直接操作64位的值,而是先将64位的值转换为32位的整数,然后执行操作,最后再将结果转换为64位;对开发人员来说,由于64位格式是透明的,因此整个过程就像是只存在32位的整数中一样;
- 对于有符号整数,32位中的前31位用于表示整数值,32位是符号位;
- 默认情况下,ECMAScript中的所有整数都是有符号整数;
- 正数:以纯二进制存储,31位中的每一位都表示2的幂;
- 负数:以二进制补码存储;
- 计算一个数值的二进制补码
- (1):求这个数值绝对值的二进制码;
- (2):求二进制反码,即0替换为1,1替换为0;
- (3):得到的二进制反码加一;
- 对特殊的NaN和Infinity值应用位操作符时,这两个值都会被当做0;
- 对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),然后再应用位操作;
- 2.1按位非(NOT)(~):返回数值的反码,相当于操作数负值-1操作;
- 2.2按位与(AND)(&):同1返回1;
- 2.3按位或(OR)(|):有1返回1;
- 2.4按位异或(XOR)(^):
- 2.5左移(<<):操作数将数值的所有值向左移动指定位数,空位0补充;
- 2.6有符号的右移(>>):用符号位的值补充空位;
- 2.7无符号的右移(~):以0补充空位;
3:布尔操作符(将值转换为布尔值)
- 3.1 逻辑非(NOT)(!):
- 将值转换为布尔值然后对其求反;
- 规则:
- 对象:false;
- 空字符串:true;
- 非空字符串:false;
- 0:true;
- 任意非0数值(包含Infinity):false;
- null:true;
- NaN:true;
- undefined:true;
- 3.2 逻辑与(&&):短路操作符=》若操作数1为false,则无论操作数2是啥都返回false;
- 两个操作数
- 都true返回true;
- 规则:
- 操作数1为对象,返回操作数二;
- 操作数2为对象,则只有在操作数1位true时返回该对象;
- 操作数1,2均为对象,返回操作数2;
- 若有一个操作数为null,返回null;
- 若有一个操作数为NaN,返回NaN;
- 若有一个操作数为undefined,返回undefined;
- 3.3 逻辑或(||):短路操作符=》若操作数1为true,则无论操作数2是啥都返回true;
- 若操作数1是对象,则返回操作数1;
- 若操作数1的求值结果为false,则返回操作数2;
- 若俩操作数均为对象,则返回操作数1;
- 若俩操作数都是NaN,则返回NaN;
- 若俩操作数都是undefined,则返回undefined;
4:乘性操作符:乘法,除法,求模
- 乘法规则:
- 均为数值:执行常规乘法计算,若乘积超过了ECMAScript数值的表示范围,则返回Infinity 或-Infinity;
- 若其中一个操作数是NaN,则结果是NaN;
- 若Infinity 与0相乘,则结果是NaN;
- 如果是 Infinity 与非 0 数值相乘,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号;
- 如果是 Infinity 与 Infinity 相乘,则结果是 Infinity;
- 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则;
- 除法规则(/):
- 均为数值:执行常规乘法计算,若乘积超过了ECMAScript数值的表示范围,则返回Infinity 或-Infinity;
- 若其中一个操作数是NaN,则结果是NaN;
- 若0/0,则结果是 NaN;
- 若0/非0的有限数值,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号;
- 若非0数值/Infinity,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号;
- 若有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则
- 求模规则(%):
- 若操作数都是数值,执行常规的除法计算,返回除得的余数;
- 若(无穷大值)%(有限大的数值),则结果是 NaN;
- 若(有限大的数值)%(0),则结果是 NaN;
- 若(Infinity)%(Infinity),则结果是 NaN;
- 若(有限大的数值)%(无穷大的数值),则结果是被除数;
- 若0%(任何数),结果是0;
- 若有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则。
5:加性操作符
操作数 |
操作 |
一个NaN |
返回NaN |
一个字符串 |
转另一个为字符串然后拼接 |
一个操作数是Number,Boolean,对象 |
toString()方法取得相应的字符串值,再运用字符串规则 |
undefined 和 null |
分别调用 String()函数并取得字符"undefined"和"null" |
Infinity+Infinity |
Infinity |
-Infinity-Infinity |
-Infinity |
Infinity-Infinity |
NaN |
+0+0 |
+0 |
+0-0 |
+0 |
-0-0 |
-0 |
操作数 |
操作规则 |
一个操作数是String,Boolean,null,undefined |
现在后台调用Number()函数将其转换为数值,再执行其他规则进行计算。若转换的结果是NaN,则结果就是NaN |
一个操作数是对象 |
则调用对象的valueOf()方法取得该对象的数值,若得到的值是NaN,则减法的结果就是NaN。若对象没有valueOf()方法,则调用toString()方法并将得到的字符串转换为数值 |
一个操作数是NaN |
结果是NaN |
6:关系操作符
操作数 |
操作规则 |
一个操作数是数值 |
将另一个操作数转换为数值,然后进行数值比较 |
一个操作数是对象 |
则调用对象的valueOf()方法取得该对象的数值,若得到的值是NaN,则减法的结果就是NaN。若对象没有valueOf()方法,则调用toString()方法并将得到的字符串转换为数值 |
两个操作数都是对象 |
比较字符编码值 |
一个操作数是布尔值 |
将其转换为数值,在执行比较 |
- 若想使字符串按照字母表顺序排序,先使用toLowerCase()方法或toUpperCase()方法将其转换为相同大小写;
- 任何操作数和NaN比较都返回false;
7:相等操作符
- == 和!= 比较规则:先转换操作数(强制转型)再比较相等性
| 操作数 | 转型规则 |
|–|--|
| 有一个对象,另一个不是 |调用对象的 valueOf()方法,用得到的基本类
型值按照前面的规则进行比较 |
| 两个对象 | 比较他们是不是同一个对象,若是返回true |
| 有一个操作数是字符串,另一个是数值 | 将字符串转换为数值 |
| 有一个布尔值 | 转换为0 或1 |
- 特殊规则
- null 和undefined是相等的
- 在比较相等性之前,不能将null和undefined转换为其他值;
- 操作数中NaN,==返回false;!=返回true;
表达式 |
值 |
表达式 |
值 |
null == undefined |
true |
true==1 |
true |
“NaN” == NaN |
false |
true==2 |
false |
5 == NaN |
false |
undefined ==0 |
false |
NaN==NaN |
false |
null==0 |
false |
NaN!= NaN |
true |
“5”==5 |
true |
false==0 |
true |
|
|
- 全等和不全等
- 比较操作数及其类型;
null===undefined; //false
8:条件操作符
9:赋值操作符
- =
- 复合赋值操作符(*=;/=;%=;+=;-=;<<=;>>=;>>>=),仅仅是简化操作,无任何性能提升;
10:逗号操作符
var num=1 , num2=2 , num3=3;
六:语句
- 1:if语句;
- 2:do while语句,至少执行一次;
- 3:while语句;
- 4:for语句;
- 5:for-in:
- 用来枚举对象的属性,顺序不可预测;
- 先检测对象的变量值是都为null或undefined,因为ECMAScript对该情况不抛出错误而是不执行循环体;
- 使用方法:
for(var propName inwindow){
console.log(propName);
}
switch (i) {
case 25:
alert("25");
break;
case 35:
alert("35");
break;
case 45:
alert("45");
break;
default:
alert("Other");
}
start:for(var i=0;i<count;i++){
console.log(i);
}
- 8:break 和continue语句
- break:立即退出循环;
- continue:立即退出循环从循环顶部继续执行;
- 与label语句联合使用,从而返回代码中特定的位置;
var 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
- 9:with语句(严格模式下使用该模式报错;该语句会导致性能下降不建议使用;)
- 作用:将代码的作用域设置到一个特定的对象中
- 示例:
var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
with(location){
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
七:函数
1:理解参数
- ECMAScript不理会传入参数数量以及类型
- arguments对象保存传入函数的参数
2:没有重载
- 定义:相同名称的函数或者函数有不同的参数列表,这样的函数或方法互相称之为重载函数或方法;
- 因为ECMAScript函数的参数是由包含0或多个值的数组表示的,而没有函数签名(参数类型不同和数量不同),所以如果定义了两个名字相同的函数,该名字只属于后者
八:小结
- ECMAScript 中的基本数据类型包括 Undefined、Null、Boolean、Number 和 String;
- 与其他语言不同,ECMScript 没有为整数和浮点数值分别定义不同的数据类型,Number 类型可用于表示所有数值;
- ECMAScript 中也有一种复杂的数据类型,即 Object 类型,该类型是这门语言中所有对象的基础类型;
- 严格模式为这门语言中容易出错的地方施加了限制。
- ECMAScript 提供了很多与 C 及其他类 C 语言中相同的基本操作符,包括算术操作符、布尔操作符、关系操作符、相等操作符及赋值操作符等;
- ECMAScript 从其他语言中借鉴了很多流控制语句,例如 if 语句、for 语句和 switch 语句等。
ECMAScript 中的函数与其他语言中的函数有诸多不同之处。
- 无须指定函数的返回值,因为任何 ECMAScript 函数都可以在任何时候返回任何值。
- 实际上,未指定返回值的函数返回的是一个特殊的 undefined 值。
- ECMAScript 中也没有函数签名的概念,因为其函数参数是以一个包含零或多个值的数组的形式传递的
- 可以向 ECMAScript 函数传递任意数量的参数,并且可以通过 arguments 对象来访问这些参数
- 由于不存在函数签名的特性,ECMAScript 函数不能重载