函数无明确返回值时,返回的值是undefined
undefined表示对象已经声明,没有赋值.null表明对象不存在(null == undefined)
强制转换为boolean类型时,undefined、null、空字符串、0都返回false,其它的返回true;
在进行逻辑运算时,如果运算数不是原始Boolean类型,则返回对象。
== 和 === 区别是 ==在比较前会进行自动类型转换,而===不会进行类型转换
with语句是运行缓慢的代码段,尽量少用
java 与 js 中switch 的区别: js中switch case可以用字符串也可以用不是常是的值
js中可以声明两个函数名一样的函数而不会发生错误,后面的函数会覆盖前面的函数
闭包就是函数的内部函数调用了外部的变量
js原始类型: undefined、null、Number、String、Boolean
js引用类型: String、Number、Boolean、Object (虽然名字和原始类型一样,但引用类型是原始类型的包装类)
encodeURI和encodeURIComponent区别:后者只会转码所有的非标准字符,例如: 空格 --> %20
escape和encodeURI最大区别: escape只能转码ascii字符,所有建议少用
cell 向上取整, floor向下取整 ,round 标准的四舍五入
location.reload(true); 强制刷新,默认是false
obj.attributes.getNamedItem('id').nodeValue 访问节点的属性值
document.all ie返回所有元素 document.getElementsByTagName('*') other browser return
document.getElementsByName ie6仅仅检查input和img标签
document.getElementById('abc') ie6中如果abc是某元素的id值同时也是另一个元素的name值 那么会返回这两个元素
通过dom访问元素的class属性时 要通过className访问,不能通过class访问是因为class是保留字,估计留有其它用的
可以通过NodeIterator和TreeWalker遍历dom
dom事件分类 捕获型事件(DOM)、冒泡型事件(IE),dom型事件是坐documentElement向事件源捕获,然后再冒泡。而ie事件是直接从事件源向documentElement冒泡
addEventListener、removeEventListener ie6-ie8均不支持 只支持attachEvent、detachEvent
常用事件编号 回车:13 空格:32 回删:8
var target=event.srcElement || event.target; //事件源对象
var char=target.keyCode || target.charCode; //事件源对象接收的按键
event.returnValue=false ie阻止事件 event.preventDefault(); dom兼容阻止事件
event.cancelBubble=true ie阻止事件冒泡 event.stopPrapagation() dom兼容阻止事件冒泡   目前高版本的浏览器均支持cancelBubble和stopPropagation
keyDown > keyPress > keyUp 按字符键产生事件顺序
keyDown > keyUp 按非字符键产生的事件顺序
一直按字符键不松,会一直产生keyDown、keyPress事件。一直按非字符键不松只会产生keyDown事件
obj.currentStyle.color ie中的最终样式 getComputedStyle(obj,null).color dom中的最终样式,null可以是伪类时的样式 例如:'hover'
innerHTML、outerHTML、innerText、outerText firefox(16.0.0)不支持*Text,支持*html,chrome都支持
EvalError、ReferenceError、RangeError、synatexError、TypeError、URIError js异常类型
document.domain='qq.com'  设置域,可以跨子域访问。只能设置url中已经存在的值,所有baidu.com就不能设置成功
1160 单个tcp-ip包的大小,所有尽量控制js文件的大小在1160字节

/* 数组连结比'+'性能更高 */
function StringBuffer(){
    this._strings=new Array();
}
StringBuffer.prototype.append=function(str){
    this._strings.push(str);
}
StringBuffer.prototype.toString=function(){
    return this._strings.join('');
}
var d=new Date();
var sb=new StringBuffer();
for(i=0;i<100000;i++){
    sb.append(i);
}
sb.toString();
var d2=new Date();
console.log(d2-d);

/* 混合构造/原型方式*/
function o(a,b,c){
    this.a=a;
    this.b=b;
    this.c=c;
}
o.prototype.m=function(){
    console.log(this.a);
}
var t1=new o(1,2,3);
var t2=new o(4,5,6);
t1.m();
t2.m();

/* call 和 apply */
function classA(a,b){
    console.log(a+','+b);
}
function classB(a,b){
    classA.call(this,a,b); //参数为列表
    classA.apply(this,arguments); //传递为数组
    this.a=a;
    this.b=function(){
        console.log(a);
    }
}
var t1=new classB('1','2');
t1.b();
var t2=new classA('3','4');

/* 批量添加节点 */
var arr=[1,2,3,4,5,6];
var oFragment=document.createDocumentFragment();
for(i in arr){
    var oDiv=document.createElement('span');
    var oText=document.createTextNode(i);
    oDiv.appendChild(oText);
    oFragment.appendChild(oDiv);
}
document.body.appendChild(oFragment);

/* dom 访问节点*/
obj.firstChild 
obj.lastChild
obj.childNodes
obj.nodeName
obj.nodeValue
obj.nodeType
obj.ownerDocument 这个节点所属的文档
obj.previousSibling 上一个兄弟节点
obj.nextSibling 下一个兄弟节点
obj.hasChildNodes 是否包含兄弟节点
obj.attributes 返回节点包含的属性数组
obj.appendChild 
obj.removeChild
obj.replaceChild(newNode,oldNode)
obj.insertBefore(newNode,refNode)

/* dom 创建节点 */
document.createElement
document.createTextNode; 创建文本节点(text)
document.appendChild;
document.createDocumentFragment 文档碎片,把批量的节点添加到fragment后再添加到目标元素,减少界面重绘,提高性能

/* addEventListener*/
function show(){alert('clicked');}
var arr=[1,2,3,4,5,6];
var oFragment=document.createDocumentFragment();
for(i in arr){
    var oDiv=document.createElement('div');
    var oText=document.createTextNode(i);
    oDiv.addEventListener('click',show,false); //false:冒泡时触发 true:捕获时触发
    oDiv.appendChild(oText);
    oFragment.appendChild(oDiv);
}
document.body.appendChild(oFragment);

/* 兼容事件绑定*/
var EventUtil=new Object;
EventUtil.addEventHandler=function(oTarget,sEventType,fnHandler){
    if(oTarget.addEventListener)
            oTarget.addEventListener(sEventType,fnHandler,false); //false 冒泡时触发
    else if(oTarget.attachEvent)
            oTarget.attachEvent('on'+sEventType,fnHandler);
    else
            oTarget['on'+sEventType]=fnHandler;
}
EventUtil.removeEventHandler=function(oTarget,sEventType,fnHandler){
    if(oTarget.removeEventListener)
        oTarget.removeEventListener(sEventType,fnHandler,false)
    else if(oTarget.detachEvent)
        oTarget.detachEvent('on'+sEventType,fnHandler);
    else
        oTarget['on'+sEventType]=null;
}

/* 查看css样式表中的样式 */
var oCSSRules=document.styleSheets[0].cssRules || document.styleSheets[0].rules;
var css='';
for(i=0;i<oCSSRules.length;i++) //样式表规则的集合
    css+=oCSSRules[i].cssText;
    //oCSSRules[i].style.color; //访问解析后的样式
console.log(css);



/*js 私有、静态、实例属性*/
function Person(age,face){
        var age=age; //私有
        this.face=face; //实例
        Person.gender='man'; //静态属性
}
var p1=new Person(20,'圆脸');
var p2=new Person(22,'尖脸');
Person.gender; //必须在Person构造函数运行后(Person() || new Person())才能调用到值
p1.gener;
p1.age;
p1.face;