一.语法
1.区分大小写
如test和Test分别表示两个不同的变量
2.标识符
标识符指的是变量、函数、属性的名字,或者函数的参数。标识符可以是按照下列格式规则组合起来的一个或多个字符:
第一个字符必须是一个字母、下划线(_)或一个美元符号($)
其他字符可以是字母、下划线、美元符号或数组
推荐采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词首字母大写:
firstSecond、myCar、doSomethingImportant
不能将关键字、保留字、true、false、和null用作标识符
3.注释
类C风格,有//单行注释与/* */多行注释两种
4.严格模式
ES5中引入了严格模式的概念。严格模式是为Javascript定义了一种不同的解析与执行模型。在严格模式下,ECMAScript3中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误。
在整个脚本中启用严格模式,可以在顶部添加代码:"use strict";
指定函数在严格模式下执行,可在函数内部的上方包含"use strict"
5.语句
javascript中的语句以一个分好结尾;如果省略分号,则由解析器确定语句的结尾,如下例所示:
var sum = a + b//即使没有分好也是有效的语句——不推荐
var diff = a - b//有效的语句——推荐
可以使用C风格的语法把多条语句组合到一个代码快中,即代码快以左括号({)开头,以右括号(})结尾:
if (test){
test = false;
alert(test);
}
虽然条件控制语句(如IF语句)只在执行多条语句的情况下才要求使用代码快,但最佳实践是始终在控制语句中使用代码快——即使代码快中只有一条语句,例如:
if (test)
alert(test);//有效,但容易出错,不要使用
if (test){ //推荐使用
alert(test);
}
在控制语句中使用代码快可以让编码意图更加清晰,而且也能降低修改代码时出错的几率。
二.关键字和保留字
关键字是一组具有特定用途的标志,这些关键字可用于表示控制语句的开始和结束,或者用于执行特定操作等。按照规则,关键字也是语言保留的,不能用作标识符
javascript描述了另一组不能用作标识符的保留字。尽管保留字在这门语言中还没有任何特定的用于,但它们有可能将来被用作关键字
此外,严格模式与非严格模式的保留字限制也不相同,具体有哪些关键字与保留字可自行百度
三.变量
javascript变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话说,每个变量仅仅是一个用于保存值的占位符而已。定义变量时要使用var操作符(注意var是一个关键字),后跟变量名(即一个标识符),如下所示:
var message;
这行代码定义了一个名为message的变量,该变量可以用来保存任何值,如:
var message = "hi";
message = 10;//有效,但不推荐
var操作符定义的变量将成为该变量的作用域中的局部变量。也就是说,如果在函数中使用var定义了一个变量,那么这个变量在函数退出后就会被销毁,例如:
function test(){
var message = "hi";// 局部变量
}
test();
alert(message);// 错误!
若省略var操作符,将创建一个全局变量:
function test(){
message = "hi";// 全局变量
}
test();
alert(message);// "hi"
虽然使用var操作符可以定义全局变量,但这种做法不被推荐。
可以使用一条语句定义多个变量,只要像下面这样把每个变量(初始化与否均可)用都好隔开即可:
var message = "hi",
found = false,
age = 29;
四.数据类型
javascript有5种简单数据类型(也成为基本数据类型):Undefined、Null、Boolean、Number和String。还有一种复杂数据类型——Object,Object的本质是由一组无序的明值对组成的。
1. typeof操作符
typeof操作符可用来检测变量的数据类型,对一个值使用typeof操作符可能返回下列某个字符串:
"undefined"——如果这个值未定义;
"boolean"——如果这个值是布尔值;
"string"——如果这个值是字符串;
"number"——如果这个值是数值;
"object"——如果这个值是对象或null
"function"——如果这个值是函数
下面是几个使用typeof操作符的例子:
var messa = "some string";
alert(typedof message);// "string"
alert(typeof (message));// "string"
alert(typeof 95);// "number"
从技术角度讲,函数在javascript中是对象,不是一种数据类型。然而,函数也确实有一些特殊的属性,因此通过typeof操作符来区分函数和其他对象是有必要的
2.Undefined类型
Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值是undefined,例如:
var message;
alert(message == undefined);// true
3.Null类型
Null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度讲,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值时会返回"object"的原因,如下面所示的例子:
var char = null;
alert(typeof car);// "object"
4. Boolean类型
该类型只有两个字面值:true和false。这两个值与数字值不是一回事,因为true不一定等于1,而false也不一定等于0,如:
var found = false;
var lost = true;
各种数据类型转换成Boolean类型的规则:
数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 ""(空字符串)
Number 任何非零数字值(包括无穷大) 0和Nan(Not a Number)'
Object 任何对象 null
Undefined 无法转换 undefined
5.Number类型
此类型使用IEEE754格式来表示整数和浮点值。
var intNum = 55;// 十进制整数
var octalNum1 = 070;// 八进制的56
var octalNum2 = 079;// 无效的八进制数值——解析为79
var octalNum3 = 08;// 无效的八进制数值——解析为8
八进制字面量在严格模式下是无效,会抛出错误
var hexNum1 = 0xA;// 十六进制的10
var hexNum2 = 0x1f;// 十六进制的31
在进行算术计算时,所有八进制和十六进制最终都将被转换成十进制数值
1.浮点数值
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1;// 有效,解析为整数1,不推荐
var floatNum4 = 1.;// 小数点后面没有数字——解析为1
var floatNum5 = 10.0;// 整数——解析为10
var floatNum = 3.125e7;// 等于31250000
浮点值一般存在误差,不用测试某个特定的浮点值:
if (a + b == 0.3){// 错误
}
2.数值范围
javascrip能够表示的最小数值保存在Number.MIN_VALUE中——在大多数浏览器中,这个值是5e-324;能够表示的最大数值保存在Number.MAX_VALUE中——在大多数浏览器中,这个值是1.7976931348623157e+308。如每次计算的结果超出范围,则该值会被自动转换成特殊的Infinity值
3.NaN
NaN,即非数值,是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数为返回数值的情况(这样就不会抛出错误了)。例如,在其他编程语言中,任何数值除以非数值都会导致错误,从而停止代码执行。但在javascript中,任何数值除以非数值会返回NaN,因此不会影响其他代码的执行
4.数值转换
有3个函数可以把非数值转换成数值:Number()、parseInt()和parseFloat。Number()可以用于任何数据类型,而其他两个函数则专门用于把字符串转换成数组
Number()函数的转换规则如下:
如果是Boolean值,true和false将分本别转换成1和0
如果是数字值,只是简单的传入和返回
如果是null值,返回0
如果是undefined,返回NaN
如果是字符串,遵循下列规则:
如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即"1"转换成1,"123"转换成123,而"011"会变成11(注意,前导的零被忽略了)
如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样,也会忽略前导零)
如果字符串中包含有效的十六进制,例如"0xf",则将其转换为相同大小的十进制整数值
如果字符串是空的(不包含任何字符),则将其转换为0
如果字符串中包含除上述格式之外的字符,则将其转换为NaN
如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换字符串值
parseInt()转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空字符串。如果第一个字符不是数字字符或者负号, parseInt()会返回NaN;也就是说,用parseInt()转换空字符串会返回NaN。如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。
var num1 = parseInt("1234blue");//1234
var num2 = parseInt("");//NaN
var num3 = parseInt("0xA");//10(十六进制数)
var num4 = parseInt(22.5);//22
var num5 = parseInt("070");//56 (八进制)
var num6 = parseInt("70");//70(十进制数)
var num7 = parseInt("0xf");//15(十六进制数)
为消除数值转换时的分歧:
//ES3认为是56(八进制),ES5认为是70(十进制)
var num = parseInt("070");
parseInt()提供了第二个参数:转换时使用的基数
var num = parseInt("0xAf", 16);// 175
var num1 = parseInt("10", 2);//2 (按二进制解析)
var num2 = parseInt("10", 8);//8 (按八进制解析)
var num3 = parseInt("10", 10);//10 (按十进制解析)
var num4 = parseInt("10", 16);//16 (按十六进制解析)
parseFloat与parseInt解析方式类似,parseFloat解析时,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了。其次,它始终会忽略前导的0。
var num1 = parseFloat("1234blue");//1234(整数)
var num2 = parseFloat("0xA");//0 (解析十六进制时始终为0)
var num3 = parseFloat("22.5");//22.5
var num4 = parseFloat("22.34.5");//22.34
var num5 = parseFloat("0908.5");//908.5
var num6 = parseFloat("3.125e7");//31250000
6.String类型
String类型用于表示由零个或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号(")或单引号(')表示,因此下面两种字符串的写法都是有效的:
var firstName = "Nicholas";
var lastName = "Zakas";
1.字符字面量
String数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符,或者具有其他用途的字符。这些字符字面量如下表所示:
字面量 含义
\n 换行
\t 制表
\b 退格
\r 回车
\f 进纸
\\ 斜杠
\' 单引号('),在用单引号表示的字符串中使用。例如,'He said, \'hey.\''
\" 双引号("),在用双引号表示的字符串中使用。例如,"He said, \"hey.\""
\xnn 以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示“A”
\unnnn 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符∑
2.字符串的特点
字符串一经创建,他们的值就不能改变。要改变某个变量保存的字符串,首先要摧毁原来的字符串,然后再用另一个包含新值的字符串填充该变量,例如:
var lang = "Java";
lang = lang + "Script";
3.转换为字符串
第一种方式,使用toString()方法(null和undefined值没有这个方法)
var num = 10;
alert(num.toString());// "10"
alert(num.toString(2));// "1010"
alert(num.toString(8));// "12"
alert(num.toString(10));// "10"
alert(num.toString(16));// "a"
第二种方式,使用转型函数String() (null和undefined也可使用),规则如下:
如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果;
如果值是null,则返回“null”
如果值是undefined,则返回"undefined"
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1)); //"10"
alert(String(value2));// "true"
alert(String(value3));// "null"
alert(String(value4));// "undifined"
7.Object类型
javascript对象其实就是一组数据和功能的集合。对象可以通过执行new操作符后跟要创建的对象类型的名称来创建。而创建Object类型的实例并未其添加属性和方法,就可以创建自定义对象,例如:
var o = new Object();
在不传递参数的情况下,可以省略括号(不推荐):
var o = new Object;//有效,但不推荐省略圆括号
仅仅创建Object实例并没有什么用处,但关键是要理解一个重要思想:javascript中,Object类型是所有它的实例的基础。换句话说,Object类型所具有的任何属性和方法也同样存在于更具体的对象中。
Object的每个实例都具有下列属性和方法:
constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数就是Object()
hasOwnProperty(propertyName):用于检查给定的属性在当前实例中(而不是实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如,o.hasOwnProperty("name"))。
isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举,参数的属性名必须以字符串形式指定
toLocalString():返回对象的字符串表示,该字符串与执行环境的地区对应。
toString():返回对象的字符串表示
valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同
一般而言,object是所有对象的基础,因此所有对象都具有这些基本的属性和方法。在浏览器环境中的对象,比如BOM和DOM中的对象,都属于宿主对象,因为它们是由宿主实现提供和定义的,因此宿主对象可能会也可能不会集成Object
五.操作符
javascript中的操作符能够作用于很多值,如字符串、数字值、布尔值、甚至对象(调用valueOf或者toString方法)
1.一元操作符
++(前置和后置)、--(前置和后置),这4个操作符适用于任何值,规则如下:
在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量
在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN。字符串变量变成数值变量
在应用于布尔值false时,先将其转换为0再执行加减1的操作。布尔值变量变成数值变量
在应用于布尔值true时,先将其转换为1再执行加减1的操作。布尔值变量变成数值变量
在应用于浮点数值时,执行加减1的操作
在应用于对象时,先调用对象的valueOf()方法以取得一个可供操作的值。然后对改制应用前述规则。如果结果是NaN,则在调用toString()方法后再应用前述规则。对象变量变成数值变量。
2.一元加和减操作符
var s1 = "01";
var s2 = "1.1";
var s3 = "z";
var b = false;
var f = 1.1;
var o = {
valueOf: function(){
return -1;
}
};
s1 = -s1; // 值变成了数值-1
s2 = -s2; // 值变成了数值-1.1
s3 = -s3; // 值变成了NaN
b = -b; // 值变成了0
f = -f; // 变成了-1.1
o = -o; // 值变成了数值1
2.位操作符
按位非(NOT)
var num1 = 25;
var num2 = ~num1;
alert(num2);// -26
按位与(AND)
var result = 25 & 3;
alert(result);// 1
按位或(OR)
var result = 25 | 3;
alert(result);// 27
按位异或(XOR)
var result = 25 ^ 3;
alert(result);// 26
左移(左移不会影响操作数的符号)
var oldValue = 2;// 等于二进制的10
var newValue = oldValue << 5;// 等于二进制的1000000,十进制的62
有符号的右移
var oldValue = 64;// 等于二进制的1000000
var newValue = oldValue >> 5;// 等于二进制的10,即十进制的2
无符号的右移
var oldValue = 64;// 等于二进制的1000000
var newValue = oldValue >>> 5;// 等于二进制的10,即十进制的2
var oldValue = -64;// 等于二进制的11111111111111111111111111000000
var newValue = oldValue >>> 5;// 等于十进制的134217726
3.布尔操作符
1.逻辑非
操作规则:
如果操作数是一个对象,返回false
如果操作数是一个空字符串,返回true
如果操作数是一个非空字符串,返回false
如果操作数是数值0,返回true
如果操作数是任意非0数值(包括Infinity),返回false
如果操作数是null,返回true
如果操作数是NaN,返回true
如果操作数是undefined,返回true
两个!!类似于Boolean()函数,用于得到该值真正对应的布尔值
alert(!!"blue");// true
alert(!!0);// false
alert(!!NaN);// false
alert(!!"");// false
alert(!!12345);// true
2.逻辑与 (&&)
3.逻辑或 (||)
4.乘性操作符
1.乘法 (*)
2.除法 (/)
3.求模 (%)
5.加性操作符
1.加法 (+)
2.减法 (-)
6.关系操作符
大于 >
小于 <
小于等于 <=
大于等于 >=
7.相等操作符
全等(===) 不经转换直接比较
不全等(==) 换将操作数转换成同一种类型
由于相等和不想等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,推荐使用全等和不全等操作符
8.条件操作符
variable = boolean_expression ? true_value : false_value;
9.赋值操作符
简单赋值(=)
复合赋值操作符
乘 / 赋值(*=)
除 / 赋值(/=)
模 / 赋值(%=)
加 / 赋值(+=)
减 / 赋值(-=)
左移 / 赋值(<<=)
有符号右移 / 赋值(>>=)
无符号右移 / 赋值(>>>=)
10.逗号操作符
var num1 = 1, num2 = 2, num3 = 3;
var num = (5, 1, 4, 8, 0);// num的值为0
六.语句
1. if语句
if (conditon)statement1 else statement2
2. do-while语句
3.while语句
4.for语句
5.for-in语句
for (var propName in window){
}
6.label语句
使用labe语句可以在代码中添加标签,以便将来使用。以下是label语句的语法:
label : statement
示例:
start: for (var i = 0; i < couont; ++i){
}
7.break和continue语句
8.with语句
不推荐使用
9.switch语句(switch语句中可使用任何数据类型,而不仅仅是数值)
七.函数
1.基本语法:
function functionName(arg0, arg1, ,,, , argN){
statements
}
示例:
function sayHi(name, message){
alert("hello " + name + ",", + message);
}
注意:可在函数体的任何地方加入return语句,return语句后的所有语句将不在执行,若函数没有return语句,在函数停止执行后将放回undefined值
2.理解参数
javascript中的参数在内部是用一个数组表示的,因此传递参数时,javascript函数不在乎传入参数的数据类型和个数。在函数体内可通过arguments对象来访问这个参数数组。
argument对象只是与数组类似(并不是Array的实例),可用方括号访问每一个元素(arguments[0],arguments[1]),使用length属性来确定传递进来多少个参数。
arguments的值永远与它对应命名参数的值保持同步,但它们的内存空间是相互独立的
3.函数没有重载
function addSomeNumber(num){
return num + 100;
}
function addSomeNumber(num){
return num + 200;
}
var result = addSomNumber(100);// 300
后面定义的函数会覆盖之前定义的函数,可以通过检查传入参数的类型和数量做出不同的反映,模仿方法的重载
八.小结
javascript中的基本数据类型包括Undefined、Null、Boolean、Number和String
与其他语言不同,javascript没有为整数和浮点数值分别定义不同的数据类型,Number类型可以用于表示所有数值
javascript也有一种复杂的数据类型,即Object类型,该类型是这门语言中所有对象的基础类型
严格模式为这门语言中容易出错的地方施加了限制
javascript提供了很多与C及其他类C语言中相同的基本操作符,包括算术操作符、布尔操作符、关系操作符、相等操作符及赋值操作符等
javascript从其他语言中借鉴了很多流控制语句,例如If语句、for语句和switch语句等
javascript中的函数与其他语言中的函数有诸多不同之处
无须指定函数的返回值,因为任何javscript函数都可以在任何时候返回任何值
实际上,未指定返回值的函数返回的是一个特殊的undefined值
javascript中也没有函数签名的概念,因为其函数参数是一个包含零或多个值的数组的形式传递的
可以向javascript函数传递任意数量的参数,并且可以通过arguments对象来访问这些参数
由于不存在函数签名的特性,javascript函数不能重载