JavaScript自学笔记(必看篇)(2)

var arr = []; for (var x = 1; x <= 100; x++) { arr.push(x); //将1~100放入数组 } alert(arr.reduce(function(x,y){ return x+y; //对arr的所有对象累积求和,返回求和结果 }));

18-用reduce()做一个牛逼的转换:把[1, 2, 5, 8, 0]变换成整数12580

var arr = [1, 2, 5, 8, 0]; alert(arr.reduce(function(x,y){ return x*10+y; }));

19-用filter()把Array的某些元素过滤掉

var arr = [0,1,2,3,4,5,6,7,8,9]; alert(arr.filter(function(x){ return x%2===0; }));//0,2,4,6,8 //返回true则保留 把一个Array中的空字符串删掉 var arr = ['A', '', 'B', null, undefined, 'C', ' ']; alert(arr.filter(function (s) { return s && s.trim(); // 注意:IE9以下的版本没有trim()方法 })); // ['A', 'B', 'C']

20-Array的sort()方法默认把所有元素先转换为String再排序,于是...

[10, 20, 1, 2].sort(); // [1, 10, 2, 20] 因此如果要按数字大小排序,可以这么写: var arr = []; for (var x = 1; x <= 10; x++) { arr.push(x); } document.write(arr+"<br/>"); document.write(arr.sort(function(x,y){ return x<y?true:false; })); 若要忽略字母大小写影响,则要先转化为大写或小写 var arr = ['Google', 'apple', 'Microsoft']; alert(arr.sort(function (s1, s2) { var x1 = s1.toUpperCase(); var x2 = s2.toUpperCase(); return x1 < x2 ?false:true; })); // ['apple', 'Google', 'Microsoft']

21-闭包(Closure)程序结构

①将函数作为返回值赋值给参数,调用该参数获得计算结果 var arr = []; for(var n=1;n<101;n++){ arr.push(n); } function lazy_sum(arr){ var sum = function(){ return arr.reduce(function(x,y){ return x+y; }); } return sum; } var f = lazy_sum(arr); alert(f()); ②返回的函数并没有立刻执行,而是直到调用了f()才执行 function count() { var arr = []; for (var i=1; i<=3; i++) { arr.push(function () { return i * i; }); } return arr; } var results = count(); //results里存了3个function var f1 = results[0]; var f2 = results[1]; var f3 = results[2]; f1(); // 16 返回的函数引用了变量i,但它并非立刻执行。 f2(); // 16 等到3个函数都返回时,它们所引用的变量i已经变成了4, f3(); // 16 因此最终结果为16 ***返回闭包时牢记:返回函数不要引用任何循环变量,或者后续会发生变化的变量! ③如果一定要引用循环变量怎么办? 方法是再创建一个函数,用该函数的参数绑定循环变量当前的值, 无论该循环变量后续如何更改,已绑定到函数参数的值不变: function count() { var arr = []; for (var i=1; i<=3; i++) { arr.push(function(n){ return function(){ return n*n; } }(i)); } return arr; } var results = count(); var f1 = results[0]; var f2 = results[1]; var f3 = results[2]; alert(f1()); // 1 alert(f2()); // 4 alert(f3()); // 9 ④在没有class机制,只有函数的语言里,借助闭包,可以封装一个私有变量 function creat_counter(init){ var n = init||0; return{ add:function(){ n+=1; return n; } } } var c = creat_counter(); alert(c.add());//1 alert(c.add());//2 alert(c.add());//3 ***在返回的对象中,实现了一个闭包,该闭包携带了局部变量n,并且,从外部代码根本无法访问到变量n。 换句话说,闭包就是携带状态的函数,并且它的状态可以完全对外隐藏起来。 ⑤利用Math.pow(x, y)计算x^2或x^3 //Math.pow(x, y)-->x^y function make_pow(y){ return function(x){ return Math.pow(x,y); } } var pow2 = make_pow(2) var pow3 = make_pow(3) alert(pow2(3))//9 alert(pow3(3))//27

22-箭头函数(目前仅firefox支持) //参数=>函数体

var f = x => x*x*x alert(f(3)) //27

23-用generator产生斐波那契数列

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzsdpf.html