JavaScript权威指南笔记(5)


如果数组同时拥有对象属性和数组元素,返回的的属性名很有可能是按照创建的顺序而非数值的大小顺序。所以尽量避免使用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 开始---------------------------------------------------------------------------

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

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