1、格式
JavaScript脚本位于<script>标签中,<script>标签可以置于<head>标签或者<body>标签中,甚至可以置于文档底部(这样不影响页面代码);JavaScript包含一般语句和函数。
2、输出方式(调试)
alert()方法可以弹出警告框、document.write()方法直接输出到页面、innerHTML写到HTML元素中、console窗口调试。
3、数据类型
字符串(String)、数字(Number)、布尔(Boolean)、数组(Array)、对象(Object)、空(Null)、未定义(Undifined)
JavaScript拥有动态类型,相同的变量可以用作不同的类型。
可以使用typeof操作符来检测变量的数据类型:
一般的数据类型有string、number、boolean、object;
数组是一种特殊的对象,所以typeof [1,2,3,4]返回的是object;
Null是空对象引用,所以用typeof检测Null返回的是object;
用typeof检测undefined返回的是undefined;
特别注意,Null和undefined的值是相等的,但是类型不同。
类型转换:
上述的数据类型都可以使用一定的方法转换为另外的数据类型。
4、语法
基本语法与java类似,其中的不同点有:
(1)变量声明使用var
例如:var a = 10;
特别注意,可以使用var声明声明过的变量名,变量的值取最近一次有赋值的声明的值。
例如:
var a = 10; var a; //此时a的值为10 var a = 10; var a = "ten"; //此时a的值为字符串"ten"
(2)对象表示方式:
var person = { name:"hex", age:23, home:"CQ", sing:function () { return "no voice"; } };
通常认为JavaScript中的对象是键值对的容器,与Java中的Map类似。
(3)对象的访问方式
访问属性:person.name; 或者person["name"];
访问方法:person.sing();
(4)函数声明方式:
function myFunction(a, b) { //do someting }
(5)命名习惯采用驼峰命名法,变量命名需以字母开头,或者$或者_开头,习惯性以字母开头。
5、作用域
与Java类似,函数内通过var声明的是局部变量,函数外通过var声明的是全局变量,函数内使用没有声明过的变量(严格模式use strict下不允许使用没有声明过的变量),该变量自动变成全局变量。函数运行结束后,局部变量被删除;页面关闭后,全局变量被删除。
6、HTML DOM事件
HTML DOM事件允许JavaScript根据不同的事件注册不同的处理程序,也即是规定当发生了某些事件时,程序可以做一些事情。
例如:
<button type="button" onclick="alert('just a test!')">测试</buttom>
当点击测试按钮时,页面会弹出警告框"just a test!"
类似的事件还有:鼠标事件、键盘事件、框架/对象事件、表单事件等。
7、正则表达式
(1)正则表达式的模式与java类似,使用格式为:/hello/i,其中//是固定格式,hello表示匹配的内容,i是修饰符,表示不区分大小写(还有其他修饰符);
(2)RegExp对象:RegExp对象是一个预定义的了属性和方法的正则表达式对象,可以声明一个RegExp对象,调用test()方法判断字符串中是否有匹配项,或者exec()方法查找字符串中的匹配项;
例:语句/he[abcl]l/i.test("hello,world!") 结果true
语句/he[abcl]l/i.test("hello,world!") 结果hell
注意:当字符串中有多个匹配项时,返回最先匹配到的子串
8、错误与调试
(1)try catch错误处理:语法与java语言类似,不同点在于throw抛出异常时,可以抛出一些自定义的异常,而这些异常可以是JavaScript的字符串、数字、逻辑值和对象。
(2)调试:大多数浏览器都内置了调试程序(console),F12可以打开console窗口;在script中添加debugger可以设置断点。
9、this关键字
this代表着函数运行时自动生成的一个内部对象,只能在函数内部使用。随着函数的使用场合的不同,this的值也会有所变化。但是,this始终指向调用函数的对象。
例子1:
function myFunction() { return this; } myFunction();
此时返回的是windows对象,此时函数的调用是全局的,所以事实上调用它的对 象就是windows。
例子2:
var person = { name:"hex", age:23, object:function () { return this; } }; person.object();
此时返回的是:Object {name: "hex", age: 23}。此时函数的调用者是person,所以返回值就是person对象。
10、计数器困境与函数的自我调用
我们在写计数器时,需要实现计数器的初始化和自增。我们希望的是初始化时只需要调用某一个方法,自增时也只需要调用某一个方法,而不采用直接修改变量的方式。那么,count变量应该声明为全局变量还是局部变量呢?声明为全局变量时,可以通过直接修改变量的方式改变计数器的值,声明为局部变量时,我们需要把count变量初始化和自增放在一个方法中,比如:
function myCounter(){ var count = 0; function add() { count++; } add(); }
但是,这样在myCounter函数外部就不能够调用add方法。函数的自我调用可以解决这个问题。采用函数的自我调用可以这样写:
var add = (function () { var counter = 0; return function () { counter++; } }) ();
这样,在需要计数时,我们调用add()就可以实现计数。事实上,add变量是一个counter的自增函数,这个函数可以使用counter变量。此时,function的声明是一个表达式,只会执行一次,所以counter初始化也只会执行一次。