• 1. JavaScript 程序设计微知软件
  • 2. JavaScript概述JavaScript是一种轻型的、解释型的程序设计语言,而且具有面向对象的能力。 JavaScript是一种无类型的语言,它的变量不必具有一个明确的类型。
  • 3. JavaScript概述在句法构成上,JavaScript的核心语言和C#和Java相似。但相似之处也仅限于句法上的类同。 JavaScript的对象和C#和Java中的对象不同,更像是关联数组 JavaScript的继承机制和C#和Java的继承机制大相径庭。
  • 4. JavaScript的版本JavaScript最初由Netscape公司发布,后来Microsoft发布了JavaScript的相似版本,名为Jscript,另外ECMA标准化了JavaScript语言,取名ECMAScript。
  • 5. 词法结构 – 字符集字符集: 使用Unicode字符集编写 大小写敏感 注意:HTML不区分大小写,但JavaScript区分。
  • 6. 词法结构 – 特殊字符空白符: 空格、制表符、换行符 可选的分号: 分号主要是为了分隔语句,但JavaScript中如果语句放在不同的行中,就可以省略分号。 如: a = 3; b = 4; 中间的分号可以省略,但如果代码的格式如下,那么第一个分号是必须的: a = 3; b = 4;
  • 7. 词法结构 – 注释“//”注释一行 // 这是一条单行注释 “/*”和“*/”实现跨行注释 /* * 这是多行注释 */
  • 8. 词法结构 – 直接量所谓直接量,就是程序中直接显示出来的数据值。如: 12 // 数字12 1.2 // 数字1.2 “hello world” // 一个字符串 ‘Hi’ // 另一个字符串 true // 一个布尔值 /javascript/gi // 一个正则表达式 null // 一个对象不存在 { x: 1, y: 2 } // 一个对象 [1, 2, 3, 4, 5] // 一个数组
  • 9. 词法结构 – 标识符标识符用来命名变量和函数 第一个字符必须是字母、下划线(_)或美元符号($),接下来的字符可以是字母、数字、下划线或美元符号。如: i my_variable_name v13 _dummy $str
  • 10. 词法结构 – 保留字保留字是JavaScript语言的语法自身的一部分,它们在程序中是不能用作标识符的 保留字包括JavaScript的关键字和ECMA扩展保留的关键字 JavaScript的保留字应避免使用 另外,JavaScript预定义的全局变量名和全局函数名也应避免使用。
  • 11. 数据类型基本数据类型:数字、文本和布尔值 空数据类型:null(空)和undefined(未定义) 对象:已命名的值的无序集合(Object)和有编号的值的有序集合(Array) 函数 其他的专用对象:Date、RegExp等
  • 12. 数据类型 – 数字不区别整型数值和浮点型数值,所有的数字都由浮点型表示 数值直接量(数字直接出现在JavaScript程序中):整型直接量、八进制直接量、十六进制直接量和浮点型直接量 数字的使用:除了基本的算术运算,还可以通过Math计算。 特殊的数值常量:Infinity、NaN、Number.MAX_VALUE、Number.MIN_VALUE、Number.NaN、Number.POSITIVE_INFINITY、Number.NEGATIVE_INFINITY
  • 13. 数据类型 – 字符串由单引号或双引号(’或”)括起来的Unicode字符序列 没有char类型的数据 由反斜线和一个字符表示转义序列
  • 14. 数据类型 – 布尔值布尔值只有“true”和“false”两个值 有时可以把两个可能的布尔值看做是“on(true)”和“off(false)”,或者“yes(true)”和“no(false)”,或者“1(true)”和“0(false)”
  • 15. 数据类型 – 空值null表示无值 undefined表示未声明的对象,未赋值的对象或不存在的对象 null和undefined不同,但==运算符将两者看做相等
  • 16. 数据类型 – 函数请参考“函数”单元
  • 17. 数据类型 – 对象请参考“对象”单元
  • 18. 数据类型 – 数组请参考“数组”单元
  • 19. 变量 – 类型JavaScript是无类型的 在必要时JavaScript可以快速、自动地将一种类型的值转换成另一种类型
  • 20. 变量 – 声明使用关键字var声明变量:var i; 可以同时声明多个变量:var i,sum; 可以在声明时赋值:var i = 0; 声明的对象如果没有赋值,初始值是undefined 重复声明变量合法,不会造成任何错误 如果尝试读一个没有声明的对象的值,会生成一个错误 如果给未声明的变量赋值,JavaScript会隐式声明该变量,隐式声明的对象总被创建为全局变量
  • 21. 变量 – 作用域全局变量的作用域是全局性的 函数内部声明的变量是局部变量,只在函数内部有定义 函数的参数也是局部变量,只在函数内部有定义 可能出现几个作用域的嵌套层 没有块级作用域
  • 22. 变量 – 基本类型和引用类型数值、布尔值、null和undefined术语基本类型 对象、数组和函数属于引用类型 string是行为和基本类型相似的不可变引用类型
  • 23. 变量 – 无用存储单元的收集JavaScript不要求手动地去分配内存,它可以自动地分配和释放内存
  • 24. 表达式和C#或Java的表达式相似
  • 25. 运算符和C#或Java的运算符相似 大多数的运算符都是二元运算符,也存在大量的一元运算符(如“-”)和三元运算符(如“?:”) 各种运算符用来计算的运算数表达式要符合某种数据类型 运算符具有自己的优先级,参考备注 各种运算符具有各自的结合性,即当优先级相等时执行操作的顺序,参考备注
  • 26. 运算符 – 算术运算符加法运算符(+) 减法运算符(-) 乘法运算符(*) 除法运算符(/) 模运算符(%) 一元减运算符(-) 一元加运算符(+) 递增运算符(++) 递减运算符(--)
  • 27. 运算符 – 相等运算符==(相等)和===(等同)用来检测两个值是否相等,!=(不相等)和!==(不等同)用来检测两个值是否不相等 对于值类型,如果两个值具有相同的类型,且它们的值相同,则认为它们等同。 对于引用类型,只有当引用的是同一个对象的时候,才认为它们等同 如果两个值经过隐式转换成基本类型后相等,则认为它们相等
  • 28. 运算符 – 关系运算符比较运算符:<,>,<=,>=,比较运算符的运算数可以是任意类型的 in运算符:要求左边的运算数是一个字符串或可以转换为字符串,右边的运算数是一个对象或数组 instanceof运算符:要求左边的运算数是一个对象,右边的运算数是对象类的名字
  • 29. 运算符 – 逻辑运算符逻辑与运算符(&&):只有当左边的表达式返回true时,才计算右边的表达式 逻辑或运算符(||):只有当左边的表达式返回false时,才计算右边的表达式 逻辑非运算符(!):布尔值true转换成false,false转换成true,!!x可以将x转换成合和其相匹配的布尔值 null、0、undefined可以被转换成false 任何值在进行逻辑运算的时候都会转换成布尔值
  • 30. 运算符 – 位运算符位运算要求它的数字运算数是整型的 按位与运算符(&):只有两个运算数对应的位都是1,结果中的这一位才是1 按位或运算符(|):只要其中的一个运算数的位是1,结果中的这一位就是1 按位异或运算(^):只有两个运算数对应的位不全是1,结果中的这一位才是1 按位非运算(~):一元运算符,将运算数的所有位取反
  • 31. 运算符 – 位运算符左移运算符(<<):左移第一个运算数中的所有位,移动的位数由第二个运算数指定。舍弃移动后的数字的第32位,第1位补0 右左移运算符(>>):右移第一个运算数中的所有位,移动的位数由第二个运算数指定。舍弃右边移除的位,如果第一个数是正的,用0填补最高位,反之用1补充最高位 用0补足的右移运算符(>>>):和运算符>>一样,只是左边移入总是补0
  • 32. 运算符 – 赋值运算符赋值运算符(=):要求左边的运算数是一个变量,右边的运算数是一个任意的值,它将右边的值赋值给左边的变量,返回右边运算数的值 如果一个表达式中有多个赋值运算赋,将从右到左进行计算 带操作的赋值运算符:这些运算符将赋值运算符和其他运算符联合在一起,提供一些快捷的运算方式
  • 33. 运算符 – 其他运算符条件运算符(?:):三元的,第一个运算数必须是布尔值,第二个和第三个运算数可以是任何类型的。条件运算符的返回值由第一个运算数的值决定,如果它为true,则返回第二个运算数的值,反之返回第三个运算数的值 typeof运算符:放在一个运算数之前,这个运算数可以是任意类型的。返回一个字符串,这个字符串说明了运算数的类型。 数字、字符串和布尔值分别返回 ”number”、”string”和”boolean”,对象、数组和null返回”object”,函数返回的是”function”。 所有的对象和数组都返回”object”,要区别一种对象类别和另一种对象类别,请使用instanceof运算符
  • 34. 运算符 – 其他运算符对象创建运算符(new):语法为 new constructor(arguments),可以省略参数和括号,constructor也可以是表达式。 o = new Object; d = new Date(); c = new Data(1); obj = new constructors[i](); delete运算符:删除运算数指定的对象的属性、数组元素或变量。如果删除成功,则返回true,如果运算数不能被删除,则返回false void运算符:放在任意类型的操作类型的数之前,舍弃运算数的值,然后返回undefined
  • 35. 运算符 – 其他运算符逗号运算符(,):先计算左边的参数,再计算右边的参数,然后返回右边参数的值 数组和对象存取运算符:使用方括号([])存取数组的元素,点号(.)存取对象的元素。运算符“[]”也可以存取对象的属性 函数调用运算符(()):没有固定数目的运算数,第一个运算数是一个函数名或一个引用函数的表达式
  • 36. 语句 – if语句有两种形式: 1、if (expression) statement 2、if (expression) statement1 else statement2 Expression是要被计算的,如果计算的结果为true,或者可以转换成true,那么执行statement1,反之执行statement2 将if和else语句的主体用花括号括起来是一个良好的编程习惯,即使这个主体只有一条语句构成
  • 37. 语句 – switch语句允许在case语句后跟随任意的表达式 switch语句先计算switch关键字后面的语句,然后按照出现的顺序计算case后的表达式,直到找到与switch表达式的值相匹配的case表达式为止 匹配的case表达式是用===等同运算符判定的
  • 38. 语句 – while语句语法为:while (expression) statement while首先计算expression的值,如果为true,就执行statement,然后再计算expression的值
  • 39. 语句 – do/while语句语法为:do statement while (expression); 与while循环非常相似 它在循环底部检测循环表达式,而不是在顶部检测,故循环至少会执行一次 do循环是用分号结尾的
  • 40. 语句 – for语句语法为:for(initialize; test; increment) statement,等同于initialize; while(test){statement; increment;} initialize和increment中允许存在逗号表达式
  • 41. 语句 – for/in语句语法为:for (variable in object) statement for/in循环的主体对object的每个属性执行一次。在循环体执行之前,对象的一个属性名会被作为一个字符串赋值给变量variable variable可以是任意的表达式,只要它的值适用于赋值表达式的左边即可
  • 42. 语句 – 标签语句和switch语句联合使用的case标签和default标签只是普通标签的特例 标签语句的语法为:identifier:statement 通过给一个语句加标签,就可以给这个语句取一个名字,这样在程序的任何地方都可以使用这个名字来引用它
  • 43. 语句 – break语句语法为:break; 主要是用来退出循环和switch语句的,即只有在这几种语句中使用才是合法的 允许break后跟一个标签名:break labelname; 当break和标签一起使用时,它将跳到这个带有标签的语句的尾部
  • 44. 语句 – continue语句语法为:continue; 表示开始循环的一次新迭代 continue只能用在循环语句的循环体中 可以和标签一起使用
  • 45. 语句 – var语句var语句允许你声明一个或多个变量 语法为:var name_1 [ = value_1] [ , …, name_n [ = value_n]] var语句中如果没有为变量指定初始值,那么变量的值为undefined
  • 46. 语句 – function语句语法为: function funcname([arg1[…,argn] ]){ statements } 严格上说function语句并非一个语句,它只是定义一个函数,描述的是静态的程序结构,没有引发动态的行为
  • 47. 语句 – return语句语法为:return expression; 只能出现在函数体内 先计算expression,然后返回它的值作为函数的值 可以不带expression来终止程序的执行,并不返回值
  • 48. 语句 – throw语句语法为:throw expression; 抛出一个异常 expression的值可以是任何类型的,但通常是一个Error对象或Error子类的一个实例
  • 49. 语句 – try/catch/finally语句try/catch/finally是JavaScript的异常处理机制 机制同C#或Java
  • 50. 语句 – with语句语法为:with(object) statement with语句用于暂时修改作用域链,这一语句能够有效地将object添加到作用域链的头部,然后执行statement,再把作用域链恢复到原始状态
  • 51. 语句 – 空语句语法为:; 执行空语句显然不会产生任何作用,也不会执行任何动作
  • 52. 语句 – 小结参考备注
  • 53. 函数 – 定义和调用定义函数最常用的方法就是调用function语句 定义函数时可以使用个数可变的参数 函数可以有return语句,也可以没有return语句。如果函数不包含return语句,则在执行所有函数语句后返回undefined 如果一个函数已经被定义,那么久可以使用运算符()来调用它 JavaScript不会检测传递给函数的参数的类型,可以使用typeof检测参数的类型 如果传递的参数比函数需要的个数少,那么多余的几个参数就会被赋予undefined 如果传递的参数比函数需要的个数多,那么多余的值会被忽略掉
  • 54. 函数 – 定义和调用函数可以嵌套在其他函数中 可以使用下面的方式定义函数: var f = new Function(“x”, “y”, “return x * y;”); 其中,最后一个参数是函数的主体,其他参数都是用来说明函数要定义的形式参数名的字符串 另一种定义函数的方式就是使用函数直接量: var f = function(x){return x * x;}; 函数直接量创建的是未命名函数,但它的语法也规定它可以指定函数名,这在编写调用自身的递归函数时非常有用,如: var f = function fact(x){ if(x<=1) return 1; else return x * fact(x-1); };
  • 55. 函数 – 作为数据的函数函数不只是一种语法,还可以是数据,这意味着能够把函数赋给变量、存储在对象的属性中或者存储在数组的元素中、传递给函数,等等。如: function square(x){ return x * x; } var b = square; var c = b(5); 可以将函数赋值给对象的属性,这时候的函数被称为方法
  • 56. 函数 – Arguments对象在一个函数体内,标识符arguments具有特殊含义,它是调用对象的一个特殊属性,用来引用Arguments对象 Arguments对象就像数组,可以按照数字获取传递给函数的参数值 Arguments并非真正的Array对象 Arguments对象的callee属性引用当前正在执行的函数
  • 57. 函数 – 函数的属性属性length:表示函数要求的参数的个数 属性prototype:每一个函数都有一个prototype属性,引用的是预定义的原型对象原型对象在使用new运算符把函数作为构造函数时起作用,他在定义新的对象类型时起着非常重要的作用 可以给函数指定自定义的属性及方法
  • 58. 函数 – 函数的方法所有函数都定义了call()和apply()方法 使用这两个方法可以像调用其他对象的方法一样调用函数 call()和apply()的第一个参数都是要调用的函数的对象,在函数体内这一参数是this的值 call()的剩余参数是传递给要调用的函数的值:f.call(o, 1, 2); apply()方法和call()方法相似,只不过要传递给函数的参数是由数组指定的:f.apply(o, [1, 2]);
  • 59. 对象对象是一种符合数据类型,他们将多个数据值集中在一个单元中,而且允许使用名字来存取这些值 对象是一个无序的属性集合,每个属性都有自己的名字和值 存储在对象中的已命名的值既可以是数字和字符串这样的原始值,也可以是对象
  • 60. 对象 – 创建对象由运算符new创建,如: var o = new Object(); 也可以通过对象直接量创建并初始化新对象,如: var circle = { x:0, y:0, radius:2};
  • 61. 对象 – 属性的存取通常使用“.”运算符来存取对象的属性 可以通过属性名,用“[]”运算符从对象的数据集合中存取属性,如: var p = circle[‘radius’] 如果要读取一个不存在的属性的值,那么得到的值是undefined 可以通过delete来删除一个对象的属性,删除一个属性并不仅仅是把该属性设为undefined,而是真正从对象中移除了该属性
  • 62. 对象 – 方法方法是通过对象调用的JavaScript函数 在方法主体内部,关键字this的值一般是调用该方法的对象
  • 63. 对象 – 原型对象和继承原因是用构造函数把方法赋予它要初始化的对象,效率非常低 JavaScript对象都“继承”原型对象的属性。每个对象都有原型对象,原型对象的所有属性是以它为原型的对象的属性。也就是说,每个对象都继承原型对象的所有属性 属性并非从原型对象复制到新的对象,它们只不过看起来是那些对象的属性 属性值的读写是不对称的,即属性的继承只发生在读属性时,而在写属性时不会发生 所有的类都有原型对象,包括像String这样的内部类
  • 64. 面向对象的JavaScriptJavaScript虽然有对象的数据类型,但它并没有正式的类的概念 JavaScript采取的是以原型对象为基础的继承机制,而不是采用以类为基础的继承机制 JavaScript中的对象可以具有大量的属性,而且还可以动态地将属性添加到对象中
  • 65. 面向对象的JavaScriptJavaScript可以模拟C#等语言的类的成员:实例属性、实例方法、静态属性、静态方法,如: function Circle(radius){ this.r = radius; //实例属性 } Circle.PI =3.14159; //静态属性 Circle.prototype.area = function(){ return Circle.PI * this.r * this.r; }; //实例方法 Circle.max = function(a,b){ if(a.r>b.r) return a; else return b; }; //静态方法
  • 66. 对象 – constructor属性constructor属性引用对象的构造函数,如: var o = new Date(); o. constructor == Date; //值为true Date.prototype. constructor == Date; //值为true 由于构造函数定义了一个对象的类,所以属性在确定给定对象的类型时是一个非常强大的工具,如: if((typeof o ==‘object’) && (o.constructor ==Date)) //然后用Date对象做一个操作 并不能保证对象的constructor属性是一定存在的
  • 67. 对象 – toString()方法方法toString()没有任何参数 它返回的是一个字符串,该字符串代表了调用它的对象的类型和值 当JavaScript需要将一个对象转换成字符串时就调用这个对象的toString()方法 默认的toString()方法只提供类似“[object Object]”的信息,所以许多类定义了自己的toString()方法
  • 68. 对象 – valueof()方法方法valueof()和方法toString()方法相似 当JavaScript需要将一个对象转换成字符串之外的原始类型(通常是数字)时,就需要调用它 这个函数返回的是能代表关键字this所应用的对象的值的数据
  • 69. 数组数组是一种包含已编码的值的复合数据类型 每个数组的元素可以具有任意的数据类型,同一数组的不同元素可以具有不同的类型
  • 70. 数组 – 创建可以用构造函数Array()和运算符new创建数组,如: var a = new Array(); 也可以通过对象直接量创建并初始化新对象,如: var a = [‘a’, true, 4 ];
  • 71. 数组 – 存取可以通过[]来存取数组元素,如: vaule = a[0]; a[1] = 3.14; 数组的第一个元素的下标为0 数组的下标必须是大于等于0小于232-1的整数 要给一个数组添加一个新的元素,只需要给它赋一个值即可:a[10] = 10; 数组的下标是稀疏的,这意味着数组的下标不会落在一个连续的数字范围内,只有那些真正存储在数组中的元素才能够分配到内存
  • 72. 数组 – 数组的长度由于可能含有未定义的元素,所以属性length总是比数组的最大下标多1 和常规对象的属性不同,数组的length属性是自动更新的 数组的length既可以读也可以写。如果给length设置了一个比它的当前值小的值,那么数组将会被截断,长度之外的元素都会被抛弃,它们的值也就丢弃了。如果给length设置的值比当前大,那么新的未定义的元素会被添加到数组末尾以使得数组增长到新的长度 通过设置数组的length来截断数组是唯一的一种缩短数组的方法。如果使用delete运算符来删除数组中的元素,虽然那个元素被变成未定义的,但是数组的length属性并不会改变
  • 73. 数组 – 多维数组JavaScript并不支持真正的多维数组,但它允许使用元素为数组的数组,这就非常接近多维数组
  • 74. 数组 – 方法参考帮助文档
  • 75. 数据类型转换JavaScript对数据类型的灵活处理方式的一个重要的特性是自动类型转换。如果某个类型的值用于需要其他类型的环境中,JavaScript就自动将这个值转换成所需要的类型
  • 76. 数据类型转换值使用值的环境字符串数字布尔值对象未定义的值“undefined”NaNfalseErrornull“null”0falseError非空字符串As is字符串的数字值或NaNtrueString对象空字符串As is0falseString对象0“0”As isfalseNumber对象NaN“NaN”As isfalseNumber对象无穷大“Infinity”As istrueNumber对象负无穷大“-Infinity”As istrueNumber对象其他所有数字数字的字符串值As istrueNumber对象true“true”1As isBoolean对象false“false”0As isBoolean对象对象toString()valueof()或toString()或NaNtrueAs is
  • 77. 数据类型转换JavaScript会先尝试调用对象的valueof()对它进行转换,如果该方法返回了原始值(通常是一个数字),就使用那个值,否则将调用对象的toString()方法对它进行转换 valueof()严格地说把对象转换成合理的原始值,所以某些对象的方法返回的可能是字符串
  • 78. 数据类型转换要把一个值转换成字符串,可以把它连接到一个字符串上,如:var x_str = x + “” 要把一个值转换成数字,就用它减0,如:var x_number = x – 0; 要把一个值转换成布尔值,需要连用两次”!”运算符,如:var x_bool=!!x;
  • 79. 值和引用使用值使用引用复制实际复制的是值,存在两个不同的、独立的副本复制的知识对数值的引用。如果通过了这个心的值修改了数值,这个改变对原始的引用来说也可见传递传递给函数的是值的一个独立的副本,对它的改变在函数外部没有影响传递给函数的是对数值的一个引用。如果函数通过传递给它的引用修改了数值,这个改变在函数外部也可见比较比较的是两个独立的值(通常逐字节比较),以判断它们是否相同比较的是两个引用,以判断它们的值是否是同一个值。对两个不同的数值的引用不相等,即使这两个数值是由相同的字节构成
  • 80. 值和引用JavaScript中的数据类型操作类型复制所使用的传递所使用的比较所使用的数字值值值布尔值值值值字符串不可变的不可变的值对象引用引用引用
  • 81. Function构造函数和函数直接量构造函数Function()允许在运行时动态地创建和编译JavaScript代码。但函数直接量却是程序结构的一个静态部分 每次调用Function()时都会解析函数体并创建一个新的对象,函数直接量或出现在循环和函数中的嵌套函数不是在每次调用时都被重新编译,而且每当遇到一个函数直接量时也不创建一个新的函数对象 使用构造函数Function()创建的函数不使用词法作用域,它们总被当做顶级函数来编译
  • 82. 闭包闭包和作用域有关,它指的就是一个封闭的作用域(拥有外部变量、函数无法访问的变量和函数) 一般都是用一个匿名函数来做成闭包的:  (function(){   var myVariable=“private”;  })();  alert(myVariable); // undefined
  • 83. JavaScript库jQuery:javascript库中的新成员,提供css和xpath选择符查找元素,ajax,动画效果等 dojo:一个巨大的库,包括的东西很多,dijit和dojox是dojo的扩展,几乎你想要的各种javascript程序都包括了。 prototype:一个非常流行的库,使用了原型链向javascript中添加了很多不错的函数 YUI:yahoo!用户界面,非常实用,提供各种解决方案。 ExtJs :组件非常丰富,皮肤也很漂亮,动画效果也丰富。
  • 84. 平台和浏览器的兼容性最小公分母法:避开有兼容性问题的方法 防御性编码:try 特性检测:检测当前平台是否支持对应的方法 与平台有关的回避方法:判断浏览器的类别和支持的功能 通过服务器端的脚本达到兼容性的方法:同上 忽略问题: 适度停止运行:对于实在无法解决的问题,告知客户停止程序的使用