第二章 基本概念
?
2.1数据类型
?
JavaScript中的数据类型分为两种:基本数据类型和对象类型,其中对象类型包含对象,数组,以及函数,基本类型包含字符串(String),数值(Number),布尔值(boolean),undefined,null
?
有关两者之间的转换时这样子的:
基本数据-->对象类型:基本数据类型在做一些运算时,会临时包装一个对象,做完运算后,又自动释放该对象。
对象数据-->基本类型:通过调用对象的valueOf()方法来取得对象的值,如果和上下文的类型匹配,则使用该值。
如果valueOf取不到值的话,则需要调用对象的toString()方法,而如果上下文为数值型,则又需要将此字符串转换为数值。
事实上,这种转换规则会导致很多的问题,比如,所有的非空对象,在布尔值环境下,都会被转成true
?
类型判断:
使用typeof和instanceof。用typeof会出现这种情况print(typeof array); //object ,此时建议用instanceof
?
变量,即通过一个名字将一个值关联起来,以后通过变量就可以引用到该值.
?
变量的作用域:
变量被定义的区域即为其作用域,全局变量具有全局作用域;局部变量,比如声明在函数内部的变量则具有局部作用域,在函数的外部是不能直接访问的.
?
第三章 对象与JSON
?
在JavaScript中,this表示当前上下文,即调用者的引用。
?
对象的声明有三种方式:
通过new操作符作用域Object对象,构造一个新的对象,然后动态的添加属性,从无到有的构筑一个对象。
定义对象的“类”:原型,然后使用new操作符来批量的构筑新的对象。(纠正下,使用原型类型和构造函数共同定义"类")
使用JSON。
建议:使用对象尽量用json来构造对象
?
第四章 函数
?
总的来说,函数本身是对象,在Javascript中可以:
被赋值给一个变量
被赋值为对象的属性
作为参数被传入别的函数
作为函数的结果被返回
用字面量来创建
另外可参考http://www.cn-cuckoo.com/2008/12/26/on-javascript-function-271.html
?
4.1 函数对象
?
4.1.1 创建函数的方式:
(1)var funcName = new Function( [argname1, [... argnameN,]] body );
例如:
var add = new Function("x", "y", "return(x+y)");
print(add(2, 4));
这种方式不推荐使用
?
(2)
声明式
function add(x, y){
?? ?return x + y;
}这种方式类似于java中的方法的写法
?
(3)
定义式
var add = function(x, y){
?? ?return x + y;
}这种方式事实上只是为全局对象添加了一个属性,属性名为add,而属性的值是一个对象。
?
4.1.2 函数的参数
通过arguments来模拟函数重载。
?
4.2 函数作用域
JavaScript中的变量作用域为函数体内有效,而无块作用域,我们在Java语言中,可以这样定义for循环块中的下标变量:
public void method(){
?? ?for(int i = 0; i < obj1.length; i++){
?? ? ? //do something here;
?? ?}
?? ?//此时的i为未定义
?? ?for(int i = 0; i < obj2.length; i++){
?? ? ? //do something else;
?? ?} ?
}
而在JavaScript中:
function func(){
?? ?for(var i = 0; i < array.length; i++){
?? ? ? //do something here.
?? ?}
?? ?//此时i仍然有值,及I == array.length
?? ?print(i);//i == array.length;
}
?
4.3 函数上下文
在Java或者C/C++等语言中,方法(函数)只能依附于对象而存在,不是独立的。而在JavaScript中,函数也是一种对象,并非其他任何对象的一部分。
函数的上下文是可以变化的,因此,函数内的this也是可以变化的,可以通过Function对象上的call或者apply函数来修改函数的上下文:
?
call和apply的区别在于:apply的第二个参数为一个函数需要的参数组成的一个数组。而call则需要跟若干个参数,参数之间以逗号(,)隔开即可。
?
?
第五章:数组
?
5.1中介绍了数组的2个特性。
其中length属性,与其他语言不同的是,这个变量并非只读属性。可以修改数组长度,如果修改的数组长度小于之前的,可以达到数组元素裁减效果。
?
另外数值的下标可以用字符串来表示,比如a['first'].事实上,在JavaScript的数组中,数字下标最终会被解释器转化为字符串.(这个有不同看法,即用字符串当下标,其实是对象的属性)
?
5.2中介绍了一些常见的数组方法
?
首先应该注意的是JavaScript的数组的排序函数sort是按照字母顺序排序的。所以当对数字进行排序时,会不准确。
解决办法如下:
array.sort(function(a, b){return a - b;});//正序
array.sort(function(a, b){return b - a;});//逆序
?
其二数组中没有提供删除元素的方法,需要自己去扩展。
扩展的两种方式如下:
修改原型链接的:
//Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
?? ?var rest = this.slice((to || from) + 1 || this.length);
?? ?this.length = from < 0 ? this.length + from : from;
?? ?return this.push.apply(this, rest);
};
相当于静态方法的:
//Array Remove - By John Resig (MIT Licensed)
Array.remove = function(array, from, to) {
?? ?var rest = array.slice((to || from) + 1 || array.length);
?? ?array.length = from < 0 ? array.length + from : from;
?? ?return array.push.apply(array, rest);
};
?
?
其三遍历数组时应该注意,如果我们扩展了内置对象Array,使用for…in遍历,会把扩展的方法也算进去的。所以建议用普通的for循环遍历。
?
第六章:正则表达式
正则式的内容:
(1)元字符与特殊字符
(2)范围及重复
(3)分组与引用
括号用来分组,当正则表达式执行完成之后,与之匹配的文本将会按照规则填入各个分组,
?
使用正则表达式:
创建正则表达式:
(1) var regex=/pattern/[switchs];
(2) var regex=new RegExp("pattern",switchs); ?注switchs代表i,g,m
除了这两种方式外,String的几个方法也可以使用正则表达式:
分别为:match,replace,split,search.
需要更详细了解正则表达式,请看http://pengshao.iteye.com/admin/blogs/623556
?
第八章 JavaScript面向对象
8.1 引用
跟其他的语言不同的是, JavaScript 中的引用始终指向最终的对象,而并非引用本身
?
8.2new 操作符
在 JavaScript 中,通过 new 操作符来作用与一个函数,实质上会发生这样的动作:
首先,创建一个空对象,然后用函数的 apply 方法,将这个空对象传入作为 apply 的第一个参数,及上下文参数。这样函数内部的 this 将会被这个空的对象所替代:
var triangle = new Shape( "triangle" );
// 上一句相当于下面的代码
var triangle = {};
Shape.apply(triangle, [ "triangle" ]);
?
8.3 封装
这章后面的大段代码看不懂,暂时略过啦。
?
第九章 函数式的Javascript
要说JavaScript和其他较为常用的语言最大的不同是什么,那无疑就是JavaScript是函数式的语言。函数式语言的特征如下:
在函数式编程中,函数是不依赖于其他对象而独立存在的(对比与Java,函数必须依赖对象,方法是对象的方法)。
?
9.1 匿名函数
var func = function(){ ?
?? ?//do something ?
}?
?
9.2高阶函数
以一个或多个函数为参数的函数称之为高阶函数