前言:
程序设计语言主要分为两种 1、基于存储原理(冯*诺依曼体系)的命令式编程语言,如C/C++、Java、Object Pascal(DELPHI)。
2、根据阿隆左*丘琦的lambda演算而产生的函数式编程语言,如Lisp、Scheme。
这两种语言互不干涉的时代(javascript出现以前),程序=数据结构+算法
Javascript被称为具有C的语法的Lisp,完美结合了这两个体系(C的语法,Lisp的内核)。
本书分为两部分 1、Javascript语言的核心概念:javascript的对象、函数、数组、闭包
2、Javascript支持的编程范式:javascript引擎、javascript在java、C、C++等应用中的使用,服务器端的javascript应用。
第一章 概述
1.1 javascript简史
Mocha(1996) -- LiveScript -- JavaScript -- ECMAScript
JSP、ASP可以为页面提供动态内容,但是如果没有javascript则无法在服务器返回之后动态地在前端修改页面,也没有页面特效。
1.2 javascript语言特性
动态的、弱类型、基于原型的脚本语言。
彻底的“一切皆对象” :即使作为代码本身载体的函数(function)也是对象,数据与代码的界限相当模糊。
1.2.1 动态性:
1.为一个属性赋值,不必事先创建一个字段,只要在使用时直接赋值
1 var obj = new object();//定义一个对象 2 obj.name= "an object";//动态创建属性name 3 obj.sayHi = function(){return "Hi";};//动态创建属性sayHi 4 5 delete obj.name;//删除对象的属性
在静态语言中,需要预先定义好对象的属性以及属性自身的类型。定义完成后,对象的结构就定下来了,之后都保持这种结构无法更改。通常对象会继承一些自己用不到的方法,并且无法删除。
2.动态地访问一个javascript对象的属性
1 var key = "property"; 2 print(key); 3 4 var obj = {property:"myproperty"} 5 print(obj[key]);
这个特性可以使得代码更加简洁清晰,比如可以动态地从代码中生成对象的属性名,然后去除属性值等。
1.2.2 弱类型:数据类型无需在声明时指定,解释器会根据上下文对变量进行实例化。
在javascript中,类型是和值关联的,而不是和变量关联。弱类型具有很大的灵活性,在定义变量时无需显示声明。
弱类型也有其不利的一面,例如开发面向对象javascript时,没有类型的判断,但是可以通过其他途径解决。
1.2.3 面向对象:在javascript中一切都是对象,甚至用以表发逻辑的函数/代码本身也是对象,比如代码本身可以作为参数传递给其他代码
1 var array = [1,2,3,4,5]; 2 array.map(function(item){return item*2}); 3 4 var staff = [{name:‘lilei‘,age:25},{name:‘hanmeimei‘,age:24},{name:‘hobo‘,age:25}]; 5 staff.map(function(item){return item.name.toUpperCase}); 6 staff.filter(function(){returen item.age>24});
1.2.4 解释与编译:浏览器中,javascript是解释型语言
Rhino(java版的javascript解释器)中,javascript编译型(可以被编译为java字节码)
Google V8引擎中,直接将javascript代码编译为本地代码,无需解释。
解释型 优:可以随时修改代码,无需编译,刷新页面即可重新解释
劣:由于每一次都需要解释,程序开销大。
编译型 优:仅需要编译一次,每次都运行编译过的代码即可
劣:丧失动态性
1.3 javascript应用范围
现在的javascript大多数运行于客户端。
部分运行于服务器端,如servlet、asp等
作为独立语言运行于其他应用程序中,如Rhino(java),SpiderMonkey(C)
1.3.1 客户端javascript
随着Ajax的复兴,客户端的javascript得到了很大的发展,出现大量javascript库,如JQuery、ExtJS、Backbone.js、Mootools等。
1.3.2 服务器端javascript
Node.js,Helma,Apache Sling等。
Jaxer的例子:
1 <script> 2 jQuery(function(){ 3 $("form").submit(function(){ 4 save($("textarea").val()); 5 return false; 6 }); 7 }); 8 </script> 9 <script runat="server"> 10 function save(text) 11 { 12 Jaxer.File.write("temp.txt",text); 13 } 14 save.proxy = true; 15 16 function load() 17 { 18 $("textarea").val( 19 Jaxer.File.exists("tmp.txt") ? Jaxer.File.read("tmp.txt") : "" 20 ); 21 } 22 </script> 23 <script> 24 var rs = Jaxer.DB.execute("SELECT * FROM table"); 25 var field = rs.rows[0].field; 26 </script>
node.js的例子:node.js运行实现了javascript的模块规范ComminJS,使得大规模javascript开发成为可能,一个模块可以使用其他任何模块,或者将自己需要公开的函数导出,提供给别的模块使用。
<script> var sys = require(‘sys‘); http = require(‘http‘); http.createServer(function(){ setTimeout(function(){ res.sendHeader(200,{‘Content-Type‘:‘text/plain‘}); res.sendBody(‘Hello World‘); res.finish(); },2000) } ).listen(8000); sys.puts(‘Server running at http://127.0.0.1:8000/‘); </script> <script> var tcp = require(‘tcp‘); var server = tcp.createServer(function(socket){ socket.setEncoding("utf8"); socket.addListener("connect",function(){ socket.send("hello\r\n"); }); socket.addListener("receive",function(data){ socket.send(data); }); socket.addListener("eof",function(){ socket.send("goodbye\r\n"); socket.close(); }); }); </script>
第二章 基本概念
2.1 数据类型
javascript中数据类型分为 1、基本数据类型:在必要时会隐式转换为对象
2、对象类型:对象、数组、函数
2.1.1 数据类型:string、number、boolean、undefined、null、object(6种)
2.1.2 对象类型:这里提到的对象不是对象本身,而是指一种类型。
包括对象(属性的集合,即键值的散列表)、数组(有序的列表)、函数(包含可执行的代码)。
对象类型是一种复合的数据类型,其基本元素由基本数据类型组成,但不嫌友基本类型,比如对象类型中的值可以使其他的对象类型实例。
2.1.3 基本类型与对象间的转换
基本类型转换为对象:
基本数据类型在做一些运算时,会临时包装一个对象,做完运算后,又自动释放该对象。
对象转换为基本类型:
通过调用对象的valueOf()方法来取得对象的值,如果和上下文的类型匹配,则使用该值。如果valueOf()取不到值的话,则需要调用对象的toString()方法,而如果上下文为数值型,则又需要将此字符串转换为数值。valueOf()的优先级要高于toString()。
事实上这种转换规则会导致很多问题,比如所有非空对象在布尔值环境下都会被转换为true
if(datamodel.item){...}else{...}
datamodel.item在转换为布尔值的同时判断是否为空,简化了if(datamodel.item != null)的写法
2.1.4 类型的判断
例子:当函数的参数为函数时需要判断这个参数的类型,使用typeof操作符和instanceof操作符结合判断
1 function handleMessage(message,handle) 2 { 3 return handle(message); 4 } 5 6 //在调用前判断handle是否是function 7 function handleMessage(message,handle) 8 { 9 if(typeof handle == "function") 10 {return handle(message);} 11 else 12 {throw new Error("the 2nd argument should be a function");} 13 }
当typeof相同时:
1 var obj = {}; 2 var array = ["one","two","three"]; 3 4 print(typeof obj);//object 5 print(typeof array);//object 6 7 print(obj instanceof Array);//false 8 print(array instanceof Array);//true
2.2 变量
变量是对值的存储空间的引用,通过一个名字将一个值关联起来,以后通过变量就可以引用到该值。
2.2.1 基本类型和引用类型
基本类型在内存中有固定的大小。
引用类型原则上无大小限制,我们通过对其访问