如果数组同时拥有对象属性和数组元素,返回的的属性名很有可能是按照创建的顺序而非数值的大小顺序。所以尽量避免使用for/in循环数组(虽然我的测试是先循环数组,再循环属性)
见151页上
-----------------------------------------------16.10.20 结束---------------------------------------------------------------------------
-----------------------------------------------16.10.21 开始---------------------------------------------------------------------------
JS不支持真正的多维数组,但可以用数组的数组来近似。
见151页7.7
数组方法:见152页7.8或者本博客的JAVASCRIPT笔记
sort()方法
var a = [1,3,2,4,6,5]
a.sort() //当不带参数时,ASCII码顺序排列。
a.sort(function(a,b){return b-a}) //带参数的sort,参数为一个函数,规定了排列的顺序,如果a要排在b前面,则返回小于0的数,如果b要在a之前,则返回大于0的数,如果无所谓,返回0,这个例子返回从大到小排列的数组
ES5中的数组方法:
forEach() //将数组按照索引的顺序按个传递给定义的一个函数。
var data=[1,2,3,4,5];
var sunOfSquares = 0;
data.forEach(function(x){
sumOfSquares +=x*x;
});
data.forEach(function(v,i,a){a[i] = v+1} //可以使用三个参数,分别为元素,索引和数组本身
注意:forEach循环无法使用break提前终止语句,如果需要提前终止,必须放在try块中,并能抛出一个异常。比如:
function foreach(a,f,t){
try{a.forEach(f,t);}
catch(e){
if(e === foreach.break) return;
else throw e;
}
}
foreach.break = new Error("stopIteration");
map()
a = [1,2,3];
b = a.map(function(x){return x*x}); //b为[1,4,9],与forEavh不同的是,map有返回值,返回一个新的数组。它不修改调用的数组。
filter()
filter()返回的数组元素是调用的数组的一个子集。传递的函数是用来逻辑判定的:该函数返回true或false。来决定该元素是否属于这个子集。
a = [5,4,3,2,1];
b = a.filter(function (x) {return x<3}); //[2,1]
c = a.filter(function(x,i) {return i%2 == 0}); //[5,3,1];
注意:filter()会跳过数组中缺少的元素,他的返回数组总是稠密的。
所以我们可以这样:a = a.filter(function() {return true;})来使数组变为稠密数组
甚至,压缩空缺并删除undefined和null元素,可以这样使用filter();
a = a.filter(function(x) {return x !== undefined && x != null});
every()和some()
这两个函数是对数组中的每个元素进行逻辑判定,返回true或false、
every()相当于数学中的所有量词,比如:
a = [1,2,3,4,5]
a.every(function(x){return x<10};) //true,数组中所有元素<10
a.every(function(x){return x%2 === 0;}) //false,数组中并不是所有元素都为偶数
some()则相对,比如:
a.some(function(x){return x%2 === 0;}) //true,数组中有偶数值
a.some(isNaN) //false,数组中不包含非数值元素
需要注意的时,这两个函数一旦确定需要返回什么样的值就会停止遍历元素,如同复合的if条件一样
reduce()和reduceRight()
不知道怎么描述这个函数。直接看例子吧
var a = [1,2,3,4,5];
var sum = a.reduce(function(x,y){return x+y},0); //数组求和
var product = a.reduce(function(x,y){return x*y},1); //数组求积
var max = a.reduce(function(x,y){return (x>y)?x:y;}); //求最大值
如上所示,reduce函数需要两个参数,第一个是函数,函数会返回一个计算后的值,第二个是初始值。函数中第一个参数是到目前为止的操作累积结果,第2-4个参数为v,i,a三兄弟。
在第一次调用的时候,初始值就为函数的第一个参数,第二次的时候就��函数返回的值为第一个参数,以此类推。
如果不传递第二个参数,则函数会选择数组的第一个元素为第一参数,第二个元素作为第二参数,所以上面的例子中其实是可以省略第二个参数的。但是在空数组上,不带初始值参数调用reduce()会导致类型错误异常。如果只有一个值,或者空数组带一个初始值,则只会返回那个数,并不会执行函数,比如:
a = [];
a.reduce(function(x,y){return x*2},2); //返回2,并没有执行*2操作
reduceRight()和reduce()的区别就是reduceRight是从高到低执行
indexOf()和lastIndexOf()
获取数组中给定元素的索引,没有则返回-1
a = [6,1,4,3,1];
a.indexOf(1); //1
a.lastIndexOf(1); //4
a.indexOf(1,3) //4,第二个参数为指定起始位置
见156页7.9
-----------------------------------------------16.10.21 结束---------------------------------------------------------------------------
-----------------------------------------------16.10.22 开始---------------------------------------------------------------------------
this:
嵌套函数作为函数调用时,this值指向全局对象(非严格模式下)或者为undefined(严格模式下)。
比如:
var o={
m:function(){
var self = this;
console.log(this === o) //true
f();
function f(){
console.log(this===o) //false
console.log(self === o) //true
}
}
}
见171页下
构造函数:
如果没有形参,则可以省略()
var o = new Object();
var o = new Object;
这两行代码是一模一样的。
-----------------------------------------------16.10.22 结束---------------------------------------------------------------------------
-----------------------------------------------16.10.23 开始---------------------------------------------------------------------------
实参对象:arguments
arguments实际上并不是真正的数组,它是一个实参对象。只是碰巧具有以数字为索引的属性。
arguments还有callee和caller两个属性
callee:指代当前正在执行的函数
caller:指代当前正在执行的函数的函数
见175页
自定义函数属性:
function factorial(n){
if(isFinite(n) && n > 0 && n == Math.round(n)){
if(!(n in factorial))
factorial[n] = n * factorial(n-1);
return factorial[n];
}
else return NaN;
}
factorial[1] = 1;
这个函数使用自身的属性,来缓存了每一次计算的结果。
见180页
闭包
可以让函数外部访问到函数内部的变量。
初看很强大,之前也是这个部分很难理解,现在一路看下来要好很多了,具体的,明天静下心来好好看。
见182页8.6
-----------------------------------------------16.10.23 结束---------------------------------------------------------------------------
-----------------------------------------------16.10.24 开始---------------------------------------------------------------------------