js复习-day2

目录

预解析

解析了 var 关键字

解析了声明式函数

预解析的无节操

预解析中的重名问题

对象

创建对象

对象的基本操作

对象内两种语法的区别

对象的遍历

数据类型的存储

基本数据类型

复杂数据类型(地址数据类型 / 引用数据类型)

数组数据类型

数组的创建

数组的操作

数组的常用方法1(会改变原始数组)

数组常用方法2(不会改变原始数组)

数组常用方法3(不会改变原始数组)

数组塌陷

数组去重


预解析

在所有代码执行之前,对代码进行通读并解释;

解析了 var 关键字

  • 会把 var 关键字声明的变量进行提前说明,但是不进行赋值
// 预解析 var 关键字步骤;
var a = 10;
// 第一步:定义了一个变量 a ;
// 第二不:将 10 赋值给变量 a ;

解析了声明式函数

  • 会把函数名进行提前声明,并且赋值为一个函数

预解析的无节操

  • 在代码中,不管 if 条件是否为 true if 语句代码里面的内容依旧会进行预解析
  • 在函数体内,return 后面的代码虽然不执行,但是会进行预解析

预解析中的重名问题

  • 当使用 var 定义变量声明式函数重名的时候,以函数为主
  • 只限于在预解析阶段,以函数为准

对象

对象数据类型 object 是 js 中的一种数据类型,是一个复杂数据类型;

创建对象

  • 自变量方式创建对象
var obj = { 键值对, ... };
  • 内置构造函数创建对象
var obj2 = new Object();

对象的基本操作

  • 点语法
// 准备一个空对象
var obj = {};
// 增
obj.name = 'jack';
obj.age = 18;
obj.gender = '男';
// 删
delete obj.name;
// 改(建唯一,修改值即实现改)
obj.gender = '女';
// 查
console.log(obj.age);
  • 数组关联语法
// 准备一个空对象
var obj = {};
// 语法
obj['name'] = 'jack';
obj['age'] = 18;
obj['gender'] = '男';
// 操作同点语法

对象内两种语法的区别

  • 对于名字的操作
  1. 符合命名规范的键名,两种语法都可以
  2. 纯数字只能使用数组关联语法
  3. 带有特殊符号的,只能使用数组关联语法
  • 和变量相关的操作
  1. 点语法,不管如何,都不能和变量产生联系,始终访问对象内的某一个准确键名
  2. 数组关联语法,[ ] 内为字符串时,准确访问该建名
  3. [ ] 内为变量时,会把变量解析成字符串,再准确访问该键名 

对象的遍历

  • for in 循环
  1. 对象内有多少个成员,执行多少次
  2. 对象名[键名]就是对象中每一个成员的值
<body>
    <script>
        var obj = {
            name: 'jack',
            age: 18,
            gender: '男'
        }
        // 遍历对象
        for (var k in obj) {
            console.log(k)
        }
        // 结果
        // name
        // age
        // gender
    </script>
</body>

数据类型的存储

复杂数据类型基本数据类型在存储上是有区别的,存储的内存空间又分为栈内存堆内存;栈内存是按序排列,堆内存是无序排列;

基本数据类型

  • 直接存储在内存中
  • 赋值的时候,是直接值的赋值
  • 改变一个变量,另一个变量不会发生变化

复杂数据类型(地址数据类型 / 引用数据类型)

  • 把数据存储在内存中
  • 把地址赋值给内存的变量里
  • 赋值的时候,是把变量内存储的地址进行赋值
  • 赋值以后,两个变量操作同一个存储空间

数组数据类型

数组是数据的组合,是一个复杂数据类型Array,里面的数据有序排列,按索引排序,从0开始,依次+1;

数组的创建

  • 字面量方式创建数组
var arr = [];
console.log(arr);
  • 内置构造函数创建数组
// 创建一个新数组
var arr = new Array();
console.log(arr)
// 创建一个长度为10的数组
var arr1 = new Array(10);
// 创建一个带数据的数组
var arr2 = new Array(10, 20, 30);

数组的操作

  • 数组的 length 属性
  1. 比原先长,用 empty 补齐
  2. 比原先短,从后面开始删除数据
  3. 和原先一样,相当于没有设置
// length 的获取
var arr = new Array();
// length 的设置
arr.length;
  • 数组的索引属性
  1. 有索引,相当于修改该索引位置的数据
  2. 没有索引,值为 length 时,相当于在数组后面追加数据
  3. 值大于 length 时,添加该索引,并用 empty 填充之间的索引
var arr = [100, 200, 300];
// 按索引获取数据
console.log(arr[1]);
// 按索引设置
arr[2] = 'hello';
  • 遍历数组
var arr = [ 100, 200, 300, 400, 500 ];
for (var i = 0; i <= arr.length; i++) {
    console.log(arr[i]);
}

数组的常用方法1(会改变原始数组)

  • push( ) 添加
var arr = [100, 200, 300];
// 在数组末尾添加一个数据
arr.push(400);
// 返回值:数组最新的长度
  • pop( ) 删除
var arr = [100, 200, 300];
// 删除数组的最后一个数据
arr.pop();
// 返回值:被删除的数据
  • unshift( ) 添加
var arr = [100, 200, 300];
// 在数组的最前面插入一个数据
arr.unshift(400);
// 返回值:数组的最新长度
  • shift( ) 删除
var arr = [100, 200, 300];
// 删除数组最前面的一个数据
arr.shift();
// 返回值:被删除的数据
  • reverse( ) 倒序
var arr = ['hello','world'];
arr.reverse();
// 返回值:['world', 'hello']
  • sort( ) 排序
var arr = [10, 20,3,13];
// 数据按位排序
arr.sort();
// => [10, 13, 20, 3]

// 把所有数据进行升序排列
arr.sort(function (a, b) { return a - b });
// 把所有数据进行降序排列
arr.sort(function (a, b) { return b - a });
  • splice( ) 截取
var arr = [100, 200, 300, 400];
// 从索引1开始,截取两个数据
arr.splice(1, 2);
// => [100, 400]
// 返回值:[200, 300]

// 从索引1开始,删除两个,从索引1开始,插入 500,600,700
arr.splice(1, 2, 500, 600, 700)
// => [100, 500, 600, 700, 400]
// 返回值:[200, 300]

数组常用方法2(不会改变原始数组)

  • concat( ) 拼接
  1. 语法:数组 . concat ( 数据, 数组, ... )
  2. 作用:进行数组拼接
  3. 返回值:拼接好的数组
  • join( ) 连接
  1. 语法:数组 . join ( '连接符' )
  2. 作用:使用连接符把数组内的每一项连接成为一个字符串
  3. 返回值:连接好的字符串
  • slice( ) 截取
  1. 语法:数组 . slice ( 开始索引, 结束索引 )
  2. 开始索引不写,从头开始截取,结束索引不写,截取到末尾
  3. 特点:包前不包后
  4. 作用:截取数组,从数组没复制一些内容出来
  5. 返回值:一个新的数组
  6. 可以填写负整数,表示倒数
  • indexOf( ) 检索数据
  1. 语法:数组 . indexOf ( 数据, 开始索引 )
  2. 作用:从开始索引向后检查该数组中是否有该数据
  3. 返回值:如果检索到了该数据,那么就是该数据第一次出现的索引;如果没有,则时 -1
  • lastIndexOf( ) 检索数据
  1. 语法:数组 . lastIndexOf ( 数据, 开始索引 )
  2. 开始索引选填,默认是 length
  3. 作用:从开始索引向前检索该数组中是否有该数据
  4. 返回值:如果有,就是第一次出现的索引位置,如果没有,那么就是 -1

数组常用方法3(不会改变原始数组)

  • forEach( ) 遍历
var arr = [100, 200, 300, 400];
// 有多少个成员,执行多少次
arr.forEach(function (item, index, arr) {
    console.log(item);
    console.log(index);
    console.log(arr);
})
// => 100 200 300 400 
// => 0 1 2 3
// => [100, 200, 300, 400]
  • map( ) 映射
var arr = [100, 200, 300, 400, 500];
// 开始映射
var res = arr.map(function () {
    // 以 return 的形式书写映射条件
    return item * 10
})
// => res = [1000, 2000, 3000, 4000, 5000]
  • filter( ) 过滤
var arr = [100, 200, 300, 400]
// 对 arr 进行过滤
var res = arr.filter(function (item) {
    // 以 return 的形式书写过滤条件
    return item > 300
})
// => res = [400]
  •  every( ) 判断全部
var arr = [100, 200, 300, 400]
var res = arr.every(function (item) {
    // 以 return 形式书写判断条件
    return item < 400
})
// 有一个不满足条件,返回 false
// => res = false
  • some( ) 判断个别
var arr = [100, 200, 300]
var res = arr.some(function (item) {
    return item > 200
})
// 有一个满足,就返回 true
// => res = true
  • find( ) 查找
var arr = [100, 200, 301, 400, 500]
var res = arr.find(function (item) {
    return item % 2 === 1
})
// => res = 301
// 查找符合条件的数据
// 一般用于查找复杂数据类型
  • reduce( ) 叠加
var arr = [100, 200, 300, 400]
var res = arr.reduce(function (prev, item, index, arr) {
    return prev + item
}, 0)
// => res = 0+100+200+300+400
// prev 是初始值,初始为值 0

数组塌陷

  • 方案一:不让数组塌陷,倒着循环数组
// 不让数组塌陷
var arr = [1, 2, 3, 4]
console.log('删除之前:', arr)
for (var i = arr.length - 1; i >= 0; i--) {
    arr.splice(i, 1)
}
console.log('删除之后:', arr)
  • 方案二:数组塌陷,循环变量一起塌陷
// 数组塌陷,循环控制变量跟着一起塌陷
var arr = [1, 2, 3, 4]
console.log('删除之前:', arr)
for (var i = 0; i < arr.length; i++) {
    arr.splice(i, 1)
    i--
}
console.log('删除之后;', arr)

数组去重

  • 方案一
// 先排序,然后循环遍历数组,当前和下一个一样,删除
var arr = [1, 2, 3, 4, 3, 2, 1, 2, 3, 2, 1, 2, 3, 4, 5]
console.log('原始数组:', arr)
arr.sort(function (a, b) {return a - b})
console.log('排序之后:', arr)
for (var i = 0; i < arr.length; i++) {
    if (arr[i] === arr[i + 1]) {
        arr.splice(i, 1)
        // 为了解决数组塌陷
        i--
    }
}
console.log('去重之后:', arr)
  • 方案二
// 准备一个新数组,把数据挨个添加进去,如果有,就不添加,没有,就添加
var arr = [1, 2, 3, 4, 3, 2, 1, 2, 3, 2, 1, 2, 3, 4, 5]
console.log('原始数组:', arr)
var newArr = []
for (var i = 0; i < arr.length; i++) {
    if (newArr.indexOf(arr[i]) === -1) {
        newArr.push(arr[i])
    }
}
console.log('去重之后:', newArr)
  • 方案三
// 循环遍历数组,每个数据判断其后是否还有相同内容,如果有,删除,没有,继续下一个数据
var arr = [1, 2, 3, 4, 3, 2, 1, 2, 3, 2, 1, 2, 3, 4, 5]
console.log('原始数组:', arr)
for (var i = 0; i < arr.length; i++) {
    var index = arr.indexOf(arr[i], i + 1)
    if (index !== -1) {
        arr.splice(index, 1)
        i--
    }
}
console.log('去重之后:', arr)
  • 方案四
// 方案三思路一致,使用 while
var arr = [1, 2, 3, 4, 3, 2, 1, 2, 3, 2, 1, 2, 3, 4, 5]
console.log('原始数组:', arr)
for (var i = 0; i < arr.length; i++) {
    var index = arr.indexOf(arr[i], i + 1)
    while (index !== -1) {
        arr.splice(index, 1)
        index = arr.indexOf(arr[i], i + 1)
    }
}
console.log('去重之后:', arr)
  • 方案五
// 利用对象数据类型,key 不重名
var arr = [1, 2, 3, 4, 3, 2, 1, 2, 3, 2, 1, 2, 3, 4, 5]
console.log('原始数组:', arr)
var obj = []
for (var i = 0; i < arr.length; i++) {
    var item = arr[i]
    obj[item] = '随便'
}
var newArr = []
for (var k in obj) {
    // 字符串转换为数值
    newArr.push(k - 0)
}
console.log('去重之后:', newArr)
  • 方案六
// 借助数据类型 Set,数据类型不接受重复数据
var arr = [1, 2, 3, 4, 3, 2, 1, 2, 3, 2, 1, 2, 3, 4, 5]
console.log('原始数组:', arr)
// 转换成 Set 数据类型,自动去重
var s = new Set(arr)
console.log(s)
// 把 Set 数据类型还原成数组
var res = Array.from(s)
console.log('去重之后:', res)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值