1.1 Javascript诞生于1995年。它的主要目的是处理以前由服务器语言(如Perl)负责的一些输入验证操作。
1.2 Javascript虽然和ECMAScript通常都被人们用来表达相同的含义,但Javascript的含义却比ECMA-262中规定的要多得多。一个完整的Javascript实现应该由下列三个不同的部分组成。——核心(ECMAScript)+文档对象模型(DOM)+浏览器对象模型(BOM)
总结:Javascript是一种专为与网页交互而设计的脚本语言。
2.1 <script>元素——向HTML页面中插入Javascript的主要方法,就是使用<script>元素。它有下列4个常用属性。
async:可选。表示应该立即下载脚本,但不应该妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本。只对外部脚本文件有效。
defer: 可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。只对外部脚本文件有效。
scr: 可选。表示包含要执行代码的外部文件。
type: 可选。不填的话默认值也是text/javascript。
async和defer使用方法:
<script type="text/javascript" src="js/1.js" defer></script>
<script type="text/javascript" src="js/1.js" async></script>
相同点:
1.都只适用于外部脚本
2.如果定义了load事件,会在load事件之前执行 //load事件会在网页所有内容加载完成才会执行
不同点:
1.defer属于延迟加载,而async属于异步加载
2.defer会等文档解析完成之后再执行js
3.async下载完毕立即解释执行代码
4.defer所有浏览器都支持,async是HTML5定义的新属性,需要IE10以上版本
5.多个声明了async的脚本不保证执行顺序,如果项目中脚本之间存在依赖关系,不推荐使用async
2.1.1 按照传统做法,所有<script>元素都应该放在页面的<head>元素中,意味着所有的Javascript都解析和执行完成之后才能显示页面内容,为了加载速度建议放在</body>元素前即可。
2.2 在HTML中嵌入Javascript代码虽然没有问题,但一般认为最好的方法还是使用外部文件来包含Javascript。它有以下优点。
1.可维护性——遍及不同HTML页面中的代码维护很麻烦,把他们都放在一个文件夹方便维护。而且开发人员可以在不触及HTML标记的情况下,集中精力编辑Javascript代码。
2.可缓存——浏览器能够根据具体的设置缓存链接的所有外部Javascript文件。也就是说多个页面使用同一个文件只需要下载一次,可以加快页面加载速度。
3.适应未来——通过外部文件来包含Javascript无须兼容xhtml或注释hack。 //xhtml下编码要求比较严格 如a>5需写成a>5;或者禁用js的页面不会出现错误。
2.3 文档模式(doctype)不声明的的情况下网页以混杂模式运行,声明之后网页将以标准模式运行。混杂模式不推荐使用
如<!-- HTML 5 -->
<!DOCTYPE html>
3 语法
3.1 ECMAscript中的一切都区分大小写(变量、函数名和解析名),变量 test 和变量 Test 是两个不同的变量。
3.2 标识符指变量、函数、属性的名字,或者函数的参数。标识符的第一个字符必须是一个字母、下划线(_)或一个美元符号($),其他字符可以是字母、下划线、美元符号或数字。按照惯例标识符的第一个字母小写,剩下的每个单词的首字母大写 如:firstSecond。
3.3 注释
// 单行注释
/* 多行注释 */
3.4 严格模式 在严格模式下,ECMAScript3中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误。要在整个脚本中启用严格模式,可以在顶部添加以下代码: "use strict";
可以指定某个函数在严格模式下执行:
function doSomeThing (){
"use strict";
//函数体
}
3.5 建议每个ECMAScript中的语句以一个分号结尾; var diff=a-b;
3.6 关键字和保留字
ECMA-262 描述了一组具有特定用途的关键字。这些关键字可用于表示控制语句的开始或结束,或者用于执行特定操作等。按照规则,关键字也是语言保留的,不能用作标识符。以下就是ECMAScript的全部关键字(带*号上标的是第5 版新增的关键字):
break | do | instanceof | typeof |
case | else | new | var |
catch | finally | return | void |
continue | for | switch | while |
debugger* | function | this | with |
default | if | throw | delete |
in | try |
ECMA-262 还描述了另外一组不能用作标识符的保留字。尽管保留字在这门语言中还没有任何特定的用途。但它们有可能在将来被用作关键字。以下是ECMA-262 第3 版定义的全部保留字:
abstract | enum | int | short |
boolean | export | interface | static |
byte | extends | long | super |
char | final | native | synchronized |
class | float | package | throws |
const | goto | private | transient |
debugger | implements | protected | volatile |
double | import | public |
第5 版把在非严格模式下运行时的保留字缩减为下列这些:
class | enum | extends | super |
const | export | import |
在严格模式下,第5 版还对以下保留字施加了限制:
implements | package | public | interface |
private | static | let | protected |
yield |
注意, let 和yield 是第5 版新增的保留字;其他保留字都是第3 版定义的。为了最大程度地保证兼容性,建议大家将第3 版定义的保留字外加let 和yield 作为编程时的参考。
3.7变量
ECMAScript的变量是松散类型的,就是可以保存任何类型的数据。
var message; //这行代码定义了一个名为message的变量,该变量可以用来保存任何值(这样没有经过初始化的变量,会保存一个特殊的值——undefined)
var message="hi"; //这行代码变量message保存了一个字符串值"hi"
var message="hi";
message=100; //有效,但不推荐 变量message先保存了一个字符串值"hi",然后该值又被一个数字值100取代。
function test() {
var message="hi"; //局部变量
}
test();
alert(message); //错误! 局部变量在函数退出后就会被销毁
function test() {
message="hi"; //全局变量
}
test();
alert(message); /hi 省略var操作符可以定义全局变量,但是不推荐这种做法,全局变量定义在局部作用域里很难维护
调用过一次test() 函数,这个变量有了定义,就可以在函数外部的任何地方被访问到。
var message="hi",
found = false,
age = 29; //可以一次性定义多个变量,每个变量用逗号分隔开
3.8 数据类型
ECMAScript有5基本数据类型:Undefined、Null、String、Number、Boolean还有1种复杂数据类型——Object,Object本质上是由一组无序的名值队组成的。
3.9 typeof操作符——用来监测给定变量的数据类型
- “boolean":如果变量是布尔值
- "function":如果变量是函数
- "number”:如果变量是数值
- “object":如果变量是对象或null
- "string”:如果变量是字符串
- "undefined":如果 变量未定义
var arr1=[1,2,3,4];
alert(typeof message); //string
alert(typeof 90); //number
alert(typeof arr1); //object typeof null 返回的值也是object
alert(typeof true) //boolean
alert(typeof window) //function
alert(typeof sss) //undefined sss未声明
3.10 Undefined类型
undefined类型只有一个值,即特殊的undefined。在使用var声明变量打未赋值时这个变量的值就是undefined,
如:var message; alert(message==undefined); //true
不过,包含undefined值的变量与尚未定义的变量还是不一样的。
如:var message;
alert(message); //undefined
alert(age); //报错
typeof运算符检测数据类型时候会出现一个问题
var message;
alert(typeof message); //undefined
alert(typeof age); //undefined 此处是语言设计者的问题
3.11 Null类型
Null类型是第二个只有一个值的数据类型,这个特殊的值是Null。 从逻辑角度看,null值表示一个空对象指针,所以typeof操作符检测null值时会返回"object"。
如果定义的变量准备在将来保存对象,那么最好将该变量初始化为null,这个月只需要检查null值就可以知道相应的变量是否已经保存为一个对象的引用。
如:if(car != null){
//对car对象进行操作
}
undefined值派生自null值,所以alert(undefined==null); //true
3.12 Boolean类型
Boolean类型是ECMAScript中使用最多的一种类型,该类型只有两个字面值:true和false。这两个值和数字值不是一回事,因此true不一定等于1,false也不一定等于0。下面是为变量赋Boolean类型值的例子。
如:var found=true;
var lost=false;
boolean类型的字面值true和false是区分大小写的。True和False都不是Boolean值,只是标识符。
数据类型 转换为True的值 转换为False的值
Boolean True False
string 任何非空字符串 "" 空字符串
Number 任何非零数字(包括无穷大) 0和NaN
Object 任何对象 null
Undefined 不适用 undefined
这些转换规则对理解流控制语句(如if语句)自动执行相应的Boolean转换非常重要。
如: var message="Helllo World";
if(message){
alert("value is true");
}