函数
js的函数和python差不多,def 换成function
arguments
js函数在使用时传入的参数可以不与定义的参数个数相等(可多可少),
arguments用于获取所有传入的参数,用法类似与array
rest
用法
function f(a,b,...rest)
获取除了自定义的a,b参数外的其余参数,用法和array类似,若无,则返回空数组。
全局对象
全局对象类似于命名空间,一般情况下我们所写的变量都会在一个叫window
的命名空间内。如:
var a = 1;
console.log(a);
#等价于console.log(window.a)
也可以以对象的方式自己定义一个命名空间
var name_space = {}
name_space.a = 1
name_space.func = function(...){...}
console.log(name_space.a)
this
在对象内的this指向该对象,但在对象外使用this,会指向全局变量window。
如
var obj = {
name:10,
getName:function(){
return this.name
}
};
使用getName时,应该
obj.getName();
而不是
var f = obj.getName
f()
这样this又会指向window!
另外,若
getName = function(){
return this.name
}
var obj = {
getName:getName
};
这样也会使得this指向window
apply和call
这两者都是为了解决this的指向问题
function getAge() {
return this.birth;
}
var xiaoming = {
name: '小明',
birth: 1990,
age: getAge
};
getAge.apply(xiaoming, []); // 25, this指向xiaoming, 参数为空
调用函数自身的apply方法,可以让this指向某个对象,第二个参数是传入的参数;
call的用法和apply类似,区别是第二个参数不是数组,而是把他拆分成单独的参数传入,
如apply传入的是[1,2,3],call传入1,2,3。
高阶函数
map/reduce
内置与array中,传入一个函数,用法
array.map(f)
map的作用是使得[x1,x2,x3,…]转化为[f(x1),f(x2),f(x3),…]
array.reduce(f)
reduce的f传入两个参数,前两个参数的结果作为下一次计算的第一个参数:
[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4),
这种方法可以用于求累加,累乘等运算。
filter
用于过滤,若函数输出结果为false,则删除该元素,若为true,则保留
如实现保留奇数过滤偶数的功能:
array.filter(function(x){
return x%2 === 1;
});
sort
用于自定义的排序,传入两个参数x和y,若返回-1则把x排在y前面,返回0则认为两者相等,返回1则把y排在x前面。
array.sort(function(x,y){
if (x<y)
return -1;
else if (x>y)
return 1;
else
return 0;
})
注意,js默认的sort函数是先将元素转化为字符类型,再排序,所以若对
[1,2,10]排序,会返回[1,10,2]!
匿名函数
用法
var f = x => x*x
若要输入/输入多个值,应该
var f = (x,y) => {
if (x>y)
return -1;
else
return 1;
};
另外值得注意的是匿名函数中的this的作用域是他所处的{},而不是window
generator
生成器的用法和python差不多,使用function*定义
function* gen(){
var i = 0;
var max = 100;
while (i<max){
yield i;
}
return;
}
使用生成器有两种方法
1、使用next()函数
var f = gen();
f.next();//返回{value:0,done:false}
...
f.next();//{value:undefined,done:true}
这种方法会返回一个字典,并且需要自己判断是否读取完所有的值
2、使用for … of:
这种方法和python一样,不详述。