一、JavaScript简介
JavaScript从一个简单的输入验证器发展成为一门功能全面的编程语言,能够处理复杂的计算和交互,拥有了闭包、匿名(lamda, 拉姆达)函数,甚至元编程等特性。作为 Web 的一个重要组成部分,JavaScript的重要性是不言而喻的, 就连手机浏览器,甚至那些专为残障人士设计的浏览器等非常规浏览器都支持它。
JavaScript由三个部分组成:ECMAScript(JS规范)、DOM(文档对象模型)、BOM(浏览器对象模型)
ECMAScript:提供核心语言功能,所有浏览器对ES3大体都支持,对ES5的支持程度越来越高;
DOM::提供访问和操作网页内容的方法和接口,大部分浏览器几乎都支持DOM1级,2、3级的支持相差较大;
BOM:提供与浏览器交互的方法和接口,在HTML5之前没有统一的标准,每个浏览器有自己的实现标准;HTML5纳入BOM标准,有望朝着兼容性越来越高的方向发展;
二、在 HTML 中使用 JavaScript
1、<srcript>元素属性:
async :异步加载(可选)
charset :字符编码,但大部分浏览器会忽略它的值 (可选)
type:默认为 text/javascript (可选)
defer :文档完全被解析和显示之后再加载 (可选)
language:使用的脚本语言,但大部分浏览器会忽略这个属性 (已废弃)
src:表示包含要执行代码的外部文件,该属性可以实现跨域。 (可选)
<script type="text/javascript" src="http://www.somewhere.com/afile.js"></script>
2、延迟脚本 defer="defer"的<script>脚本不一定会按照出现的先后顺序执行,也不一定会在DOMContentLoaded触发前执行,因此最好只包含一个延迟脚本。
3、异步脚本async="async"的异步脚本一定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发之前或之后执行,支持异步脚本的浏览器有:Firefox3.6、safari5和Chrome。
4、<script></script>的位置
按照传统的做法,所有外部文件(包括 CSS文件和 JavaScript文件)的引用元素都放在页面的<head>元素中,在文档的<head>元素中包含所有 JavaScript文件,意味着必须等到全部 JavaScript代码都被下载、 解析和执行完成以后,才能开始呈现页面的内容(浏览器在遇到<body>标签时才开始呈现内容)。
对于 那些需要很多 JavaScript 代码的页面来说,这无疑会导致浏览器在呈现页面时出现明显的延迟,而延迟 期间的浏览器窗口中将是一片空白。为了避免这个问题,现代 Web 应用程序一般都把全部 JavaScript引 用放在<body>元素中页面内容的后面。
5、文档模式(DOCTYPE),分混杂模式(quirks mode)和标准模式(standards mode),IE5.5引入文档模式概念
混杂模式:让IE的行为与IE5相同
标准模式:让IE的行为更接近标准行为
这两种模式主要影响 CSS 内容的呈现,但在某些情况下也会影响到 JavaScript 的解释执行。
// 对于标准模式,可以通过使用下面任何一种文档类型来开启:
<!-- HTML 4.01 严格型 --> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!-- XHTML 1.0 严格型 --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- HTML 5 --> <!DOCTYPE html>
// 如果在文档开始处没有发现文档类型声明,则所有浏览器都会默认开启混杂模式。
6、<noscript>:
浏览器不支持js脚本或者js脚本被禁用时,显示<noscript>中的内容,浏览器支持且没被禁用js脚本时则不显示里面的内容。
三、基本概念
1、语法
- 区分大小写
- 标识符命名规则:
第一个字符必须是一个字母、下划线(_)或一个美元符号($);
其他字符可以是字母、下划线、美元符号或数字。 - 注释
// 单行注释
块级注释以一个斜杠和一个星号(/*)开头,以一个星号和一个斜杠(*/)结尾,如下所示:
/* * 这是一个多行 * (块级)注释 */
- 严格模式("use strict"; ):严格模式下,JavaScript 的执行结果会有很大不同,因此本书将会随时指出严格模式下的区别。支 持严格模式的浏览器包括 IE10+、Firefox 4+、Safari 5.1+、Opera 12+和 Chrome。
- 语句分号结尾
代码行结尾处没有分号有时会导致压缩错误;加分号在某些情况下会增进代码的性能,因为这样解析器就不必再花时间推测应该在哪个插入分号了。 - 保留字
ECMAScript 5中新增:let、yield、static
2、变量
定义变量时要使用 var 操作符(注意 var 是一个关键 字),后跟变量名(即一个标识符),如下所示: var message;
未经过初始化的 变量,会保存一个特殊的值——undefined
注意:用 var 操作符定义的变量将成为定义该变量的作用域中的局部变量。也就是说, 如果在函数中使用 var 定义一个变量,那么这个变量在函数退出后就会被销毁。如果省略 var 操作符,就是创建一个全局变量。
3、数据类型
ECMAScript中有 5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number 和String。还有1种复杂数据类型——Object,Object 本质上是由一组无序的名值对组成的。
- typeof操作符(检测给定变量的数据类型)---返回字符串
"undefined"——如果这个值未定义;
"boolean"——如果这个值是布尔值;
"string"——如果这个值是字符串;
"number"——如果这个值是数值;
"object"——如果这个值是对象或 null, 特殊值 null 被认为是一个空的对象引用;
"function"——如果这个值是函数。
var message = "some string"; alert(typeof message); // "string" alert(typeof(message)); // "string"
alert(typeof 95); // "number"
-
Undefined类型
没有初始化的变量,其值为undefined,typeof 未声明的变量:也会返回"undefined"。 -
Null
一个空对象指针,所以typeof null时会返回object,其值为null,可用于对象初始化或把对象置空。
null == undefined; // true
null === undefined; // false -
Boolean类型
其值为true和false,但true不一定为1,false也不一定为0;
Boolean true false
string 非空字符串 “”(空字符串)
Number 非0值 0和NaN
Object 非null对象 null
Undefined undefined
- Number
八进制:以0开头,数字从0~7,如果有哪位数字超过7,将忽略前面的0按照十进制处理:
var num = 08 //将会被解析为十进制8
八进制在严格模式(“use strict”)无效
十六进制:以0x开头
浮点数:可以写为 .1,但不推荐;1.0将被ECMAScript转换为整数1
科学计数法:用e表示,ECMAScript会将小数点后带有6个0以上的浮点数转换为以e表示 如:0.0000003 = 3e-7
注意:浮点型的最高精度为17,故0.1+0.2不等于0.3,而是 0.30000000000000004,所以不要判断 0.1+0.2 == 0.3,使用 IEEE754 格式表示的数值会有舍入误差。
-
NaN
非数值(Not a Number),表示本该返回数值的地方没有返回数值,因此,0做除数时也不会出错,而是返回NaN。
注意:
任何涉及到NaN的操作都返回NaN
NaN与任何都不相等,包括NaN本身
因为以上两点,ECMAScript定义了isNaN(a)函数,如果传入的a不能转换为数值,都将返回true
isNaN(NaN) true
isNaN("10") false(被转换为10)
isNaN("blue") true
isNaN(true) false(被转换为1)
注:当传入的a是对象时,会先调用对象的valueOf()方法,看该方法返回的数值是否可以转换为数值,如果不能,则基于这个返回值再调用toString(),再测试返回值。 -
String
字符串是由零或多个16位Unicode字符组成的字符序列,可用双引号("")或单引号('')表示。
- 字符串是不可变的
即字符串一旦创建,它们的值就不能改变。要改变 某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量, 例如:
var lang = "Java"; lang = lang + "Script";
2.转换为字符串
要把一个值转换为一个字符串有两种方式。第一种是使用几乎每个值都有的 toString()方法。这个方法唯一要做的就是返回相应值的字符串表现。
数值、布尔值、对象和字符串值(没错,每个字符串也都有一个 toString()方法,该方法返回字 符串的一个副本)都有 toString()方法。但 null 和 undefined 值没有这个方法。
可以传递一个参数:输出数值的基数。默认情况下,toString()方法以十进制格式返回数值的字符串表 示。而通过传递基数,toString()可以输出以二进制、八进制、十六进制,乃至其他任意有效进制格 式表示的字符串值。下面给出几个例子:
var age = 11; var ageAsString = age.toString(); // 字符串"11" var found = true; var foundAsString = found.toString(); // 字符串"true"
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"
在不知道要转换的值是不是 null 或 undefined 的情况下,还可以使用转型函数 String(),这个 函数能够将任何类型的值转换为字符串。
String()函数遵循下列转换规则:
如果值有 toString()方法,则调用该方法(没有参数)并返回相应的结果;
如果值是 null,则返回"null";
如果值是 undefined,则返回"undefined"。
- Object类型
ECMAScript 中的对象是一组数据和功能的集合,对象可通过执行 new 操作符后跟要创建的对象类型的名称来创建。如:
var o = new Object()
Object 的每个实例都具有下列属性和方法。
constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor) 就是 Object()。
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例 的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例 如:o.hasOwnProperty("name"))。
isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型
propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句来枚举。与 hasOwnProperty()方法一样,作为参数的属性名必须以字符 串形式指定。
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
toString():返回对象的字符串表示。
valueOf():返回对象的字符串、数值或布尔值表示。通常与 toString()方法的返回值 相同。
-
typeof操作符——用来检测给定变量的数据类型
对给定值使用typeof操作符可能返回下列字符串: -
"undefined"——该值未定义
-
"boolean"——该值为布尔值
-
"string"——该值是字符串
-
"number"——该值是数值
-
"object"——该值是对象或null
-
"function"——该值是函数
-
一元操作符:只能操作一个值的操作符
递增(++)和递减(--)操作符
前置操作符会先对值进行操作;后置操作符会先取值再进行操作:
var a = 1
var b = ++a +3 // 5
var c = 1
var d = c-- +3 // 4
-
布尔操作符
1、逻辑非(!)
由一个叹号(!)表示,逻辑非会先将操作数转换为一个布尔值,然后求反。
2、逻辑与(&&)
由两个和号(&&)组成,有两个操作数,当且仅当两个操作数均为 true 时返回 true。
3、逻辑或(||)
由两个竖线(||)表示,有两个操作数,当且仅当两个操作数均为 false 时返回 false。 -
关系操作符
小于(<)、大于(>)、小于等于(<=)和大于等于(>=)这几个关系操作符用于对两个值进行比 较,比较的规则与我们在数学课上所学的一样。这几个操作符都返回一个布尔值。
与 ECMAScript中的其他操作符一样,当关系操作符的操作数使用了非数值时,也要进行数据转换 或完成某些奇怪的操作。以下就是相应的规则。
如果两个操作数都是数值,则执行数值比较。
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
如果一个操作数是对象,则调用这个对象的 valueOf()方法,用得到的结果按照前面的规则执 行比较。如果对象没有 valueOf()方法,则调用 toString()方法,并用得到的结果根据前面 的规则执行比较。
如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较。 -
相等操作符
相等和不相等——先转换(通常称为强制转型)再比较,全等和不全等——仅比较而不转换。
4、语法
- if语句
if (i > 25) {
alert("Greater than 25.");
} else if (i < 0) {
alert("Less than 0.");
} else {
alert("Between 0 and 25, inclusive.");
}
- do-while语句
do-while 语句是一种后测试循环语句,即只有在循环体中的代码执行之后,才会测试出口条件。 换句话说,在对条件表达式求值之前,循环体内的代码至少会被执行一次。
var i = 0;
do {
i += 2;
} while (i < 10);
alert(i);
- while语句
while 语句属于前测试循环语句,也就是说,在循环体内的代码被执行之前,就会对出口条件求值。 因此,循环体内的代码有可能永远不会被执行。
var i = 0; while (i < 10) {
i += 2;
}
- for语句
for 语句也是一种前测试循环语句,但它具有在执行循环之前初始化变量和定义循环后要执行的代 码的能力。
var count = 10;
for (var i = 0; i < count; i++){
alert(i);
}
此外,for 语句中的初始化表达式、控制表达式和循环后表达式都是可选的。将这三个表达式全部 省略,就会创建一个无限循环,例如:
for (;;) {
// 无限循环
doSomething();
}
// 而只给出控制表达式实际上就把 for 循环转换成了 while 循环,
var count = 10;
var i = 0;
for (; i < count; ){
alert(i);
i++;
}
- for-in语句
for-in 语句是一种精准的迭代语句,可以用来枚举对象的属性。
for (var propName in window) {
document.write(propName);
}
但是,如果表示要迭代的对象的变量值为 null 或 undefined,for-in 语句会抛出错误。 ECMAScript 5更正了这一行为;对这种情况不再抛出错误,而只是不执行循环体。为了保证大限度的兼容性,建议在使用 for-in 循环之前,先检测确认该对象的值不是 null 或 undefined。
-
break和continue语句
break 和 continue 语句用于在循环中精确地控制代码的执行。其中,break 语句会立即退出循环, 强制继续执行循环后面的语句。而 continue 语句虽然也是立即退出循环,但退出循环后会从循环的顶 部继续执行。 -
switch语句
switch 语句与 if 语句的关系为密切,而且也是在其他语言中普遍使用的一种流控制语句。 ECMAScript中 switch 语句的语法与其他基于 C的语言非常接近,如下所示:
switch (expression) {
case value: statement
break;
case value: statement
break;
case value: statement
break;
case value: statement
break;
default: statement
}
5、函数
ECMAScript中的函数使用 function 关键字来声明,后跟一组参数以及函数体。
function functionName(arg0, arg1,...,argN) {
statements
}
严格模式对函数有一些限制:
不能把函数命名为 eval 或 arguments;
不能把参数命名为 eval 或 arguments;
不能出现两个命名参数同名的情况。
如果发生以上情况,就会导致语法错误,代码无法执行。
ECMAScript 函数不能像传统意义上那样实现重载。如果在 ECMAScript中定义了两个名字相同的函数,则该名字只属于后定义的函数。
网友评论