js笔记(暑假7)

70.数组
1.数组的定义方式:
(1)数组字面量(推荐使用)
(2)系统提供的构造方法
所以数组能使用的一切方法都来源于Array.prototype
还有数组没什么能报错的地方(除非是引用了什么自己没有的方法),最多是undefined,就像数组没有第10位那,那arr[10]返回的就是undefined
因为javascript里的数组是基于对象的,数组其实就是一种特殊的对象,和对象在本质上没什么太大的区别    ,可以直接赋值arr[10] = 'abc',若是原本数组是空的,那经过这条语句长度就为11了。
例1:var arr = [1,2,,,,3,4];
例2:var arr = new Array(1,2,3,3,4);
两种定义方式的唯一区别:就是使用构造方法只传进一个参数的时候,这个时候这个数字代表长度而不是值,由于这个问题就引发了另一个问题
例3:
    var arr = new Array(10);               //arr就是长度为10的稀松数组,这里的10代表长度。
    var arr1 = [10];                             //arr1就是只含有一个元素10的数组
例4:数字非法,长度不能是小数。
    var arr = new Array(10.2);


71.数组的方法:
此处三目运算符第10分开始简单介绍ECMAjavascript,DOM和BOM
ECMAjavascript  :javascript作者创建的js
DOM :也算是他创建的但不完全,只是他给出了一系列规则,通过javascript可以操作HTML
BOM:通过javascipt可以操作浏览器的
1.改变原数组(无论es3,es5,es6凡事能改变原数组的就这7个):push pop unshift,shift,sort,reverse,splice
(1)push,向数组中传数
var  arr = [];
例1:arr.push(2)                    //由空变为[2]
例2:arr.push(4)                    //由[2]变为[2,4]
例3:arr.push(3,3,5)              //由[2,4]变为[2,4,3,3,5];
例4:将arr.push()进行重写下面这个可以覆盖系统的push
    var arr = [];
    Array.prototype.push = function (){
        for(var i = 0 ; i < arguments.length; i++)
            this[this.length] = arguments[i];                              //这时还不知道是谁调用的push函数,所以用this代替,谁调用,this就代表哪个数组。
        }
        return this.length;
    }
(2)pop将数组中最后一位剪切出来,并且不用向里传递参数,传了也白扯
var arr = [2,3,4]
例1:var  num = arr.pop();                                               //结果num = 4,arr = [2,3];
(3)unshift : 在数组第一位添加东西
var arr = [2,3]
例1:arr.unshift(0)                                                          //arr = [0,2,3]
例2:arr.unshift(0,-1)                                                      //arr = [0,-1,2,3]
(4)shift:将数组第一位剪切出去
例1:arr.shift()                                                                //arr = [2,3]
(5)reverse:将数组逆转
例1:
var arr = [1,2,3,4];
arr.reverse()
//执行结果arr = [4,3,2,1]
(6)切片方法:arr.splice():从第几位开始,截取多少的长度,在切口处添加新的数据。splice函数传进去的第一位参数长度是这样实现的:    pos += pos > 0 ? 0 : this.length;
例1:
    var arr = [1,1,2,2,3,3];
    arr.splice(1,2);
执行函数返回结果是被剪切的部分[1,2],但是执行后arr的值为[1,2,3,3];
例2:
    var arr = [1,2,3,5];
    arr.splice(3,0,4);
执行结果为arr = [1,2,3,4,5];
例3:数组一般的方法里都可以带负数,负数是指倒数第几位
    var arr = [1,2,3,4];
    arr.splice(-1,1);
执行结果返回4
(7)sort方法使用:
a.必须写俩形参
b.根据自己定义排序规则,然后看返回值三种情况:
1)当返回值为负数时,那么前面的数放在前面
2)当返回值为正数时,那么后面的数放在前面
3)当返回值为0时,不动
例1:
    var arr = [2,10,20,13,4,8,9];               //下面自己定义了规则使arr进行了升序排序(也是冒泡排序思想)
    arr.sort(function(a,b){
        if(a > b){
            return 1;
        }
        else{
            return -1;
        }
    })
例2:对例1进行简化(返回 a - b 就是升序,返回 b - a 就是降序)
    var arr = [2,10,20,13,4,8,9];
    arr.sort(function(a,b){
        return a - b;                        //返回a - b就是要是a > b -->a - b > 0,a < b -- > a - b < 0, 因为sorts里的这个函数就是根据返回值的正负来进行排序的,所以升序直接写a - b就行了
    })
例3:给一个有序的数组乱序
    var arr = [2,3,4,5,6,8,9];
    arr.sort(function(a,b){
        return Math.random() - 0.5;
    })
例4:给一个对象按照年龄升序排序
    var cheng = {
        name : "cheng",
        age : 18,
        sex : 'male',
        face : 'handsome',
    }
    var deng = {
        name : "deng",
        age : 40,
        sex : undefined,
        face : 'amazing',
    }
    var zhang ={
        name : "zhang",
        age : 20,
        sex : 'male'
    }
    var arr = [deng,cheng,zhang];
    arr.sort(function (a,b){
        return a.age - b.age;
    })
例5:按照字符串长度升序排序
    var arr = ['abc','bcd','cccc','dddd','klfajlgjal','fdhak' , 'fhakhfaklfho'];
    arr.sort(function(a,b){
        return a.length - b.length;
    })
例6:按照字节长度升序排序
    function retByte(str){
        var num = str.length;
        for(var i = 0 ; i < str.length; i++){
            if(str.charCodeAt(i) > 255){
                num ++;
            }
        }
        return num;
    }
    var arr = ['gsgsa邓','bb邓','cfag邓','d邓','你邓','我邓','大家邓'];
    arr.sort(function(a,b){
        return retByte(a) - retByte(b);
    })
2.不改变原数组:
(1)concat拼接
例1:在控制台打arr.concat(arr1)结果就是将两个数组拼接起来了
    var arr = [1,2,3,4,5];
    var arr1 = [6,7,8,];
(2)toString(()数组将这个方法进行了重写,就是将数组中元素变为字符串形式
例1:
    var arr = [1,2,3,4,5];
    arr.toString()               //返回结果"1,2,3,4,5"
(3)slice
例1:当slice中有两个参数, 表示从该位开始截取,截取到该位;
    var arr = [1,2,3,4,5];
    var newArr = arr.slice(1,3);             //newArr = [2,3],因为不改变数组,所以这个方法关注的就是返回值,一定要用变量去接受返回值。
例2:当slice中有一个参数时,表示从第几位开始,一直截取到最后,也可以是负数,像下面这个例子arr.slice(-2)也是同样的效果
    var arr = [1,2,3,4,5];
    var newArr = arr.slice(3);               //newArr = [4,5]
例3:当slice中不写参数就是整个截取
    var arr = [1,2,3,4,5];
    var newArr = arr.slice();                  //newArr = [1,2,3,4,5]
(4)join用法就是数值调用join里面添加参数就是将数组元素用参数连接起来并返回,最好是字符串类型的。
         split按照什么方法拆分为数组,和join可逆,split是字符串方法不是数组的
例1:arr.join("~")
    var arr = [1,2,3,4,5];               //控制台打印arr.join("~")返回"1~2~3~4~5"
例2:利用split拆分,就是按照什么方式连,我就能按照什么方式给你拆了
    var arr = [1,2,3,4,5];
    var str = arr.join("-");             // "1-2-3-4-5"
    str.split("-");                           //["1", "2", "3", "4", "5"]
    str.split("4");                          //["1-2-3-", "-5"],按4拆就是4没了。
例3:给出一系列字符串,将其连接到一起,最好不要用空串一个个去加,因为字符串放在栈中,栈先进后出,利用起来很不方便。所以利用数组
因为数组是一个散列存储结构,是一个堆内存,所以将字符串放在数组中,然后数组利用散列算法去寻找它们,再利用join连接是比较高效率的
        var str = 'alibaba';
        var str1 = 'tencent';
        var str2 = 'baidu';
        var str3 = 'toutiao';
        var str4 = 'wangyi';
        var str5 = 'xiaowang';
        var str6 = 'nv';
        /*散列*/
        var arr = [str,str1,str2,str3,str4,str5,str6,str];
        console.log(arr.join(""));                                  //结果为alibabatencentbaidutoutiaowangyixiaowangnvalibaba
        console.log(arr.join());           //不传,默认是逗号连接。结果为alibaba,tencent,baidu,toutiao,wangyi,xiaowang,nv,alibaba
 

猜你喜欢

转载自blog.csdn.net/LFY836126/article/details/81840630