JS入门到精通详解(4)

递归函数(了解)

自己调用自己的过程。
  1. 本质:循环

  1. 三要素:从哪里开始,到哪里结束、步长

建议在循环嵌套不确定层数时,使用递归函数。
// 下面这个代码就是一个最简单的递归函数
// 在函数内部调用了自己,函数一执行,就调用自己一次,在调用再执行,循环往复,没有止尽
function fn() {
  fn()
}
fn()

练习

  1. 1 + 2 + 3 + …… + 100的和

  1. n!

  1. 斐波那契数列

  1. 输出10个Hello world

对象数据类型

创建对象数据类型

  1. 如何创建对象?

  • 字面量方式: {key: value,key: value}

  • 构造函数方式: new 构造函数名()

  1. 构造函数的语句:

function 构造函数名-大驼峰命名([参数]){
    //属性
    this.属性名 = 属性值;
    //方法
    this.方法名 = function(){
        //功能
    }
}

对象数据类型的操作(增删改查),两种语法

  1. 对象.属性 对象.方法()

  1. 对象['属性'] 对象'方法'

for in 循环遍历对象(出来的是一个一个的东西(属性))

for(循环变量 in 对象){
    语句组;
}
//注:循环变量不能赋值,循环变量不能赋值,循环变量不能赋值!

数组数据类型

什么是数组? 存储一组或一系列数据的容器。

创建数组数据类型

  1. 字面量创建方式: [5] 开辟了一个空间,里面放着一个5

  1. 构造函数方式: new Array(5)里面开辟了五个空间,里面啥也没有

数组的length属性

  1. length : 表示数组的长度

数组的索引概念

下标:可以唯一标识一个数组空间的索引号。 (最小下标:0)(最大下标:长度 - 1)

for循环遍历数组

  1. 数组名[下标]

  1. 遍历数组:一个一个处理(循环)

不同数据类型的存储

堆和栈空间存储数据

  1. 基本数据类型的数据属于值传递

  1. 复合数据类型的数据属于引用传递(地址传递)

数组基本操作案例

冒泡排序

(相邻)的两个数进行比较,符合条件,交换位置。
/*
    冒泡排序:核心-相邻的两个数进行比较,符合条件,交换位置。
    小到大
    从前到后
    9   6    6    4    2
    6   9    4    2    4
    15  4    2    6
    4   2    9
    2   15

    */
    //声明数组
    var arr = [9,6,15,4,2];
//轮数
function fnBubbleSortFromSmallToBig(arr){
    for(var i = 1;i < arr.length;i ++){
        //从数组中取元素---遍历
        for(var j = 0;j < arr.length - i;j ++){
            if(arr[j] > arr[j + 1]){
                var t = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = t;
            }
        }
    }
    return arr;
}
function fnBubbleSortFromBigToSmall(arr){
    for(var i = 1;i < arr.length;i ++){
        //从数组中取元素---遍历
        for(var j = 0;j < arr.length - i;j ++){
            if(arr[j] < arr[j + 1]){
                var t = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = t;
            }
        }
    }
    return arr;
}

选择排序

依次取一个元素 与 剩下所有元素 进行比较,符合条件,交换位置 。

数组常用方法

/*
    选择排序:核心-依次取一个元素与剩下所有的元素进行比较,符合条件,交换位置。
    小到大
    从前到后
    9   6    6    4    2
    6   9    4    2    4
    15  4    2    6
    4   2    9
    2   15

    */
function fnSelectFromSmallToBig(arr){  
    //遍历
    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;
            }
        }
    }
    return arr;
}

function fnSelectFromBigToSmall(arr){  
    //遍历
    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;
            }
        }
    }
    return arr;
}

数组常用方法(增删改排影响原数组)

  1. unshift(元素,元素,……) : 前增

  • 作用:在数组前面添加元素。

  • 返回值: 返回新增后数组的长度

  • 是否影响原数组: 是

//声明一个数组
var arr = [5,6,7,8,9];
//在前面新增一个元素
console.log(arr.unshift(true,[1,2,3],false)); //8
console.log(arr); //[true,[1,2,3],false,5,6,7,8,9]
  1. push(元素,元素,……) :后增

  • 作用:在数组后面添加元素。

  • 返回值: 返回新增后数组的长度

  • 是否影响原数组: 是

//声明一个数组
    var arr = [5,6,7,8,9];
//在前面新增一个元素
console.log(arr.push(true,[1,2,3],false)); //8
console.log(arr); //[5,6,7,8,9,true,[1,2,3],false]

  1. shift() : 前删

  • 作用:删除数组中第1个元素

  • 返回值: 被删除的元素

  • 是否影响原数组: 是

//声明一个数组
var arr = [5,6,7,8,9];
console.log(arr.shift()); //5
console.log(arr); //[6,7,8,9]

//声明一个数组
var arr = [5,6,7,8,9];
// console.log(arr.shift()); //5
// console.log(arr); //[6,7,8,9]

//如何删除全部?
while(arr.length){ //0
    arr.shift();
}
console.log(arr);
  1. pop() : 后删

  • 作用:删除数组中最后一个元素

  • 返回值: 被删除的元素

  • 是否影响原数组: 是

 //声明一个数组
var arr = [5,6,7,8,9];
console.log(arr.pop()); //9
console.log(arr); //[5, 6,7,8]

  1. splice(start,delLength,newEle,newEle,……)

start: 从哪个下标位置开始
delLenght: 删除几个元素
newEle : 新元素
  • 作用:在数组的任意位置进行增、删、改的操作。

  • 返回值: 被删除的元素数组

  • 是否影响原数组: 是

//声明一个数组
var arr = [5,6,7,8,9];
console.log(arr.splice(1)); //[6, 7, 8, 9]
console.log(arr); //[5]

//声明一个数组
var arr = [5,6,7,8,9];
console.log(arr.splice(1,2)); //[6, 7]
console.log(arr); //[5,8,9]

//声明一个数组
var arr = [5,6,7,8,9];
console.log(arr.splice(1,2,true,[1,2],false)); //[6, 7]
console.log(arr); //[5,true,[1,2],false,8,9]

//声明一个数组
var arr = [5,6,7,8,9];
console.log(arr.splice(1,0,true,[1,2],false)); //[]
console.log(arr); //[5,true,[1,2],false,6,7,8,9]

  1. slice(start,end)

start : 从哪里开始(包含)
end : 到哪里结束(不包含)
  • 作用:截取数组中指定范围的元素。

  • 返回值: 被截取到的元素数组

  • 是否影响原数组: 否

//声明一个数组
var arr = [5,6,7,8,9];
console.log(arr.slice(1)); //[6,7,8,9]
console.log(arr); //[5,6,7,8,9]

//声明一个数组
var arr = [5,6,7,8,9];
console.log(arr.slice(1,4)); //[6,7,8]
console.log(arr); //[5,6,7,8,9]

// //声明一个数组
// var arr = [5,6,7,8,9];
// console.log(arr.slice(4,1)); //[]
// console.log(arr); //[5,6,7,8,9]

//声明一个数组
var arr = [5,6,7,8,9];
console.log(arr.slice(-4,-1)); // [6, 7, 8]
console.log(arr); //[5,6,7,8,9]

  1. concat(newEle,newEle,……)

  • 作用:将新元素拼接到指定数组的末尾。(如果新元素是一个数组,则去掉最外层的[],将里面的内容进行拼接)

  • 返回值: 拼接后的新数组

  • 是否影响原数组: 否

//声明一个数组
var arr = [5,6,7,8,9];
console.log(arr.concat(-4,[1,[2,3]],-1)); //[5, 6, 7, 8, 9, -4, 1, [2,3], -1]
console.log(arr); //[5,6,7,8,9]

复(面试题:至少写两种复制数组的方法)

function copyArr(arr){
    return arr.slice(0);
}
function copyArray(arr){
    return arr.concat();
}

function cloneArr(arr){
    var list = [];
    for(var i = 0,len = arr.length;i < len;i ++){
        list[i] = arr[i];
    }
    return list;
}

  1. reverse() : 逆序排

  • 作用:将数组元素逆序存放

  • 返回值: 逆序后的数组

  • 是否影响原数组: 是

var arr = [5,6,7,8,9];
console.log(arr.reverse()); //[9,8,7,6,5]
console.log(arr); //[9,8,7,6,5]
  1. sort() : 按编码排

  • 作用:将数组中的元素按字符编码从小到大排序

  • 返回值: 排序后的数组

  • 是否影响原数组: 是

sort(function(a,b){return a - b;}) : 按数字从小到大排序
sort(function(a,b){return b - a;}) : 按数字从大到小排序
var arr = [3,2,10,1,100,20];
console.log(arr.sort()); //[1,10,100,2,20,3]
console.log(arr); //[1, 10, 100, 2, 20, 3]

  1. toString() : (面试题:不是数组的方法,是Object对象的方法,数组继承到的方法)

  • 数字.toString(2-36) : 将数字转为指定进制的字符串

var i = 10;
console.log(i.toString(2)); //1010
console.log(i.toString(8)); //12
console.log(i.toString(16)); //a
  • 数组.toString() : 将数组转为字符串

var arr = [1,2,3,4];
console.log(arr.toString()); //'1,2,3,4'
console.log(arr); //[1,2,3,4]
  1. join('连接符')

  • 作用:将数组转为以指定连接符连接成的字符串。

  • 返回值: 字符串

  • 是否影响原数组: 否

var arr = [1,2,3,4];
console.log(arr.join('+')); //'1+2+3+4'
console.log(arr); //[1,2,3,4]

ES5新增(都不会影响原数组)

  1. indexOf(元素,start): 查找元素在数组中第一次出现的下标位置,如果没有,则返回-1(逻辑是查找值,返回下标)

 var arr = [1,2,3,1,2,3,2,4,2,1];
console.log(arr.indexOf(2,2)); //4
console.log(arr.indexOf(5)); // -1
  1. lastIndexOf(元素,start) : 查找元素在数组中从右向左查找第一次出现的下标位置,如果没有找到,返回 -1

var arr = [1,2,3,1,2,3,2,4,2,1];
console.log(arr.indexOf(2,2)); //4
console.log(arr.indexOf(5)); // -1
console.log(arr.lastIndexOf(2)); //8
console.log(arr.lastIndexOf(2,2)); //1
console.log(arr.lastIndexOf(2,5)); //4
  1. forEach(function(value,index,array){}) : 遍历数组

  1. map(function(value,index,array){return ...}) : 遍历数组,返回数组

  1. some(类似或)(function(value,index,array){return ...}) : 检测数组中每一个元素,如果有一个元素的条件返回true,则直接退出循环,返回true; 如果所有元素都返回false时,最终返回false

  1. every(类似与)(function(value,index,array){return ...}) : 检测数组中每一个元素,如果有一个元素的条件返回false时,则直接退出循环,返回false。 如果所有元素都返回true时,最终返回true.

  1. filter(function(value,index,array){return ...}) : 过滤-条件,返回数组

  1. reduce(function(prev,next,index,array){return ...}) : 归并

var arr = [99,100,89,59,98];
var sum = arr.reduce(function(prev,next){
    console.log(prev,next);
    // prev = 99  next = 100
    //prev = 199 next = 89
    // prev = 288 next = 59
    //prev = 347  next = 98
    //prev = 455
    return prev + next;
})
alert(sum);

var sum = arr.reduce(function(prev,next){
    console.log(prev,next);
    // prev = 0  next = 99
    //prev = 99 next = 89
    return prev + next;
},0)
alert(sum);

9.find((value,index,array){return 条件}) : 找到满足条件的第一个元素返回来,如果没有满足条件的,则返回undefined

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值