数组方法总结

数组

数组基础

声明数组方法 , 有哪三种方法?
  var arr = [];     //数组字面量
  var arr = new Array(); //new Array构造函数声明数组  //实参不能有空值,有空会报错
  var arr = Array();  //这种一般不使用,但能声明出来
  //所有数组都继承于Array.prototype, 上面三种构造出来的数组都是Array构造出来的
声明对象的方法
  同数组一样 //var obj = {} , new Object() , Object()

数组到底是什么
  数组的下标就是对象的键名,数组的值就是对象的键值;
  数组是另一种对象的形式,只是写法不同,但访问机制是相同的;
  var arr = [1,2,3];
  var obj = {0:1, 1:2, 2:3};
index
  数组元素的下标, 索引值,从0开始的;

声明稀松数组的2种方法:
  字面量声明稀松数组: 
    //数组中间可以有空值,但最后一位没有值,则代表没有最后一位; 控制指的是留空;
    var arr = [,,];   //empty x 2
    arr = [,1,3, , , 5, 7];   //empty, 1,3,empty x 2, 5,7
  new构造函数声明稀松数组:
    //不能有空值,如果有空会报错
    // var arr = new Array(5,,6); //相当于把实参列表变为数组,所以中间不能为空;
    //构建空值empty数组, new Array(5) 生成
    var arr = new Array(5); //empty x 5

打印数组不存在的下标元素是什么?
  undefined, 相当于打印对象中不存在的属性;

数组的方法哪里来的呀?- 一面最有可能问;
  它们是继承了构造函数Array的原型(ptototype)上面的属性和方法;

数组的方法
  以下都是修改原数组的方法:
  unshift, push, shift, pop, splice, reverse, sort
  添加
  unshift() //返回值是执行了方法以后的数组长度 前边添加
  push()  //返回值是执行了方法以后的数组的长度 //后边添加 //可添加(多个值)
  剪切
  shift() //返回值是剪切掉的数组第一位,shift没有参数
  pop()   //返回值是剪切掉的数组最后一位, pop里面是没有参数的
  倒序
  reverse() //倒序的功能  //返回值是 - 
  增减(剪切/替换/添加) 重点
  splice()  //splice(1,1); //从下标为1,剪切1位 
            //splice(1,2,3); //从1位置删除2位,再把3添加进删除的位置;
            //三个参数,(开始项的下标,剪切长度,在删除的位置前添加多个数据-以逗号隔开)
            // 第三个参数 - 要看做在xxx之前添加;
  sort();   //正负数分开,绝对值升序排序; //-1,-5, 0, 2, 6  //负号的ascii码是45,比数值ascii小,所以排在前面;
            //字母升序排序, //a, b, d, x, y, z
            //首位ascii排序: //27, 49, 5, 7  //相当于比较 2,4,5,7
        //返回值是 - 排序以后的数组;
            //sort排序原理: 按照首位Ascii码的整数值来排序, 会出错;
        //自定义排序比较函数: // 必须有参数a, b  //必须有返回值
          // 负值-a小于b,a排前面(升序的时候不动); 
          // 正值-a大于b,b排前面;  
						//正值交换
						//赋值和0并不狡猾
          // (0, 保持不动;可以任意归到正值或负值里面)
          //顺序为冒泡排序法, arr = [27, 49, 5, 7]; 27跟49, 跟5, 跟7逐一比较,小的排到前面去;然后49跟后面的比较;最后是5跟7比较;
          //sort(function(a,b){return a - b; })
        //随机排序怎么排

笔试题:
  var arr = ['a','b','c','e'];
  实现在e的位置,添加d,用两种方式实现.
    arr.splice(3,0,'d');
    arr.splice(-1,0,'d');
  实现自定义的数组排序:
    sort(function(){
      return a - b;   //返回 a-b,正值,负值或0; //升序排
      return b - a;   //降序排 //选择其中一个排序   
    })
    sort(function(){
      if(a > b){
        return 1;
      }else{
        return -1;
        // 如果是小于或等于,return -1, 因为小于或等于相当于不用换位置;
      }
    });
  数组随机排序怎么排?
    // Math.random() //返回值是0到1之间,开区间的浮点小数;
    var arr = [1,2,3,4,5];
    arr.sort(function(a,b){
      return Math.random() - 0.5;   //随机返回正值或负值
      
    });
自己实现push()方法
自己实现unshift方法:
  用splice(0,0,xxx);
自己实现splice - 实现负值传入定位
  var arr = ['a','b','c','e'];
  function splice(arr, index){
      return index +=  index >= 0 ? 0 : arr.length;
  }
  var ind = splice(arr, -2);
  console.log(ind);
作业 数组
1. 用splice重写数组原型上的unshift方法,命名为unshift;
2. 请按照字节数排序下列字符串

数组2

数组操作2,排序

重点笔试题:
// GO ={
// getName: undefined -> fun(){con(5)} -> fun(){con (4)}
// Foo: function Foo(){}
//}

  //笔试题 综合性题
  function Foo(){
  	getName = function(){ //这里声明了一个伪全局变量, 只有Foo执行的时候才生效;
  		consolelog(1);
  	}
  	return this;		
  }
  Foo.getName = function(){	 // Foo是一个函数对象, 这里借用Foo在上面挂了getName的属性, 和.length一样; //只有Foo.getName能访问到; 不影响构造函数本身;
  	console.log(2);
  }
  Foo.prototype.getName = function(){	//原型上放了getName方法
  	console.log(3);
  }
  var getName = function(){		//全局变量, 执行的时候赋值了函数体
  	console.log(4);
  }
  function getName(){		//getName函数声明
  	console.log(5);
  }
  // Foo.getName();	//2
  // getName();			//4
  // Foo().getName();	//1
  // getName();		//1
  // new Foo.getName(); //2 //new 2  //.的优先级比new高, 所以先执行后面的;
  // new Foo().getName();	//3 //()优先级最高,而new Foo()是在一起的,所以先声明了一个对象, 然后对象调用this.getName方法; //对象里没有,所以到原型链上去找,找到了prototype上面的getName方法;
  // new new Foo().getName(); //3 同上一个执行的, 后面执行了输出2,然后前面加了new, 所以是new 2, new一个字面量没意义;   
  // 2 4 1 1 2 3 3
  // 字符优先级的图片
  // 括号优先级最高, 如果有new Fun() 则是连载一起的; Foo()则先执行;
  // .的优先级次之;

数组方法2: (新建一个新的数组来访问)
.concat() //合并两数组,返回值是新数组 //var str = arr1.concat(arr2); //原来数组不变;
.toString() //把数组放回成逗号分隔的字符串;
.slice(start,end) //从给定下标截取数组, [前开后闭区间) //若不给则从第一个截取到最后, 拷贝一份数组
// slice(1,2); - 返回从开始下标截取,到结束下标之前的中间部分
// slice(); - 如果不填,则返回一份复制圆数组
// slice(1); - 只填开始下标,截取到最后;
// slice(-3,-1); - 可用负参数; //返回从-3下标开始截取,到-1下标之前的部分
.join(分隔符) //数组转字符串
//就是把数组的元素放入一个字符串,参数就是分隔符, ‘,’ ’ ’ ’ - ‘,取以上分隔符都可以
//返回值是生成的字符串;
.split(分隔符,截取长度) //字符串转数组,可设置转换后数组的长度
//可以吧字符串变成数组,参数就是区分的分隔符; 返回值是生成的数组;
//arr.split(’-’,3); //以-作为分隔符,同时只截取3位;

类数组
- 类数组是类似于数组的对象,它的原型是Object.prototype,不是Array的原型;
- 如果length属性为4, 则必须要有0到3的属性对, 若缺了会显示empty x n的提示;
- 类数组并不是数组;
- 典型的类数组 - arguments;
- 类数组包含两个部分,第一是要有属性:值,第二是要有length属性
类数组的应用:
自定义一个类数组, 然后自定义添加属性和方法,非常灵活;
如给它添加数组的push方法; //‘push’: Array.prototype.push,
把对象大括号变成数组的方括号的方法?
给类数组添加属性, ‘splice’: Array.prototype.splice,
给加上length属性
类数组转换成数组的方法:
Array.prototype.slice.call(arguments); //返回值是目标数组

深度封装typeof的方法:- 能区分array,null,object

  function myTypeof(val){
    var type = typeof(val);
    var res = {
      "[object Array]":'array',
      '[object Object]':'object',
      '[object Number]':'object number',
      '[object Boolean]':'object boolean',
      '[object String]':'object String'
    }
    var toStr = Object.prototype.toString;
    if(val === null){
      return 'null';
    }else if(type === 'object'){
      var key = toStr.call(val);
      return res[key];
    }else{
      return type;
    }
  }
  myTypeof('2');

数组去重方法
// 数组去重, 最优算法, 答案;
  Array.prototype.unique = function (){
        //实现方法,判断{}中,有没有这个属性, 来添加
  			//只有{}中不存在这个属性的时候才添加, 同时push一次;
        var temp = {},
            newArr = [];
        for(var i = 0; i < this.length; i++){
          if(!temp.hasOwnProperty(this[i])){
            temp[this[i]] = this[i];
            newArr.push(this[i]);
          }
        }
        return newArr;
      }
  	var arr = [1,2,3,1];
  	// console.log(arr.unique());

字符串去重实现:
  String.prototype.unique = function(){
    var temp = {},
        newStr = '';
    for(var i = 0; i < this.length; i++){
      if(!temp.hasOwnProperty(this[i])){
        temp[this[i]] = this[i];
        newStr += this[i];
      }
    }
    return newStr;
  }
  var strr = '112233';
  console.log(strr.unique());

百度外卖算法题 - 重要笔试题
  //找出一串字符中的, 只出现一次的第一个字符;
  //百度外卖笔试题
  //考点,利用对象实现算法功能
  var str = 'jfklajssklfbsnlfnklcleklnlslklkfnlkenflgg'; //就是找出a
  function test(str){
    //思路, 用对象的形式, 顺序加入并计数, 遍历对象返回第一个值为1的字母
    var temp = {};
    for(var i = 0; i < str.length; i++){
      if(!temp.hasOwnProperty(str[i])){
        temp[str[i]] = 1;
      }else{
        temp[str[i]]++;
      }
    }
    for(var char in temp){
      if(temp[char] == 1){
          return char;							
      }
    }
  }
  // console.log(test(str));

//闭包笔试题
function test(a, b, c){
  var d = 0;
  this.a = a;
  this.b = b;
  this.c = c;
  function e(){
    d++;
    console.llog(d);
  }
  this.f = e;
}
var test1 = new Test();
test1.f();
test1.f();

test2.f();
// 1,2,1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值