807笔记(for-in,排序算法,数组扩展方法)


数组排序(续)

reverse:将数组元素逆序
    /*  reverse:将数组元素逆序
     返回值:逆序后的数组
     是否影响原数组:是 */

    var arr = [4, 2, 100, 3, 5]
    var res = arr.reverse()
    console.log(arr)  //[5,3,100,2,4]
    console.log(res)  //[5,3,100,2,4]
sort:将数组元素按照字符串的编码进行从小到大的排列
/*  sort:将数组元素按照字符串的编码进行从小到大的排列
     返回值:排序后的数组
     是否影响原数组:是 */
     
    var arr = [4, 3, true, 100, 5]
    var res = arr.sort()
    console.log(arr)   // [100,3,4,5,true]
    console.log(res)    // [100,3,4,5,true]
  • 扩展(数字的大小排列)
    sort(function (a, b) { return a - b })  //按数字从小到大排列
    sort(function (a, b) { return b - a })   //按数字从大到小排列

    var arr1 = [23, 4, 5, 1, 3, 51, 43, 23]
    var res1 = arr1.sort(function (a, b) { return a - b })
    console.log(arr)   // [1,3,4,5,23,23,43,51]
    console.log(res)   // [1,3,4,5,23,23,43,51]
toString():将数组转换为字符串;
/*  toString():将数组转换为字符串
         返回值:转换后的字符串(以逗号分隔)
         是否影响原数组:否 */
         
    var arr = [2, 3, 45, 7, true]
    var res = arr.toString()
    console.log(arr)   // [2,3,45,7,true]  是个数组
    console.log(res)   //2,3,45,7,true  转换后的字符串
  • toString() 还可以用于简单的变量转成指定进制的字符串
// toString(进制数)

    var iNum = 48;
    console.log(iNum.toString(2))   //1011000
    console.log(iNum.toString(8))   //130
    console.log(iNum.toString(16))   //58
join(连接符):将数组转为以指定连接符连接的字符串
    /*  join(连接符):将数组转为以指定连接符连接的字符串,连接符要用引号包起来
         返回值:转换后的字符串
         是否影响原数组:否 */
         
    var arr1 = [4, 2, 36, 5, 4]
    var res1 = arr1.join('*')
    console.log(arr1)   // [4, 2, 36, 5, 4]
    console.log(res1)   // 4*2*36*5*4

-----------------------------
//不要连接符用空引号
    var arr1 = [4, 2, 36, 5, 4]
    var res1 = arr1.join('')
    console.log(arr1)   // [4, 2, 36, 5, 4]
    console.log(res1)   // 423654
    

for-in 循环

可以遍历数组,也可以遍历对象

遍历对象只能用for-in,不能用for循环

语法:

for(变量 in 数组/对象){
    //js语句
}
//遍历数组
var arr = [1, 2, 4, 5, 63, 32, 22]
    for (var i in arr) {
        console.log(i + "=>" + arr[i])    //i是下标
    }

-----------------------
//遍历对象
    var obj = {
        name: '李四',
        age: 18,
        sex: '男',
    }
    for (var key in obj) {
        console.log(key + "=>" + obj[key])   //key是对象的属性名,这里只能使用对象名['属性']的方式读取对象里的内容,不能用对象名.属性,否则会认为key是对象里的属性,永远是undefined
    }

排序算法

冒泡排序,选择排序,插入排序…

冒泡排序

把相邻的两个数组元素做个比较,符合条件就交换位置

    var arr = [9, 6, 15, 4, 2]
    for (var i = 1; i < arr.length; i++) {   //外层循环是遍历的次数
        for (var j = 0; j < arr.length; j++) {    //内层循环是比较的次数
            if (arr[j] > arr[j + 1]) {
                //交换位置,借助第三方
                var t = arr[j]
                arr[j] = arr[j + 1]
                arr[j + 1] = t
            }
        }
    }
    
------------------------------------    
    var arr = [9, 6, 15, 4, 2]
    for (var i = 1; i < arr.length; i++) {
        for (var j = arr.length - 1; j >= i; j--) {
            if (arr[j] < arr[j - 1]) {
                var t = arr[j - 1]
                arr[j - 1] = arr[j]
                arr[j] = t
            }
        }
    }

选择排序

依次取出第一个元素,和后面所有元素比较,符合条件就交换位置

    var arr = [9, 6, 15, 4, 2]
    for (var i = 0; i < arr.length - 1; i++) {   //外层是比较的轮数
        for (var j = i + 1; j < arr.length; j++) {
            //内层是每一轮比较的次数
            if (arr[i] > arr[j]) {
                var t = arr[i]
                arr[i] = arr[j]
                arr[j] = t
            }
        }
    }

插入排序

从第二个数开始往前比,比它大就往后排,以此类推进行到最后一个数

  let arr = [2, 1, 5, 4, 8, 6];
  function insert(arr) {
    //定义一个新数组,用来存储抓在手里的牌,开始先抓一张牌进来。
    let handle = [];
    handle.push(arr[0]); //将原数组的第一项放进来,当做是手里的牌
    //从第二项开始依次抓牌,一直把台面上的牌抓光
    for (let i = 1; i < arr.length; i++) {
      //A是新抓的牌
      let A = arr[i];
      //用新抓的牌和手里的牌依次比较(从后往前比较)
      for (let j = handle.length - 1; j >= 0; j--) {
        //B是手里的牌
        let B = handle[j];
        //如果新牌比旧牌大,就放在旧牌的后面,停止循环
        if (A > B) {
          handle.splice(j + 1, 0, A);
          break;  //插入之后,比较结束,进行下一次比较
        }
        //如果已经比到第一项,就直接把手里的牌放到最前面
        if (j == 0) {
          handle.unshift(A);
        }
      }
    }

    return handle;
  }

  arr = insert(arr);
  console.log(arr);

值传递和引用传递

简单数据类型(属于值传递):字符串,数值,boolean布尔,undefined,null

复杂数值类型(属于引用传递):function,array,object(主要)

简单数据类型在栈里存放的是值;复杂数值类型在栈里存放的是二进制的地址,地址指向堆(可以有不同的堆),堆里存放的才是具体的值

//简单变量的值传递
var a = 3;
    var b = a;
    a = 4;
    console.log(a, b)  //4,3

//复杂变量的引用传递:修改内容会一起变

    var arr = [1, 2, 3]
    var list = arr  //传递的是地址
    arr[0] = 5
    console.log(arr, list)   //[5,2,3],[5,2,3], arr修改list也会得到新的修改的内容

    var obj = { name: '张三', age: 18, }
    var obj1 = obj
    obj.name = '李四'
    console.log(obj, obj1)  //{ name: '李四', age: 18, },{ name: '李四', age: 18, }

删除数组中的所有元素

	var arr = [0, 2, 3, 5, 6, 7, 11]
    while(arr.length){
        arr.shift()
    }
    console.log(arr)   //[]

ES5扩展

严格模式:在严格的条件下运行代码

启动严格模式:”use strict”

注意:只能加在作用域开头部分,如果是函数,就加在函数作用域的开头部分

有两种模式
1、全局开启
    "use strict"
    function test() { }
    
2、针对某个函数开启
    function test() {
        "use strict"
    } */

特点:

1、严格模式下全局变量必须先声明才能使用
    n = 10
    console.log(n)   //  10

    'use strict'
    n = 10
    console.log(n)   // n is not defined

2、函数参数不能重名
    function test(x, x, y) {
        console.log(arguments)
        console.log(x)
        console.log(y)
    }
    test(10, 20, 30)   //10,20,30   20  30

    'use strict'
    function test(x, x, y) {
        console.log(arguments)
        console.log(x)
        console.log(y)
    }
    test(10, 20, 30)   //会报错
	var b = null
    function fn() {
        a = 3
    }
    fn()
    alert(a)    //3
	
	var b = null
    function fn() {
        'use strict'   //函数内定义的变量就只能是局部变量了
        a = 3
    }
    fn()
    alert(a)    //报错

数组的扩展方法

都不改变原数组

indexOf, lastIndexOf, forEach, map, filter, reduce

indexOf(元素,start的位置)
    // indexOf(元素,start的位置)
    // 作用:查找元素在数组中第一次出现时下标的位置,如果没有返回-1
    // 返回值:下标

    var arr = [1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 2, 3, 4, 5]
    var res=arr.indexOf(2,3)
    console.log(res)   //5
lastIndexOf(元素)
/*     lastIndexOf(元素)
    作用:查找元素在数组中最后一次出现时下标的位置,如果没有返回-1
    返回值:下标 */

    var arr = [1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 2, 3, 4, 5]
    var res=arr.lastIndexOf(2)
    console.log(res)   //11

    // 如果指定第二个参数start,则在指定位置从后向前搜索
    //lastIndexOf(元素,start)

    var arr = [1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 2, 3, 4, 5]
    var res=arr.lastIndexOf(2,6)
    console.log(res)   //5
forEach
/*  遍历数组,和for循环是一样的
        arr.forEach(function (value, index, array) {
        })
    */

    var arr = [1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 2, 3, 4, 5]
    arr.forEach(function (value, index, array) {
        console.log(value, index, array)
    })

807笔记(for-in,排序算法,数组扩展方法)

map
/* 映射 遍历数组返回一个新数组
        map(function (value, index, array) {
            return ...  //返回一个新数组
        }) */

    var arr = [1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 2, 3, 4, 5]
    var newArr = arr.map(function (value, index, array) {
        return value * 2
        //return的值是新数组的数组元素
    })
    console.log(newArr)  // [2,4,6,8,10,,4,6,8,10...]
filter
/* 过滤
    filter(function (value, index, array){
        return 过滤条件
    }) */
    var arr = [1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 2, 3, 4, 5]
    //过滤数组中值大于4的数组元素,返回过滤后的数组
    var newArr = arr.filter(function (value, index, array) {
        return value >= 4
    })
    console.log(newArr) //[4,5,4,5,6,4,5]
reduce
/* 累计求和
    reduce(function (累加器, 当前值, 索引, 数组) ,累加器的初始值{
        return...  //返回的是累加器的值
    }) */

    var arr = [1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 2, 2, 3, 4, 5]
    //reduce有两个参数
    var sum = arr.reduce(function (s, value, index, array) {
        return s + value
    }, 0)
    console.log(sum)   //51

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/279418.html

(0)
上一篇 2022年8月8日
下一篇 2022年8月8日

相关推荐

发表回复

登录后才能评论