一、语法

1.大小写
区分大小写,在ECMAScript中的一切(变量,函数名和操作符)都区分大小写。

2.标识符(变量,函数,属性得名字或函数的参数)
第一个字符必须是一个字母,下划线_ 或一个美元符号,其他字符可以是字母,下划线,美元符号或数字。
采用驼峰大小写格式,即第一个字母小写,剩下的每个有意义的单词首字母大写,如:var myFristCar = null;

3.注释

//单行注释

/**
 * 多行,块注释
 * 
 */

4.句尾的分号不是必须的

二、关键字和保留字

关键字

if,else,for,in,continue,break,do,while,switch,case,default,return,
try,catch,throw,
var,void,
new,delete
this,
typeof,
function,
with,
instanceof,
finally,
debugger

保留字

int,short,boolean,long,double,char,float
private,public,protected,
abstract,
enum,
export,import,
interface,
static,const,
byte,
extends,
super,
final,
native,
synchronized,
class,
package,
throws,
goto,
transient,
debugger,
implements,
volatile,

三、变量

JS中变量是松散类型的,可以用来保存任何类型的数据。每个变量仅仅是一个用于保存值得占位符而已,JS只在特定的时间保存特定值得一个名称,由于不存在定义某个变量的数据类型,变量的值及其类型可以在脚本的生命周期内改变。变量声明如下:

var message = "hello js";
message = 100;//有效,但不推荐

使用var定义的变量会成为定义该变量的作用域中的局部变量,如:

function testFunc(){
    var message = "testFunc";
}
testFunc();
alert(message);//错误!

四、数据类型

JS中有5种简单数据类型(基本数据类型):undefined,Null,Boolean,Number,String。还有一种复杂数据类型Object(由一组无序的名值对组成)。

typeof操作符可以返回变量的数据类型:

"undefined"
"boolean"
"string"
"number"
"object"
"function"

在使用var声明变量但未初始化时,这个变量的值就是undefined,如:

var message;
typeof(message);//undefined

Boolean()函数可以返回一个Boolean值,转换规则如下:

数据类型

转换为true

转换为false

Boolean

true

false

String

非空字符串

空字符串

Number

非零数字

0和NaN

Object

非空对象

null

Undefined

不适用(n/a)(N/A)

undefined

Number

最基本的数值字面量格式是十进制整数,如:

var intNum = 50;
var intNum = 070;//8进制
var intNum = 079;//无效的8进制,解析为79
var intNum = 0xA;//16进制的10

进行计算时,所有的以八进制和十六进制表示的数值最终都会被转换成十六进制。为了节省空间,类似1.0这样的浮点值会自动转换为整型。浮点数值在进行算数计算的时候应该考虑精度问题,用浮点值去做判断的时候尤其注意,如:

var num1 = 0.1;
var num2 = 0.2;
cc.log(num1+num2);//0.30000000000000004

由于内存的限制,当数值超出最大限制Number.MAX_VALUE后会自动转换成特殊的Infinity值,如果是负数则转换成-InfinityInfinity无法继续参与下次的计算。可以用isFinite()函数判断数值是不是有穷的。

NaN(非数值):用于表示一个本来要返回数值的操作数未返回数值的情况,如任何数除以0会返回NaN。任何涉及NaN的操作都会返回NaN,NaN与任何值都不相等,包括NaN本身。isNaN(data)接受数据并尝试将这个值转换为数值,如果成功则返回false,否则返回true。

isNaN(NaN);//true
isNaN(10);//false
isNaN("str");//true
isNaN(true);//false

数值转换:有3个函数可以把非数字转换为数值,Number(),parseInt(),parseFloat()。Number()可用于任何数据模型,parseInt(),parseFloat()专门用于字符串转换。

Number()
1.Boolean值,true转换为1,false转换为0
2.数值,简单的传入与返回
3.null,返回0
4.undefined,返回NaN
5.字符串,空字符串,转换为0;如果包含任何非数值字符,则转换为NaN;其余转换为数值。
6.对象,调用对象的valueOf()方法,依前面规则转换返回的值。如果转换结果为NaN,调用对象的toString()方法,再次依照前面的规则转换。

Number("Hello World");//NaN
Number("");//0
Number("00011");//11
Number(true);//1

parseInt()
在转换字符串时,会忽略字符串前面的空格,直到找到第一个非空格字符,如果第一个字符不是数字字符或负号,则返回NaN。如果第一个是数字字符,则继续解析第二个直到解析完或遇到一个非数字字符。

parseInt("123blue");//123
parseInt("");//NaN
parseInt("0xA");//10
parseInt("22.5");//22
parseInt("70");//70
parseInt("10",2);//2 按二进制解析
parseInt("10",8);//8 按八进制解析
parseInt("10",10);//10 按十进制解析
parseInt("10",16);//16 按十六进制解析

parseFloat()
只解析十进制,字符串中的第一个小数点是有效的,第二个无效,后面的会被忽略。

parseFloat("123Blue");//123
parseFloat("0xA");//0
parseFloat("22.5");//22.5
parseFloat("22.5.34");//22.5
parseFloat("0908.5");//908.5

Object
JS中的对象其实是一组数据和功能的集合,var obj = new Object();Object的每个实例都具有以下属性和方法:

Constructor:保存用于创建当前对象的函数。

hasOwnProperty(propertyName):用于检查给定的属性在当前的对象实例中是否存在。

isPrototypeOf(object):用于检查传入的对象是否是另一个对象的原型

propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举

toLocalString():返回对象的字符串表示,该字符串与执行环境的地区对应

toString():返回对象的字符串表示

valueOf():返回对象的字符串,数值或布尔值表示。

五、语句

if语句

if(expression){
    statement;
}else{
    statement;
}

do-while语句

do{
    statement;
}while(expression);

while语句

while(expression){
    statement;
}

for语句

for(var i=0;i<count;i++){
    alert(i);
}

for(;i<count;){
    alert(i);
}

//无线循环
for(;;){
    doSomething();
}

for-in语句,精准的迭代,可以用来枚举对象的属性

for(var propName in window){
    document.write(propName);
}
//注意:for-in会遍历对象的每个属性,但是顺序是不可预测的。另外注意在迭代的时候注意空值的情况null和undefined。

Label语句,使用Label语句可以在代码中添加标签,以便将来使用,多在for语句等循环中和break,continue配合使用。

var num1 = 0;
for (var i = 0 ; i < 10 ; i++){
    for (var j = 0 ; j < 10 ; j++){
        if( i == 5 && j == 5 ){
            break;
        }
        num1++;
    }
}
alert(num1); // 循环在 i 为5,j 为5的时候跳出内层循环,但会继续执行外层循环,输出 95

var num2 = 0;
outPoint:
for (var i = 0 ; i < 10 ; i++){
    for (var j = 0 ; j < 10 ; j++){
        if( i == 5 && j == 5 ){
            break outPoint;
        }
        num2++;
    }
}
alert(num2); // 循环在 i 为5,j 为5的时候跳出双重循环,输出 55,outPoint标签表示外部的for语句

switch语句

switch(expression){
    case value:
        statement;
        break;
    case value:
        statement;
        break;
    default:
        break;
}

六、函数

基本语法:

function funcName(arg0,arg1){
    statements;
}

参数:JS中的函数并不介意参数个数和参数类型,也就是说即使函数只定义了两个参数,调用时也可以传递一个或多个。因为,在内部参数是以数组的方式进行传递的,因此可以不在乎个数和格式。在函数体内可以通过arguments对象来访问这个参数数组。

arguments与Array类似,如可以通过方括号访问元素,arguments[0],arguments[1]等,使用length来确定个数。命名的参数只提供便利,但不是必须的,解析器也不会验证命名参数。

function testFunc(){
    alert(arguments.length);
}

arguments的值永远与对应命名的参数的值同步,如:

function testFunc(num1,num2){
    arguments[1] = 10;
    alert(arguments[0] + num2);
}

该函数会重写第二个参数,将第二个参数的值变为10,因为arguments对象的值会自动反映到对应的命名参数上,所以修改arguments[1]也就修改了num2。不过,这并不代表两个值会访问相同的内存空间,它们的内存空间是独立的,但值会同步。

修改命名参数并不会改变arguments中对应的值,另外arguments对象的长度由实际传入的参数个数决定,而不由函数定义的命名参数个数决定,没有传递值得命名参数将被赋予undefined值。

注意:JS中的所有参数传递的都是值,不可能通过引用传递参数。

JS中的函数不能像传统意义上那样实现重载,因为函数没有签名,参数是由一个或多个值得数组来表示的,因此真正的重载不可能做到。如果定义了两个名字相同的函数,则该名字只属于后定义的函数。

JS中的函数无须指定函数的返回值,函数可以在任何时候返回返回值,实际上,未指定返回值的函数返回的是一个特殊的undefined值。