首页 > 代码库 > 《JavaScript核心概念及实践》-- 读书笔记

《JavaScript核心概念及实践》-- 读书笔记

前言:

    程序设计语言主要分为两种  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";//动态创建属性name3 obj.sayHi = function(){return "Hi";};//动态创建属性sayHi4 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     else12     {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);//object5 print(typeof array);//object6 7 print(obj instanceof Array);//false8 print(array instanceof Array);//true

 

 

2.2 变量

    变量是对值的存储空间的引用,通过一个名字将一个值关联起来,以后通过变量就可以引用到该值。

 

2.2.1 基本类型和引用类型

    基本类型在内存中有固定的大小。

    引用类型原则上无大小限制,我们通过对其访问

  

《JavaScript核心概念及实践》-- 读书笔记