1.基本概念语法
- 区分大小写
- 标示符:以字母、下划线(_)、美元符号($)或数字组成,开头只能用前3个。驼峰命名法。
- 严格模式:“use strict”。可以只指定某个函数在严格模式下执行。
- 变量:松散类型。不建议修给变量所保存值的类型。局部变量(有var)/全局变量(没var,不推荐)。
2.数据类型
5种简单数据类型:Undefined、Null、Boolean、Number、String;
1种复杂数据类型:Object。
- Undefined:使用var声明(一定要用var声明)变量,但未对其进行初始化。只有一个值undefined。
- Null:声明后初始化为null的,表示一个空对象指针。只有一个值null。如果定义的变量将来准备用来保存对象,最好将该变量初始化为null。undefined值派生自null:console.log(null == undefined); //true;console.log(null === undefined); //false;
- Boolean:两个字面值true/false。任何数据类型的值都可调用Boolean()函数,将其转换为Boolean类型。存在自动执行的Boolean转换,如if中的判断语句和isNaN()函数。各类型转换规则如下:
数据类型 | 转换为true的值 | 转换为false的值 |
Boolean | true | false |
String | 任何非空字符串 | " "(空字符串) |
Number | 任何非零数字值(包括无穷大) | 0 和 NaN |
Object | 任何对象 | null |
Undefined | n/a不适用 | undefined |
- Number:十进制、八进制('0'开头)、十六进制('0x'开头)。浮点数值,可用e表示法(3.125e7),永远不要测试某个特定的浮点数值(IEEE754通病)。Number.MIN_VALUE(最小值)/Number.MAX_VALUE(最大值),可加负号表示负数。超出范围被转换为Infinity值,函数isFinite(变量)测试变量是否在数值范围之内。NaN(即非数值,Not a Number),表示本来要返回数值的操作数未返回数值的情况(这样就不会抛出异常,影响其他代码的执行);isNaN(参数)确定这个参数是否"不是数值"。Number(参数)可以转换任何数据类型,转换规则比较复杂。parseInt(待转换的字符串,多少进制/2/8/10/16):把字符串转为十进制整数,先找到第一个非空字符,如果第一个字符不是数字字符或负号,则返回NaN。parseFloat(需转换的字符串):把字符转换为一个浮点数,只解析十进制,对十六进制的字符串始终返回0,若字符串包含的是可解析的整数的数,会返回整数。
- String:.toString()方法,除了null和undefined,其余都有这个方法,调用数值的toString()方法时,可以传递数值的基数(2/8/10默认/16)做参数;String(要转型的变量),适用于任何类型。
- Object类型:是所有对象的基础,即后面声明的对象都继承它。.toString()、valueOf()、isPrototypeOf(object)。
Number()函数的转换规则,适用于后面对数值进行操作时的隐式转换:
- 如果是Boolean值,true和false将转换为1和0。
- 如果是数字值,只是简单的传入和返回。
- 若果是null值,返回0;如果是undefined,返回NaN。
- 如果是字符串,规则如下:如果字符串中只包含数字(包括前面带正负号的情况,前导零会被忽略),则将其转换为十进制。如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值(忽略前导零)。有效十六进制转换为同样大小的十进制。空字符串转换为0。若字符串中包含上述格式之外的字符,则将其转换为NaN。如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值,如果转换的是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串。
3.操作符
- 一元操作符:++a/--a(a先改变再做其他运算);a++/a--(a先参与运算再改变)。num = +num(数值不会产生任何影响);num = -num(用于表示负数)。
- 位操作符:对于有符号的整数,32位的前31位表示整数的值,第32位表示数值的符号:0正1负。按位非(~)、按位与(&)、按位异或(^)、左移(<<,左移不会影响操作数的符号位)、有符号的右移(>>)、无符号右移(>>>)。这一块没好好看
- 布尔操作符:逻辑非(!)、逻辑与(&&)、逻辑或(||)。
- 逗号操作符:var num = (5,1,4,8,0); //num的值为0 在用于赋值时,逗号操作符总会返回表达式中的最后一项。
- 其他操作符:+ - * / === == !== != 等等一大堆常见的
4.语句
跟Java和c++的语句没啥太大差别。下面是几个我自己需要注意也是不太一样的地方:
- for-in:例:for(var propName in window){document.write(propName);}。 建议在使用for-in循环之前,先检测确认该对象的值不是null或undefined。
- label:在代码中添加标签,以便将来使用。一般都要与break/continue和循环语句使用。
- with:新增的语句。将代码的作用域设置到一个特定的对象中。with(location){//可以直接使用location中的属性变量等}。大量使用with语句会导致性能下降,同时也会给调试代码造成困难,因此不建议使用with语句。
- switch:与其他语言不一样的地方,可以在switch语句中使用任何数据类型(在很多语言中只能使用数值),无论是字符串还是对象都没有问题。case的值不一定是常量,可以是变量,甚至是表达式。
- 函数:可以向函数传递任意数量的参数。函数的参数在内部是用一个数组来表示,在函数体内可以通过arguments对象来访问这个数组,另外:arguments的值永远与对应的命名参数的值保持同步,另外记住:如果只传入了一个参数,那么为arguments[1]设置的值不会反映到命名参数中,因为argements对象的长度是由传入的参数个数决定,不是由定义函数时的命名参数的个数决定的。没有重载,如果定义了两个名字相同的函数,则该名字只属于后定义的函数。未指定返回值得函数返回的是一个特殊的undefined值。