(一、javascript简介)
1、Javascript(ECMAScript,DOM,BOM);ECMAScript(javascript,actionscript,ScriptEase)
(二、在HTML中使用Javasript)
1、<script>元素的defer,延迟到整个页面都解析完毕后再运行.不是所有浏览器都支持defer属性.ie和firefox3.1支持
2、XHTML是将HTML作为XML的应用而重新定义的一个标准。“<“在XHTML中将被当作开始一个新标签解析,(//<![CDATA[ XXXXXX //]]>, 注释cdata片段,通过XHTML验证)
3、文档模式(混杂模式、标准模式、准标准模式、超级标准模式)<meta http-equiv="X-UA-Compatible" content="IE=7">。
(三、数据类型)
1、未初始化的变量会自动被赋予undefined值;对未初始化和未声明的变量执行typeof操作符都返回undefined值。要养成显示初始化变量的习惯,这样typeof就可以区分undefined和null了。
2、null值表示一个空对象指针,所以typeof null时会返回”object“。undefined值是派生自null值的,因此(null == undefined)返回true。
3、返回为false的值(false、空字符串""、0和NAN、null、undefined)
4、浮点数值的最高精度是17位小数,但在进行算术计算时精确度远远不如整数。0.1+0.2=。030000000000000004。
5、ECMAScript的最小数值保存在Number.MIN_VALUE中,大多浏览器是5e-324。如果计算超出数值范围,则会被转换成Infinity,用isFinite检测是否超出。
6、NaN:任何数值除以0会返回NaN;NaN与任何值都不相等,包括NaN本身。
7、转换为字符串:toString()和String(),null和undefined没有toSring()方法
8、Object每个实例都具有下列属性和方法(constructor、hasOwnProperty(), isPrototypeOf(), propertyIsEnumerable(),toString(),valueOf())
9、with语句作用是将代码的作用域设置到一个特定的对象中。大量使用with会导致性能下降,也会给调试造成困难。
10、switch语句中每个case的值不一定是常量,可以是变量,甚至是表达式。
var num = 3;
switch(true) {
case num < 0;
xxxx;
break;
case num >= 0 && num <= 10:
xxxx;
break;
}
(四、变量、作用域和内存问题)
1、基本数据类型值(保存在栈内存中的数据段),引用类型值(保存在堆内存中的对象,变量中保存的值是一个指针,指针指向内存中的另一个位置)
2、with和catch语句中声明的变量都会被添加到所在执行环境的变量对象中。ie的javascript实现中,catch语句中捕获的错误对象会被添加到执行环境的一部分,就是在catch块的外部也可以访问到错误对象
3、访问局部变量要比访问全局变量更快,因为不用向上搜索作用域链
4、垃圾回收(标记清除;引用计数(存在循环引用问题,ie的BOM和DOM中的对象使用c++以COM对象形式实现的,而COM对象垃圾收集机制采用的就是引用计数策略,换句话说,只要在ie中涉及com对象,就会存在循环引用的问题))
5、ie的垃圾收集器是根据内存分配量运行的,就是256个变量、4096个对象(或数组)字面量和数组(slot)元素或者64KB的字符串,达到上述任何一个临界值,垃圾收集器就会运行。如果一个脚本包含很多变量,则垃圾收集器得频繁运行,引发严重的性能问题。ie7重写为动态修正临界值
6、优化内存占用的最佳方式,就是一旦数据不再用,最好设置为null,解除引用。这一做法适用于大多数全局变量和全局对象的属性,局部变量会在离开执行环境时自动被解除引用
(五、引用类型)
1、数组最多包含4294967295个项,超出会发生异常,导致运行时间超长的脚本错误。如果数组某一项是null或者undefined,则join,toLocaleString,toString,valueOf返回结果中以空字符串表示
2、函数:argrments.callee属性,是一个指针,指向拥有这个arguments对象的函数,递归调用使用可以不用理会函数名。
3、apply()和call()用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值。最大的好处就是能够扩充函数赖以运行的作用域,对象不需要与方法有任何耦合关系。
4、每个函数都有一个非标准的caller属性,指向调用当前函数的函数。通过arguments.callee.caller来实现对调用栈的追溯,目前ie,firefox,safarichrome都支持该属性,但建议用于调试目的
5、URI方法能够编码所有Unicode字符,而原来的方法只能正确的编码ASCII字符
6、每个函数都是Function类型的实例,函数是对象,函数名是指针
7、每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象
8、
(六、面向对象的程序设计)
1、一个包含所有属性和方法的对象字面量重写整个原型对象,会有一个例外,construct属性不再指向构造函数了。已经创建了实例再重写原型,就会切断现有实例与新原型之间的联系
2、构造函数最大的问题是每个方法都要在每个实例上重新创建一遍;原型对象的最大问题是所有属性是被很多实例共享,尤其是包含引用类型值的属性
3、动态原型模式:(只要检查其中一个方法即可)
function Person(name, age){
this.name = name;
this.age = age;
if(typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert(this.name);
}
}
}
4、原型链:基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法,实现的本质是重写原型对象,代之以一个新类型的实例。
SubType.prototype = new SuperType();
子类的construct指向的是父类了,因为子类的prototype被重写了。给子类原型添加方法的代码一定要放在替换原型语句之后,而且不能再使用字面量方式重写子类的prototype
5、原型链最大的问题来自包含引用类型值的原型;第二个问题是没法在不影响所有对象实例的情况下,给超类型的构造函数传递参数。
6、借用构造函数:即在子类型构造函数的内部调用超类型构造函数:
function SubType(){
SuperType.call(this, 参数);
}
这样一来,就会在新SubType对象上执行SuperType函数中定义的所有对象初始化代码,结果SubType的每个实例都具有自己的属性副本了。
7、不能通过对象
(七、匿名函数)
1、闭包是指有权访问另一个函数作用域中的变量的函数,常见创建方式就是在一个函数内部创建另一个函数。在另一个函数内部顶一个的函数会将外部函数的活动对象添加到它的作用域中,所以外部函数执行完毕后,其执行环境的作用域链会被销毁,但活动对象不会被销毁,仍留在内存中,知道匿名函数被销毁后,外部函数的活动对象才会被销毁。
2、由于闭包会携带包含他的函数的作用域,因此会比其他函数占用更多的内存,过度使用闭包可能会导致内存占用过多。
3、闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的是整个变量对象,不是某个特殊的变量。
4、在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。但匿名函数的执行环境具有全局性,因此this对象通常指向window。this和arguments存在同样的问题。
5、内存泄漏:由于ie对com对象的垃圾收集程序采用引用计数方式,因此闭包在ie中会导致一些特殊的问题。如闭包的作用域中保存着一个HTML元素,就意味着该元素将无法被销毁。
6、块级作用域:
(function(){
//块级作用域
})();
7、单例:只有一个实例的对象
var singleton = function(){
//私有变量和私有函数
var privateVariable = 10;
function privateFunction(){
return false;
}
//特权/公有方法和属性
retrun {
publicProperty:true,
publicMethod:function(){
privateVariable++;
return privateFunction();
}
}
}
(八、BOM)
1、新创建的window对象有一个opener属性,保存着打开它的原始窗口对象。
2、如果是浏览器内置的屏蔽程序阻止的弹出窗口,那么window.open很可能会返回null;如果是浏览器扩展或其他程序阻止的弹出窗口,那么window.open会抛出一个错误。
3、使用setTimeout来模拟setInterval是一种最佳模式,因为后一个间歇调用可能会在前一个间歇调用结束之前启动
4、window.location和document.location引用的是同一个对象
5、注册处理程序(registerContentHandler, registerProtocolHandler, 让一个站点指明它可以处理特定类型的信息)
(十、DOM)
1、NodeList并不是Array的实例,它是基于DOM结构动态执行查询的结果,因此DOM结构的变化能够自动反映在NodeList对象中。可以使用Array.prototype.slice()方法将其转化为数组(ie中无效,因为ie中是COM对象)
2、所有节点都有的ownerDocument属性,指向表示整个文档的文档节点。任何节点都不能同时存在于两个或多个文档中
3、属性:(firstChild, lastChild, parentNode, previousSibling, nextSibling, childNodes, ownerDocument, attributes);方法(hasChildNodes, appendChild, insertBefore, replaceChild, removeChild, cloneNode, getAttribute, setAttribute, removeAttribute)
4、cloneNode不会复制添加到DOM节点中的javascript属性,比如事件,但ie会复制事件处理程序。normalize会删除空文本节点,合并两个相邻文本节点
5、所有浏览器都支持document.documentElement和document.body属性。浏览器对document.doctype的支持差别很大,ie始终返回null
6、document.domain不能设置为URL中不包含的域。每个页面设置相同的domain,则可以互相访问对方包含的javascript对象了。一开始设置domain为loose,不能再设置为tight的。
7、ie7及低版本有个bug,getElementById会返回name跟ID匹配的表单元素
8、可以document.implementation.hasFeature()检测dom功能,但最好再使用能力检测
9、把字符串“</script>”分成拼接字符串"</scr"+"ipt>"之后,就不会被当作外部<script>标签的关闭标签了
10、只有公认的特性才会以属性的形式添加到DOM对象中,getAttribute会返回null,但是 ie会为自定义属性也创建属性。getAttribute访问style和onclick返回的是字符串,而在访问onclick属性时,则会返回一个javascript函数
11、setAttribute可以设置自定义特性,但是ie7及之前版本在设置class,style和事件处理程序时没有任何效果。直接给属性赋值只对公认特性有效。removeAttribute在ie6和之前的版本不支持
(十二、事件)
1、ie的事件流是事件冒泡流,而netscape的事件流是事件捕获流。“DOM2级事件”规定的事件流包括三个阶段:事件捕获、目标阶段和事件冒泡阶段
2、dom0级事件处理程序(btn.onclick = function(){});dom2级事件处理程序(addEventListenner("click", function(){}, true), removeEventListen);dom2可以添加多个事件处理程序,按照添加顺序触发。firefox,safarichrome和opera支持dom级事件处理程序,ie不支持。dom0中this代表所属元素;dom2中this等于window
3、ie只支持事件冒泡,通过attachEvent("onclick", function(){})和detachEvent()添加和删除处理事件程序。attachEvent多个,会反向触发;
4、事件对象:dom0和dom2,都会在函数里传入event对象(function(event)(){});ie在使用dom0级添加事件处理程序时,事件对象为window.event,在attachEvent里传入event参数作为事件对象
5、客户区坐标位置:event.clientX, event.clientY,所有浏览器都支持这两个属性;屏幕坐标位置:event.screenX, event.screenY;
6、