文档章节

【读书笔记】《Javascript语言精粹》

岑小白
 岑小白
发布于 2012/09/18 14:13
字数 2058
阅读 34
收藏 0

第二章 语法

通过检测 object.hasOwnProperty(variable)来确定属性名就是改对象的成员,还是从其原型链里找到的。

for (myvar in obj){
    if (obj.hasOwnProperty(myvar)){
        ...
    }
}

第三章 对象

对象属性值初始化和检索
检索一个并不存在的成员元素的值,将返回一个undefined
可以使用 || 运算符填充默认值,如 var middle = stooge[“middle-name”] || “(none)”;
可以用 && 运算符来避免检索一个undefined值导致的TypeError异常,如 flight.equipment && flight.equipment.model

对象通过引用来传递,永远不会被拷贝:

var x = stooge;
x.nickname = 'Curly';
var nick = stooge.nickname;
//因为x和stooge是指向同一个对象的引用,所以 nick 为 'Curly'

var a = {},b = {},c = {};
// 三者都引用一个不同的空对象
a = b = c = {};
//三者引用同一个控对象

使用原对象作为其原型的新对象

if (typeof Object.beget !== 'function') {
   Object.beget = function (o){
        var F = function (){};
        F.prototype = o;
        return new F();
   };
}
var another_stooge = Object.beget(stooge);

原型连接在更新时是不起作用的。当我们对某个对象作出改变时,不会触及到该对象的原型。

委托
原型连接只有在检索值的时候才被用到。如果我们尝试去获取对象的某个属性值,且该对象没有次属性命,那么Javascript会试着从原型对象中获取属性值。如果那个原型对象也没有该属性,那么再从它的原型中寻找,一次类推,直到该多承最后到达终点Object.prototype。如果想要的属性完全不存在于原型链中,那么结果就是undefined值。

枚举 

for (name in another_stooge){
    ......
}

删除对象的属性 

another_stooge.nickname;          //"moe"
delete another_stooge.nickname;
//删除another_stooge的nickname属性,从而暴露出原型的nickname属性
another_stooge.nickname;          //"curly" (原型的该属性值)

减少全局变量污染:可以创建唯一一个全局变量,var MYAPP = {};将该变量作为容器,往其中添加属性值。

第四章 函数

调用
在Javascript 中一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式、apply调用模式。
每个函数在接收参数时,会接受两个附加的参数:this 和 arguments 。this 取决于上述不同的调用模式。

方法调用模式
当一个函数被保存为对象的一个属性时,成为方法。当一个方法被调用时,this被绑定倒该对象。如果一个调用表达式包含一个属性存取表达式,那么它被当作一个方法来调用。

var muObject = {
   value : 0,
   increment : function (inc) {
       this.value += typeof inc === "number" ? inc : 1;
   }
};

myObject.increment();
document.writeIn(myObject.value);  // 1

myObject.increment(2);
document.writeIn(myObject.value);  // 3

方法可以使用this去访问对象,所以它能从对象中取值或修改该对象。this 倒对象的绑定发生在调用的时候。这个 超级 迟绑定(very late binding)使得函数可以对this 高度复用。通过this可取得它们所属对象的上下文的方法成为 [公共方法]

函数调用模式
当一个函数并非一个对象的属性时,那么它被当作一个函数来调用:var sum = add(3,4); //sum 值为7
当函数以此模式调用时,this被绑定到全局对象。因此,内部函数的this时无法共享该方法对对象的访问权。解决方案:如果该方法定义一个变量并给它赋值为this,那么内部函数就可也i通过那个变量访问到this。如下所示:

myObject.double = function(){
   var that = this;               // 此处this指向的是myObject对象       var helper = function(){       // helper中的this指向的是 window,无法获取value
       that.value = add(that.value,that.value);  // 改变myObject对象的value属性值
       alert(this);               // [object window]   }
   helper();
}

myObject.double();
document.writeIn(myObject.getValue());     // 6

构造器调用模式
Javascript是基于原型继承的语言。对象可以直接从其他对象继承属性。

如果在一个函数前面带上new 来调用,那么将创建一个隐藏连接到该函数的 prototype 成员的新对象,同时this 将会被绑定到那个新对象上。new 前缀也会改变return 语句的行为。

//创建一个名为Quo 的构造器函数。它构造一个带有 status 属性的对象。
var Quo = function (string) {
   this.status = string;
};
//给Quo 的所有实例提供一个名为get_status 的公共方法。
Quo.prototype.get_status = function () {
   return this.status;
}
//构造一个 Quo 实例
var myQuo = new Quo("confused");
document.writeIn(myQuo.get_status());

其目的就是结合new前缀调用的函数,被成为构造器函数。必须以首字母大写格式来命名构造器函数,调用构造器函数时必须在前面加上new 。

Apply调用模式 
apply 方法让我们构建一个参数数组并用其去调用函数。它允许我们选择this 的值。apply 方法接收两个参数。第一个是将被绑定给this 的值。第二个就是一个参数数组。

var array = [3,4];
var sum = add.apply(null,array);  // sum=7

var statusObject = {
    status : 'A-OK'
};

//statusObject 并没有继承Quo.prototype ,但仍可以在 statusObject 上调用 get_status 方法,尽管statusObject本身并没有这个方法。
var status = Quo.prototype.get_status.apply(statusObject); //值为 'A-OK'

参数
当函数被调用时,会得到一个参数数组 arguments。通过它,函数可以访问所有它被调用时传递给它的参数列表,包括那些没有分配给函数声明时定义的形式参数的多余参数。但这个数组,只有一个length属性,它缺少所有的数组的方法。

返回
如果没有返回值,则返回 undefined 。如果函数以在前面加上new 前缀的方式来调用,且返回值不是一个对象,则返回 this (该新对象)。

异常throw、try、catch:

try语句执行一个代码块,并捕获改代码快抛出的任何一场。catch从句定义了一个新的变量,它将接受该异常对象。

throw 语句抛出一个异常。如果throw语句在一个try代码块重,那么控制权会跳到catch从句中。如果throw语句在函数中,则该函数调用被放弃,且控制权会跳到调用该函数的try语句的catch从句中。

var add = function (a,b){
	if (typeof a !== 'number' || typeof b !== 'number'){
		throw {
			"name" : "TypeError",
			"message" : "add needs numbers"	
		};	
	}
	return a + b;
}
var try_it = function (){
	try {
		add("seven");	
	}	catch (e){
		alert(e.name + " : " + e.message);	
	}
}
try_it();

给类型增加方法

Function.prototype.method = function(name,func){
	this.prototype[name] = func;
	return this;	
};

函数递归调用方法,实例:汉诺塔

回调

//朴素写法

request = prepare_the_request();

response = send_request_synchronously(request);

display(response);

//回调写法

request = prepare_the_request();

send_request_synchronously(request,function (response){

		display(response);

});

函数模块

函数套用

函数记忆

for (var i = 0; i <= 10;i ++){
	alert(" i ( " + i " ) : " + fibonacci(i));
}

//普通写法,被调用29次,自己调用了11次,它自身调用了18次

var fibonacci = function(){
	var memo = [0,1];
	var fib =  function (n){
		if (typeof result !== "number"){
			result = fundamental(shell,n);
			memo[n] = result;	
		}
		return result;	
	}	
	return fib;
}

//回调写法

var memoizer = function (memon,fundamental){
	var shell = function (n){
		var result = memo [n];
		if (typeof result !== "number"){
			result = fundamental(shell,n);
			memo[n] = result;	
		}
		return result;
	};	
	return shell;
}

var fibonacci = memoizer([0,1],function(shell,n){
	return shell(n-1) + shell(n-2);
});

第五章 继承 

伪类

第六章 数组 

数组:Javascript 提供了一种拥有类数组(array-like)特性的对象。它把数组的下表编程字符串,用其作为属性。明显地比一个真正的数组慢但它可以更方便地使用。属性的检索和更新的方式与对象几乎一样,除了有一个可以用整数作为属性名的特性外。

基本操作:

var numbers1 = [];
var numbers2 = ["a","b","c","d"];
var numbers3 = [4,5,78748,6456,"dafd"];

numbers3.length;

numbers3.length = 50;   // 直接通过修改数组长度,重新给数组分配空间

numbers1.push("go");    // 向数组末位添加一个元素

delete numbers2[2;];  // 这样删除之后,被删元素后面的数组元素不会改变下标,会在数组中遗留一个空洞

numbers2.splice(2,1);
// 从数组中下标为2的元素开始,删除 1 个元素。对于大型数组,效率不高。

 第七章 正则表达式 

正则表达式是一门简单语言的语法规范。以方法的形式被用于对字符串中的信息进行查找、替换和提取操作。常用的方法有:regexp.exec、regexp.test 、string.match 、string.replace 、string.search 、string.split。

 

 

© 著作权归作者所有

共有 人打赏支持
岑小白

岑小白

粉丝 133
博文 187
码字总数 300648
作品 0
杭州
其他
私信 提问
加载中

评论(1)

岑小白
岑小白
[函数]:包含一组语句,它们是javascript的基础模块单元,用于代码复用、信息隐藏和组合调用。函数用于制定对象的行为。一般来说,所谓编程是将一组需求分解成一组函数与数据结构的技能。
JavaScript语言精粹学习笔记(一)

《JavaScript语言精粹》相比《JavaScript权威指南》而言,是一本太薄的书了。然而也许正因为小而精,所以难有权威指南那样阅读起来浅显易懂却又醍醐灌顶般的感觉,语言精粹还是略微感觉有些艰...

小微
2012/12/27
0
0
如何轻松快速学习JavaScript 呢?

JS给人那种感觉的原因多半是因为它如下的特点: 1:本身知识很抽象、晦涩难懂,如:闭包、内置对象、DOM。 2:本身内容很多,如函数库,对象库就一大堆。 3:混合多种编程思想。 4:辛苦学习...

课工场CC老师
2017/11/04
0
0
javascript——从「最被误解的语言」到「最流行的语言」

JavaScript曾是“世界上最被误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax的到来,JavaScript“从最受误解的编程语言演变为最流行的语言”,这除了幸运之外,...

modernizr
2014/05/20
1K
12
9 行 javascript 代码获取 QQ 群成员

昨天看到一条微博:「22 行 JavaScript 代码实现 QQ 群成员提取器」。 本着好奇心点击进去,发现没有达到效果,一是 QQ 版本升级了,二是博客里面的代码也有些繁琐。 于是自己试着写了一个,...

justjavac
2013/10/18
845
5
JavaScript继承(四)——原型式继承

道格拉斯·克罗克福特在2006年提出了原型式继承,他的想法是基于已有的对象借助原型创建新对象,同时还不必因此创建一个自定义类型。为此,他给出了下面的函数: 在函数内部,先创建了一个临...

Bob2100
02/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Httpd 整合 Tomcat 步骤

环境:Tomcat8 + Httpd2.4 工作原理:借助于Tomcat的AJP连接器实现Apache与Tomcat的通信 配置步骤: 1. 配置httpd.conf 新增: Include conf/extra/mod_jk.conf 修改:添加 index.jsp <IfM...

ZeroneLove
昨天
1
0
Docker笔记3——容器命令(未写完,明天整理接着写)

未写完,明天整理接着写 新建并启动容器 docker run docker run [OPTIONS] IMAGE [COMMEND] [ARG...] OPTIONS: --name=[容器新名字] :为容器指定一个名称 -d:后台运行容器,并返回容器ID,...

HappyBKs
昨天
1
0
2018个人年终总结

感谢领导的信任和指导,新的一年获得了很多成长和提高,改掉了很多不好的习惯。 在这一年里,我在领导的帮助下,主要完成了以下功能: 1、完成上海银行版本投资营销相关功能的开发。 2、完成车...

万山红遍
昨天
10
0
保密工作与linux系统的发展

保密工作从性质上可以分成商业方面的保密和国家安全方面的保密。由于自己从事的是IT方面的工作,工作中必然会接触涉及到计算机信息方面的相关文件。加上单位已近通过武器装备科研生产单位二级...

linux-tao
昨天
3
0
Spark共享变量

概述 Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,但每个内部的变量有不同的作用域,不能相互访问,所以有时会不太方便,Spark提...

仟昭
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部