一、语法
1.1 区分大小写
1.2 标示符第一个字符必须是字母,下划线或者$,其他字符可以是数字,字母,下划线以及$
1.3 单行注释//,多行注释/**/
1.4 语句结尾尽量加上分号,因为代码压缩的时候,可能会因为语句结尾没有分号而出错
二、变量
2.1 ECMAScript的变量是松散型的,即可以用来保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符而已,使用var来定义变量
2.2 如果使用var操作符来定义变量,那么这个变量就成为定义该变量的作用域中的局部变量,如果不使用var操作符的变量则是全局变量
三、数据类型
3.1 ECMAScript有5种简单数据类型,一种复杂数据类型
3.2 简单数据类型有Undefined、Null、Boolean、Number、String,复杂数据类型为Object,Object是由一组无序的名值对组成
3.3 typeof操作符:由于ECMAScript是松散型的语言,因此需要一种手段来检测给定变量的数据类型,typeof操作符返回的字符串如下
3.3.1 "undefined":该变量没有定义
3.3.2 "boolean":该变量是布尔值
3.3.3 "string":该变量是字符串
3.3.4 "number":该变量是数值
3.3.5 "object":该变量是对象或者null
3.3.6 "function":该变量是函数
var m; alert(typeof m);//undefined m=true; alert(typeof m);//boolean m="true"; alert(typeof m);//string m=1; alert(typeof m);//number m=new Object(); alert(typeof m);//object m=function(){}; alert(typeof m);//function
3.4 Undefined类型只有一个值就是undefined,只有在使用var操作符声明变量但未对其初始化时,该变量的值才为undefined
3.4.1 注意没有定义和没有初始化的区别
alert(typeof age);//undefined
alert(age);//
3.5 Null类型只有一个值就是null,表示一个空对象指针,定义该值的变量是准备保存对象的变量,在保存变量以前初始化为null
3.5.1 undefined派生自null值,因此undefined==null;//true
3.5.2 由于定义为null值的变量是准备保存object的,因此利用typeof操作符检索该变量,返回值为object
3.6 Boolean类型只有两个值true和false
3.6.1 所有类型的值都有与true和false相等价的值,转换的时候使用转型函数Boolean()
数据类型 | 可以转换为true的值 | 可以转换为false的值 |
Boolean | true | false |
String | 任何非空的字符串 | ""(空字符串) |
Number | 任何非0的数字 | 0和NaN |
Object | 任何对象 | null |
Undefined | undefined |
3.7 Number类型使用IEEE754表示整数和浮点数
3.7.1 八进制第一位必须是0,后面的数字必须是0到7之间的,如果超过就被当做十进制的数值来解析
3.7.2 十六进制头两位是0x,后面是0-9和a到f,可以大小写混用
3.7.3 浮点数:必须包含小数点,小数点后至少有一位数字,由于浮点数所需内存空间是整数的两倍,所以如果小数点后没有数字会被当做整数,同样,
3.7.3.1 如果该浮点数本身就是一个整数,例如1.0,那么该值也被当做整数
3.7.3.2 对于极大极小的数,利用科学计数法表示,默认ECMAScript遇到小数点后面有6位以上的浮点数,就转换为科学计数法
3.7.3.3 浮点数的最高精度是17位,但是计算时远远不如整数,因此永远不要测试某个特定的浮点数alert(0.1+0.2);//0.30000000000000004
3.7.3.4 最大值与最小值Number.MIN_VALUE和Number.MAX_VALUE超过最大值和最小值表示为正负无穷大Infinity和-Infinity
3.7.3.5 判断一个数值是否位于最大值和最小值之间的函数isFinite()
3.7.4 NaN是一个特殊的数值,表示一个本来要返回数值的操作未返回数值的情况,例如4/0,,
3.7.4.1 任何与NaN有关的操作都返回NaN
3.7.4.2 NaN与任何值都不相等,包括其自身
3.7.4.3 判断某一变量是否”不是数值“的函数isNaN()
3.7.5 数值转换的三个函数Number()可用于任何数据类型,parseInt()和parseFloat()专门用于字符串转换成数值
3.7.5.1 Number()的转换规则
3.7.5.1.1 如果是Boolean的true和false转换为1和0
3.7.5.2 如果是数值就直接返回
3.7.5.3 如果是null,返回0
3.7.5.4 如果是undefined,返回NaN
3.7.5.5 如果是字符串,忽略掉字符串前面的0,转换成十进制,如果开头有ox,则转化成与十六进制大小相等的十进制数值,如果为"",转换为0,如果包含其他字符转换为NaN
3.7.6 parseInt()的转换规则
3.7.6.1 只针对字符串,
3.7.6.2 会找到第一个非空格的字符,如果该字符不是数字以及符号,就返回NaN,空字符串也是NaN,直到解析到非数字字符为止
3.7.6.3 如果开头的非空字符为0或者ox时,则字符串会被当做八进制或者十六进制进行解析,解析后返回的都是与其相等的十进制的数
3.7.6.4 可以指定第二个参数为8或者16,那么该字符串会被当做八进制或者十六进制进行解析,解析结果返回的仍然是与之相等的十进制的数
3.7.7 parseFloat()的转换规则:从第一个非空的字符开始,直到遇到一个无效的浮点数字字符为止,只解析十进制值,因此没有第二个参数,ox开头的字符返回0
3.8 String类型:用于表示由0个或者多个Unicode字符组成的字符序列,可以用双引号或者单引号表示,没有区别
3.8.1 length属性:返回字符串中16位字符的数目
3.8.2 ECMAScript中的字符串是不可变的,即一旦字符串创建,它们的值是不可改变的,要改变某个变量保存的字符串,首先用包含新值的字符串填充该变量,然后销毁原来的字符串
3.8.3 针对3.8.2的例子
var lang="java"; lang=lang+"script"; //进行这步操作:首先创建一个可以容纳10个字符的新字符串,然后用"java"和"script"进行填充,填充完后,销毁字符串"java"和"script"
3.8.4 转换为字符串的方法:toString()方法和String()函数
3.8.5 除了null和undefined外每个值都有的toString()方法,该方法会返回相应值的字符串表现
3.8.6 toString()方法:数值调用的该方法可以传递参数:输出数值的基数,返回用参数进制表示的数值的字符串形式
3.8.7 String()函数:由于null和undefined没有toString()方法,因此只能用String()函数
3.9 Object类型:是一组数据和功能的集合,是所有它的实例的基础,因此它具有的任何属性和方法也都存在于更具体的对象中
3.9.1 constructor属性:该属性保存了用于创建当前对象的函数,即当前对象的构造函数,object类型的构造函数就是Object()
3.9.2 hasOwnProperty(属性名)方法:用于检查给定的属性是否存在于当前对象的实例中,而不是实例的原型中
3.9.3 isPrototypeOf(对象)方法:用于检查传入的对象是否是调用该方法对象的原型
3.9.4 propertyIsEnumerable(属性名)方法:用于检查给定属性是否可以使用for-in语句进行枚举
3.9.5 toString()方法:返回对象的字符串表示
3.9.6 valueOf()方法:返回对象的字符串、数值或者布尔值的表示
四、操作符
4.1 位操作符:用于最基本的层次上,按内存中表示数值的位来操作数值
4.1.1 位操作只针对32位的整数:ECMAScript中数值都是以64位格式存储,但按位操作并不直接操作64位,而是先将64位转换成32位的整数,然后执行操作,操作完毕后再转回64位
4.1.2 对于有符号的整数,前31位表示整数的数值,第32位表示数值的符号,0为正,1为负,成为符号位
4.1.3 负数:使用二进制补码进行存储,第一绝对值的二进制,第二,取反,0->1,1->0,第三,加1
4.1.4 计算-18的二进制表示:18=(10010)2;取反 (111...01101)2;加1 (111...01110)2
4.1.5 我们看到的负数的二进制为:负数的绝对值的二进制码前面加上符号
var lang=-18; alert(lang.toString(2));//-10010
4.1.6 按位非(NOT)~:取反,实质:对数值的负数减1
4.1.7 按位与(AND)&:只有都是1时菜返回1,
4.1.8 按位或(OR)|:只要有一个是1就返回1
4.1.9 按位异或(XOR)^:只有一个1时才返回1
4.1.10 左移(<<移的位数):除了符号位全部向左移动,左移不影响符号位,右侧空出来的位用0填充
4.1.11 有符号右移(>>):除了符号位全部右移,用符号位填充左侧空出来的位
4.1.12 无符号的右移(>>>):包括符号位全部右移,0填充空白位
4.2 布尔操作符:逻辑非!,逻辑与&&,逻辑或||
4.3 乘法操作符:Infinity*0==NaN,Infinity*正数(包括Infinity)=Infinity,Infinity*负数(包括-Infinity)==-Infinity
4.4 除法操作符:Infinity/Infinity=NaN
4.5 加法操作符:-Infinity+Infinity=NaN;如果一个操作数是字符串,则是拼接字符串,例如"8"+4="84"
4.6 减法操作符:Infinity-Infinity=NaN
4.7 关系操作符:
4.7.1 如果一个是数值一个是字符串,则字符串会转换成数值进行比较;
4.7.2 如果两个都是字符串会依据字符编码进行比较,例如"23"<"3";//true
4.7.3 任何操作数和NaN比较都是false
4.8 相等操作符(==):先强制转换,然后再比较
4.8.1 null==undefined
4.8.2 NaN不等于任何值,包括其自身
4.8.3 "5"==5
4.8.3 全等操作符(===):两个操作数不经转换就相等"5"!==5
4.9 逗号操作符:在用于赋值时,逗号操作符总会返回表达式中的最后一项
var lang=(-18,2); alert(lang);//2
4.10 for-in语句:一种精确的迭代语句,可以用来枚举对象的属性
for(var name in window){//利用for-in来显示BOM中window对象的所有属性 document.write(name+"<br/>"); }
4.11 label语句:定义的标签可以在将来由break或者continue语句引用,一般都与for语句等循环语句配合使用
4.12 break语句:立即退出循环,强制继续执行循环后面的语句,continue:立即退出循环,从循环顶部继续执行
4.13 with语句:将代码的作用域设定到一个特定的对象中
with(location){ document.write(hostname+"<br/>");//原本应该是location.hostname document.write(href+"<br/>");//原本应该是location.href }
五、函数
5.1 函数不必指定是否返回值,只要return语句后跟要返回的值即可实现返回值
5.2 函数在执行到return语句后悔立即停止并退出,return后面的代码永远不会得到执行
5.3 return语句不带任何返回值时,会返回undefined值,这种做法一般用在需要提前停止函数执行而又不需要返回值的情况
5.4 ECMAScript函数不介意传递进来参数个数以及类型,因为ECMAScript中的参数在内部是用一个数组来表示的,函数接收到的始终是这个数组,至于数组中包含的内容并不关心
5.5 可以使用arguments对象来访问参数数组,arguments[i]来访问第i+1个参数,arguments.length确定传递进来的参数的个数
5.6 没有传递值的命名参数将被自动赋值undefined
5.7 ECMAScript中所有的参数都是值传递,没有引用传递
5.8 如果出现两个相同名字的函数,后者会覆盖前者