201506150846_《JavaScript权威指南(第六版)——性能优化10条、小写转大写、过滤、函数》(P162-168)
一. 权威指南
1. 对于类数组对象,我们不能用数组方法,但是我们可以用 Function.call();
例如: Array.prototype.slice.call(arr,...);
Array.prototype.silice.call(arr,...);
Array.prototype.map.call(arr,...);
二. 性能优化10条
1. var someId = document.getElementById('#someElem'); 改成: var docu = document, someId = docu.getElementById('#someElem');
2. 不要用with();
3. 小心使用闭包,尤其在循环中;
4. 在数值、变量、对象属性和数组元素4种访问方式中,前二者的速度显著优于后二者;
5. 不要在数组中挖掘的太深;
6. 用for();或do-while来代替 for-in;
7. 在循环时,将循环条件和循环变量合并起来;
8. 为HTML集合对象定义数组;(推荐使用《高性能JavaScript作者的写法》)
例如: function array(items) {
try {
return
Aarray.prototype.concat.call(items);
}catch(ex) {
var i = 0,
len = items.length,
result = Array(len);
while(i < len) {
result[i] = items[i];
i++;
}
return result;
}
}
var docu = document;
var divs = array(docu.getElementByTagName('div'));
for(var i =0; i < divs.length;i++) {
var myDiv = docu.creatElement("div");
docu.appendChild("myDiv ");
}
9. 不要碰Dom !
crateAttribute(name);
createComment(text);
createDocumentFragment(); (推荐用法)
createElement(tagname);
createTextNode(text);
10. 修改css类而非样式
三. 小写转大写
例如:
var str = ['a', 'p', 'p', 'l', 'e', 's'];
Array.map = Array.map || function(a,sep) {return Array.prototype.map.call(a,sep)};
var newStr = Array.map(str,function(elem){return elem.toUpperCase()});
console.log(newStr);
四. 过滤
例如:
var s = "fsdgnxvhdzfgtrxzcsdightmjtioyujvdgs";
var newS = Array.prototype.join.call(s," ");
console.log(newS); //f s d g n x v h d z f g t r x z c s d i g h t m j t i o y u j v d g s
var lastestS = Array.prototype.filter.call(newS,function(elem){return elem.match(/[^aeiou]/);}).join("");
console.log(lastestS); //fsdgnxvhdzfgtrxzcsdghtmjtyjvdgs
注意:字符串是不变的,不可修改的(比较特殊),使用push()、sort()、reverse()方法会修改数组,但是对字符串无效!!
五. 函数
1. 初始化一个对象的函数成为构造函数(constructor)。
2. 定义函数有两种方式:a. 定义语句 b. 表达式
3. 例1:遍历对象属性名和属性
var object = {'a' : '3','str' : 'hello','funcion' : 'fn','b' : '0.618'};
function printProps(obj) {for(var p in obj)console.log(p + " : " + obj[p] + "\n")};
printProps(object); //
//a : 3
// str : hello
// funcion : fn
// b : 0.618
例2:计算两个坐标简的距离
function distance(x1,x2,y1,y2) {
var dx = x2-x1;
var dy = y2-y1;
return Math.sqrt(dx*dx + dy*dy);
};
distance(0,0,2.8,55); //0?
例3:阶乘
function factorial(n) {
if(n <= 1){
return 1;
}else{
return
n*factorial(n-1)
}
};
factorial(4); //24
4. 函数的名称将是函数内部的一个局部变量;
5. 没有返回值的函数有时候成为“过程”;
6. 注意:x可以访问a,b!!
例如:
function fn_a(a,b){
function fn_b(x) {
return x*x;
}
return Math.sqrt(fn_b(a) + fn_b(b));
}
7. 函数表达式可以出现在JavaScript代码的任何地方
六.函数调用
1. 作为函数调用、作为方法调用,作为构造函数调用、call()和apply()间接调用;
2.