函数编写
JS的函数可以嵌套(骚不骚?但是好像其他语言也支持?)
<scirpt>
function Function_name()
{
function second()
{
}
}
</script>
变量提升
JavaScript的函数定义时,它会先把函数体扫一遍,然后把所有的变量声明提升到函数顶部(这才是最骚的叭~)
arguments参数
只在函数内部起作用,永远指向函数调用者传入的所有参数,类似Array但不是Array
利用 arguments 获得所有参数(求和)
function sum(a,b)
{
if(arguments.length===0)
return 0;
var s=0;
for(var i=0;i<arguments.length;++i)
s+=arguments[i];
return s;
}
sum();
sum(1);
sum(1,2);
sum(1,2,3,4,5);
rest参数
要想获得函数参数列表外的剩余参数,使用rest更为方便,当参数数量不够填满参数列表时,rest是一个空数组,而在参数将参数列表填满后,会被包括在rest数组中。
方法
在一个对象中绑定函数,称为这个对象的方法
在一个方法中,this这个特殊变量始终指向当前对象
通过 apply() 可以控制this的指向
function getAge() {
var y = new Date().getFullYear();
return y - this.birth;
}
var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};
xiaoming.age(); // 25
getAge.apply(xiaoming, []); // 25, this指向xiaoming, 参数为空
改变this的另一个方法是 call()
Math.max.apply(null,[1,2,3]);
Math.max.call(null,1,2,3);
(对于普通函数调用,通常把 this 绑定为 null )
装饰器
利用 apply() ,动态改变函数行为。
统计使用了多少次 parseInt() 函数
var count =0;
var oldparseInt=parseInt;
window.parseInt = function()
{
++count;
return oldparseInt.apply(null,arguments);//调用原函数
}
高阶函数
第一次见,觉得贼牛逼。。
就是说,函数的参数可以接收另外一个函数作为参数,这样的函数称之为 高阶函数
//一个简单的高阶函数
function add(x,y,f)
{
return f(x)+f(y);
}
add(1,-3,Math.abs);
map/reduce
map
map() 定义在JavaScript的 Array 中,调用 Array 的 map() 方法,传入自定义函数,得到一个新的 Array
function pow(x)
{
return x*x;
}
var arr=[1,2,3,4,5];
var ans=arr.map(pow);
//[1,4,9,16,25]
map() 在处理数组时及其方便
reduce
同样的,reduce() 定义也在 Array 中,它接收一个函数作为参数,作用效果是顺序地将运算结果与数组中下一个元素做运算。
利用reduce()求积
function product(arr)
{
return arr.reduce(
function(x,y)
{return x*y}
);
}
通过map,reduce实现 String2int()
function String2int(s)
{
return s.split("").map(x=>x*1).reduce((x,y)=>x*10+y);
}
实现首字母大写
function(arr)
{
return arr.map(v=>v.substring(0,1).toUpperCase()+v.substring(1,v.lengtn).toLowerCase());
}
filter
filter() 用于过滤 Array 中的元素,返回剩下的元素,接受一个函数作为参数。
//删掉偶数
var arr = [1,2,3,4,5];
var A=arr.filter(function(x){return x%2!==0;})
//[1,3,5]
//删掉空字符
var arr = ['a','b',' '];
var A=arr.filter(function(x){return x&&x.trim();})
filter() 接收的回调函数,可以有多个参数,第一个参数表示元素,第二个表示元素位置,第三个表示数组本身
//利用filter()巧妙去重
var arr,A;
A = filter(function(element,index,self)
{
return self.indexOf(element)===index;
}
)
sort
排序算法
很傻逼的排序
['A','C','B'].sort(); ['A','B','C']
['a','C','B'].sort(); ['B','C','a']
[1,2,10,20].sort(); [1,10,2,20]
结果这么奇怪的原因是,Javascript的sort()对数字数组进行排序时,会先将其转换为String再排序
网友评论