Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaScript 语言精粹 - 数组 #8

Open
ZSI2017 opened this issue Apr 1, 2018 · 0 comments
Open

JavaScript 语言精粹 - 数组 #8

ZSI2017 opened this issue Apr 1, 2018 · 0 comments

Comments

@ZSI2017
Copy link
Owner

ZSI2017 commented Apr 1, 2018

JavaScript 语言精粹 - 数组

JavaScript 提供了一种拥有一些类数组(array-like)特性的对象。它把数组的下标转换成字符串

长度

  • 使用大于或者等于当前length的数字作为下标来存储一个元素,那么length值会被增大以容纳新元素
  • length 属性的值是这个数组的最大整数属性名加上1,不一定等于数组里的属性的个数
       var myArray = [];
       myArray.length    // 0
       myArray[1000] = true;
       myArray.length       //1001;
    
  • length设小,将导致所有下标大于等于新length的属性被删除。
  • 把下标指定为一个数组的当前length,可以附加一个新元素到该数组的尾部。
       var number =[1,2,3];
       number[3] = 4;
       number;     // [1,2,3,4]
    
  • 利用push也能达到同样的效果
       number.push(3);
       number;       // [1,2,3,4]
    

删除

利用 delete运算符可以用来从数组中移除元素,但是会留下一个空洞undefined,并且数组的长度也不会发生变化

  delete number[2];
   // logs  [1, 2, undefined × 1, 4]

使用splice 方法,删除。被删除属性后面的每个属性必须被移除,并且以一个新的键值重新插入。

 number.splice(2,1);
 // number  [1,2,4]

枚举

使用 for in 语句进行枚举,不能保证属性的顺序,还有可能从原型链中得到意外的属性,推荐使用for 循环。

方法

通过给Array.prototype扩充一个函数,每个数组都可以继承这个方法

  Array.method('reduce',function(f,value) {
     var i;
     for(i = 0;i<this.length;i++) {
       value = f(this[i],value);
     }   
     return value;
  })

这里的method方法,则是挂载到Function.prototype上面的,在基本类型的构造函数上添加方法时,就可以省去了 prototype

   Function.prototype.method = function(name,fn) {
     this.prototype[name]  = fn;
     return this;
   }

接受一个函数和一个初始值作为参数,计算出一个新值后,再作为函数的参数执行。

  var data = [1,2,3,4,5];
  var add = function(a,b) {
    return a+b;
  }

  var sum = data.reduce(add,0)  // sum is 15;

 var mult = function(a,b) {
   return a*b;
 }
 var result = data.reduce(mult,1)   // result is  120

指定初始值

JavaScript 不会预置值,使用[] 得到一个新数组,里面是空的,所以应该提供类似Array.dim这样的方法来做这件事。

   Array.dim = function(dimension,initial){
     var a = [],i;
     for(i = 0;i<dimension;i++) {
       a[i] = initial;
     }
     return a;
   }

   var myArray = Array.dim(10,0);
   // myArray is  [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

目前来看,es6里面提供了一个fill() 方法,就弥补了这个空缺。

 var myArray = new Array(10).fill(0);
  // myArray is [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

创建一个二维数组,就必须手动去创建

  for(i = 0; i<n;i+=1) {
    my_array[i] = [];
  }

如果使用 Array.dim(n,[]),就会使每个元素指向同一个数组的引用,同样使用fill 也会有这个问题

   var my_array = new Array(3).fill([]);
   my_array[2][0] = 1;
   // my_array; [[1],[1],[1]]

创建矩阵,同时希望它们有不同的初始值,也可以手动实现

  Array.matrix = function(m,n,initial){
     var a,i,j,mat = [];
     for(i = 0;i < m;i++) {
       a = [];
       for(j = 0; j<n;j++) {
         a[j] = initial;
       }
       mat[i] = a;
     }
     return mat;
  }

然后,构建一个用0 填充的4 * 4矩阵

 var myMatrix = Array.matrix(4,4,0);

或者,构建一个单位矩阵。

  Array.identity = function(n) {
    var i ,mat = Array.matrix(n,n,0);
    for(i = 0;i<n;i+=1) {
      mat[i][i] = 1;
    }
    return mat;
  }
  myMatrix = Array.identity(4);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant