1,数据类型
只有简单的number,string,boolean等少量类型,都是var来定义。
string是固定的,不想objc和java,分可变固定两种。
倘若var定义一个 变量,没赋初值,那它的值就是undefined。
2,函数参数
参数名字居然没有实际意义,仅仅是标识而已。参数在一个类似数组里面放着,argument带下标就可以去到参数,length可拿到参数个数。函数可以接受任意个参数,所以在func实现中,可以用length判断,不同参数个数对应不同功能,这就 好比c语言中的重载 啊。虽然javascript语言本身并没有重载的概念。
这种函数参数的灵活性,程序员可以方便传入大量可选参数。通常做法,必须值使用命名参数,用个args对象封装多个 可选参数,在函数实现中,根据typeof来判断,分别处理。
3,引用类型
javascript不能直接访问内存位置,也就是说不能像C一样直接操作对象的内存空间。引用类型的值是引用访问的,譬如那些object对象,我们可以动态添加其属性。
String在java等语言中是一个 对象,而在javascript中它是一个基本类型,同number一样,基本对象都是按值访问的。
javascript函数的参数传递,全部是 按值传递的。如果 是基本类型,就是copy一份;如果 是object引用类型,就是把引用的名字copy一份,两指向的还是同一个内存空间,(感觉这跟引用传递object对象一个 意思啊)。
typeof可以检测一个变量是否基本类型。instanceof检测应用类型是一个具体什么对象。
var b = true;
alert(typeof b);//boolean
alert(colors instanceof Array); //判断colors是否为array数据类型
4,执行环境
javascript最为重要的一个概念,每个执行环境都有一个与之关联的变量对象。
最外围的全局执行环境就是window对象。
执行环境掌管着代码执行过程中的内存,开发人员不需要关心。其实垃圾回收机制原理很简单,就是不在 继续用的内存,回收。一般按照固定时间间隔启动垃圾回收。
变量不在用的时候置为null,告诉环境不需要了,但不会立即释放,得等到下一个垃圾回收启动。
5,Array数组
JS中常见的数据类型。创建数组两种方式:
1,直接new: var colors = new Array(3); new关键字可以省略。
2,赋值方式: var colors = [“blue”,”green”,”red”];
如果这样: var colors = []; 则创建一个空数组。
不同于其他 语言,JS数组的length居然是可读写的。也就是说可以修改length值控制数组大小。
譬如上面的colors,若colors.length = 2,那colors[2]下标的值不是red,而是undefined
还可以通过这一特性,直接往数组尾部添加新项
colors[colors.length] = “black”;
colors[colors.length] = “brown”;
Array可以拓展为stack栈,list队列。根据不同的调用方法,pop(出栈),push(压栈),shift(取队首)
这三个 方法 都 会影响Array的length大小。
Array提供sort排序方法 ,接受比较函数作为参数,这就比较灵活啦。
6,Function函数
函数也是对象,即 Function的一个实例。下面两种方式一样的意思:
function sum (num1,num2)
{
return num1+num2;
}
var sum = function(num1, num2){ return num1 + num2 };
既然函数是 一个对象,那就可以 当作参数传递。
函数的两个内部属性,一个argumente上面讲过了,另外一个this同java和c++中差不多意思,代表函数的环境对象。
如果在网页 的 全局作用域中,this对象引用的就是window·
7, JS没有类
通过Construct Function来创建对象,这种特殊函数不带return,使用的时候直接new
还可以通过工厂模式,其实还是函数封装来创建对象,如下图:
每一个函数,以及 对象都有prototype, 带一个指针, 指向关系如下图:
prototype有什么用? 感觉像java的静态变量,当作instance实例的初始化默认值吧。可以覆盖改写的:
8 ,JS如何实现继承
9,搞清楚匿名函数和闭包
闭包是什么函数,就是那些有权访问其它函数域中变量的函数。譬如函数嵌套中,嵌套函数就能访问外部函数中的变量,同一执行环境。当你return嵌套的内部函数时,就是一个闭包。http://kb.cnblogs.com/page/110782/
这个帖子翻译的比较清楚。
当function里嵌套function时,内部的function可以访问外部function里的变量。
function foo(x) {
var tmp = 3;
function bar(y) {
alert(x + y + (++tmp));
}
bar(10);
}
foo(2)
不管执行多少次,都会alert 16,因为bar能访问foo的参数x,也能访问foo的变量tmp。
但,这还不是闭包。当你return的是内部function时,就是一个闭包。
内部function会close-over外部function的变量直到内部function结束。
function foo(x) {
var tmp = 3;
return function (y) {
alert(x + y + (++tmp));
}
}
var bar = foo(2); // bar 现在是一个闭包
bar(10);
上面的脚本最终也会alert 16,因为虽然bar不直接处于foo的内部作用域,但bar还是能访问x和tmp。
闭包可能令代码难以理解和调试,JS库有bind方法,可将函数绑定到指定环境。
匿名函数很好理解,就是没有函数名,直接Function后面跟函数实现的代码。
10,JS是单线程语言
包括那些定时器实现,如:setTimeout和setInterval,执行时机并不能保证。事件处理程序,Ajax回调函数,都在一个线程里面运行着。浏览器好比OS,调度这些任务。
浏览器严格限制JS代码执行时间,避免JS获取过多资源,直接把计算机整崩溃了。我们有时会看到一个弹出框,告诉用户某个脚本用时过长,允许继续执行还是停止它。通常是函数过长执行或者过深嵌套。设置超时时间来限制下,还有任务分组、函数节流等方法。
11,识别浏览器
navigation识别客户端浏览器,其 plugins检测浏览器安装的插件。
检查浏览器和平台,做好兼容性的前提。用户代理字符串,见证了浏览器发展史。
微软发布IE浏览器后,由于Netsacape占据市场绝大数份额,也就是后来的firefox。所以微软将IE的用户代理字符串修改成Netscape兼容的 形式,就是伪装自己跟龙头一伙的。
目前 有IE,safari, opera,以及 老牌的firefox。平台linux,windows,mac
safari和chrome都用的webkit引擎,但javascript引擎却不同。
12,H5的变化
websoket让浏览器和服务器实现了全双工通讯。
支持离线的web应用是html5的又一特点。web开发者一直希望能与传统的PC客户端同场竞技。
h5提供了网络监测、应用缓存。以前都是cookie来存储,这么多年了,web storage想有所突破,可以跨会话。
IndexedDB则走的 更远了,直接弄一异步数据库来存储数据,感觉都要抛弃server了。呵呵,玩笑话。
HTML5中对表单的输入框提供原生验证,可以不用JS代码来做内容验证了 。
一些新的 有用API,像地图定位、本地文件访问、判断页面可见……..
一些经验点
在使用InnerHTML、OutHTML时候,最好先手工删除要被 替换的元素的所有事件处理程序和javaScript对象属性
一般来说,在 插入大量HTML标记时,使用InnerHTML属性与通过多次DOM操作先创建节点再指定他们之间的 关系相比,效率要快的 多。
不可避免地,创建和销毁HTML解析器也 带来性能损失,所以最后能将InnerHtML和OutHTML的使用次数控制在合理范围内。
事件处理越多,性能越慢。这些函数都是对象,要占用内存,浏览器代码与交互式js代码建立连接。我们通常用委托代理,即在元素上层做事件,同时删除空事件处理程序。