与其说是JavaScript基础,不如叫ECMAScript基础,由于关于语法、类型、控制语句、函数等都是ECMAScript标准制定的。javascript
ECMAScript版次目前是第5版次,可是目前主流浏览器支持版次并不一致,正如咱们在第一篇简介中介绍的同样,ECMA-262第4版没有发布就夭折了,因此如今主流浏览器支持的是第三和第五版,须要是咱们会特别指出区别。java
ECMAScript语法大量借鉴了C及其余类C语言(如Java和Perl)的语法。inode
1.同C同样,Javascript的变量是区分大小写的。标识符、注释、语句也同C相似,特别指出的是:Javascript 语句的末尾不加分号也能够正常执行,但不建议这样作。数组
ECMAScript 5 引进了严格模式(strict mode)的概念。严格模式是位javascript定义了一种不一样的解析与执行模型。在严格模式下,ECMAScript 3 中的一些不肯定的行为将获得处理,并且对某些不安全的操做也会抛出错误。要在整个脚本中启动严格模式,能够在顶部添加以下代码:浏览器
“use strict”;
这行代码看起来想字符串,并且没有赋值给任何变量,但其实他是一个编译指示,用于告诉支持的JavaScript引擎切换到杨哥模式。安全
ECMAScript的变量是松散类型的,能够用来保存任何类型的数据。定义变量是使用var操做符。函数
同C同样ECMAScript也有局部变量,在函数内生命的变量是局部变量,函数外没法访问。但若是函数体内不是用var声明的变量就全局变量,所以函数体外能够访问。可是在严格模式下,给未经生命的变量赋值会返回ReferenceError异常。spa
3.数据类型调试
ECMAScript有五种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number、String。还有一种复杂数据类型:Object。code
使用typeof操做符返回字符串可能有:undefined、boolean、string、number、object、function。对null使用typeof操做符会返回“object”,由于特殊值null被认为是一个空的对象引用。
Undefined类型只有一个值,就是undefined。在使用var声明变量但未对其加以初始化时,这个变量就是undefined。
Null类型也只有一个值,就是null。null==undefined返回是true。
Boolean类型有两个值,true和false。使用转型函数Boolean() 能够讲一个值转换成其对应的Boolean值。转换规则以下:
数据类型 | 转换成ture的值 | 转换成false的值 |
Boolean | true | false |
String | 任何非空字符串 | “”(空字符串) |
Number | 任何非零数字值 | 0和NaN |
Object | 任何对象 | null |
Undefined | undefined |
Number类型使用IEEE754格式来表示整数和浮点数值。整数能够用8进制和16进制表示,其中8进制前导是0,16进制前导是0x。注意,在严格模式下8进制格式是无效的,会抛出异常。浮点数值可使用科学表示法来表示,如var floatNum=3.14e6;注意IEEE754数值的通病是精度问题,如0.2+0.1=0.300000000000000004,因此0.2+0.1!=0.3。ECMAScript可以表示的最小数值保存在Number.MIN_VALUE中。最大值保存在Number.MAX_VALUE中。Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINNITY保存着负和正的超出范围的值,分别为:-Infinity和Infinity。有一个函数能够判断数值是否有限:isFinite()。NaN即非数值。首先,任何涉及NaN的操做都会返回NaN,这个特色是在多部计算中有可能致使的问题。其次,NaN与任何值都不相等。包括NaN。因此NaN!=NaN。函数:isNaN()能够判断参数是否不是数值。
有三个函数能够把非数值转换成数值:Number() parseInt() parseFloat()。使用parseInt()方法建议放入两个参数,第二个参数用来肯定第一个参数表明的进制。
String类型用单引号和双引号并无区别。ECMAScript中字符串是不可变的,也就是说一旦字符串建立,他们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,而后再用另外一个包含新值的字符串填充该变量。把一个值转换成字符串使用该值自带的toString方法(相似java),可是null和undefined是没有这个方法的。那么就要使用String()方法。null返回“null”,undefined返回“undefined”。
Object类型其实就是一组数据和功能的集合。同java中java.lang.Object方法同样,是全部对象的父类。其中包含的属性和方法以下:
在ECMAScript中Object是全部对象的基础,所以全部对象都具备这些基本的属性和方法。
一元操做符:++/--/+/-同C语言。
位操做符:非~ / 与& / 或| / 异或^ / 左移<< / 有符号右移>> / 无符号右移>>>
布尔操做符:非!/ 与&& / 或||
乘性操做符:乘法* / 除法/ / 求模%
加性操做符:加法+ / 减法-
关系操做符:大于> / 小于< / 大于等于>= / 小于等于<=
相等操做符:相等和不相等== != 先转换再比较 / 全等和不全等 === !== 仅比较不转换
条件操做符: ?:同java
赋值操做符: = 在等号前面再添加乘性操做符、加性操做符或位操做符就能够完成复合赋值操做。
逗号操做符:逗号操做符多用于声明多个变量。
if语句、do-while语句、while语句、for语句、for-in语句、label语句、break、continue语句、with语句、switch语句
须要特别讲一下的是label语句,这个语句相信是来自汇编或C的,用于在代码中添加标签,以便未来使用,通常都配合break和continue使用(是由于没有goto语句)。由于break和continue都只能跳出最近的一次循环,配合label就能够想跳出多少个循环就跳出多少个循环了,通常label放在for以前。
"use strict"; var 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++; } } console.log(num);
想一下这段代码会返回什么?答案是95.由于i==5 j==5的时候跳出了循环,i继续增长变成6,j继续从0开始,致使i5 j五、i5j六、i5j七、i5j八、i5j9五次没有执行。
with语句不建议使用由于会影响效率,并且增长了调试难度。
其余语句和c或java并没有二致。
ECMAScript函数的参数与大多数其余语言中函数的参数不一样,ECMAScript的函数不介意传递进来多少个参数,也不在意传递进来参数是什么类型。ECMAScript中参数在内部是用一个数组表示的。函数接收到的始终都是这个数组,而不关心数组中有哪些参数。在函数体内能够经过arguments对象来访问这个数组,进而获取到传递给函数的每个参数。
其实arguments只是与数组相似,并非Array的实例。
ECMAScript中全部参数传递的都是值,不可能经过引用传递参数。
由于ECMAScript函数没有函数签名,因此ECMAScript函数没有重载。咱们能够经过判断arguments的长度来变相的来实现重载。
function doAdd(){ if(arguments.length == 1){ console.log(arguments[0] + 10); }else if(arguments.length == 2){ console.log(arguments[0] + arguments[1]); } } var arg0 = 10; var arg1 = 20; doAdd(arg0); //返回20 doAdd(arg0, arg1); //返回30
ECMAScript中包含了全部基本的语法、操做符、数据类型、已经完成基本计算任务所必须的对象。可是没有对取得输入和产生输出的机制作规定。目前大多数实现所遵循的都是ECMA-262的第三版,但已经有一部分开始实现第5版了。
ECMAScript的基本要素有: