0
点赞
收藏
分享

微信扫一扫

Javascript基础2

幸福的无所谓 2022-04-15 阅读 45
javascript
  • 垃圾回收GC
  • 数组array
    • 简介
    • 数组字面量
    • 数组方法
    • 数组的遍历
    • foreach
  • String字符串的方法
    • 属性
    • 方法
  • Date
    • 创建时间
    • 方法
  • Math
  • 包装类
    • String()
    • Number()
    • Boolean
  • 正则表达式
    • 介绍
    • 正则语法
    • 字符串和正则相关方法

垃圾回收GC

程序运行过程中会产生垃圾,会导致程序运行过慢

  • 当一个对象没有任何变量或属性对它进行引用,此时将无法操作该对象
  • 即改对象就是垃圾,必须进行清理。
  • JS拥有自动垃圾回收机制,会自动将垃圾对象中从内存销毁。
  • 需要做的就是将不再使用的对象设置为null
// 创建对象
let obj=new Object();

//对对象进行各种操作
obj=null;

数组array

简介

  • 数组也是对象(一切都是对象)
  • 和普通对象功能类似。
  • 不同的是:普通对象使用字符串作为属性名,数组使用数字作为索引操作元素

// 构造函数创建  ,并添加元素
let arr=new Array(10,20,30);
console.log(typeof arr);//Object
console.log(arr);//[10,20,30]
//向数组中添加元素
arr[0]=10;
console.log(arr);//[10, 10]
// 读取数组元素
console.log(arr[0]);//10
console.log(arr[2]);//所以越界,undefined
//设置(小于或大于原长度)或获取数组长度(或者 最大索引+1)
console.log(arr.length);//2

数组字面量

  • 数组元素可以是任意数据类型(包括对象)
 // 使用字面量创建数组
let arr=[];
//创建时指定数组元素
let arr2=[1,2,3,4,5];
console.log(arr2.length);//5
console.log(arr2);//[1,2,3,4,5]

//创建一个数组只有一个元素
arr=[10];
console.log(arr);//[10]

let arr3=new Array(10);
console.log(arr3);//长度为10的空数组[,,,,,,,,,]

//数组元素为对象
let obj={name:'孙悟空'};
let arr5=[obj];
console.log(arr5);//[{name:'孙悟空'},{sex: '男'}]
console.log(arr5[0].name);//孙悟空

//数组元素为函数
let arr6=[function(){alert('0');},function(){alert('1');}];
console.log(arr6);//[f,f]
arr6[0]();//运行函数

//数组元素为数组,二维数组
let arr7=[[1,2,3],[4,5,6],[7,8,9]];
console.log(arr7.length);//3
console.log(arr7[0]);[1,2,3]

数组方法


1.push() 向数组末尾添加元素(或数组,作为整体只占一个位置),并返回数组的长度

let arr1=['孙悟空','猪八戒','沙和尚'];

arr1.push('唐僧','蜘蛛精');
console.log(arr1);//['孙悟空','猪八戒','沙和尚','唐僧','蜘蛛精']
console.log(arr1.length);//5

2.pop() 删除数组的最后一个元素并返回

console.log(arr1.pop());//蜘蛛精
console.log(arr1);['孙悟空','猪八戒','沙和尚','唐僧']
console.log(arr1.length);//4

3.unshift() 向数组的开头添加元素(或数组,作为整体,只占一个位置)并返回数组长度

arr1.unshift('牛魔王','玉兔精');
console.log(arr1);//['牛魔王', '玉兔精', '孙悟空', '猪八戒', '沙和尚', '唐僧']
console.log(arr1.length);//6

4.shift 删除数组的第一个元素并返回

console.log(arr1.shift());
console.log(arr1);//['玉兔精', '孙悟空', '猪八戒', '沙和尚', '唐僧']
console.log(arr1.length);//5

5.slice(start,end) 从已有的数组中提取指定元素到新数组

  • 不会改变原数组,封装到新数组中
  • 包含start,不包含end
  • end可以省略不写
  • 索引可以传递负值(从后往前),-1表示倒数第一个,-2表示倒数第二个
let arr2=arr1.slice(0,2);
console.log(arr2);//['玉兔精', '孙悟空']
console.log(arr2.length);//2

//end省略不写,默认截取到最后一个元素
let arr3=arr1.slice(2);
console.log(arr3);//['猪八戒', '沙和尚', '唐僧']
console.log(arr3.length)//3

6.splice(start,length,[新元素1,新元素2]) 删除原数组中指定元素,并向前边开头添加新元素

  • 会改变原数组
  • 包含start,length表示删除的数量
//删除指定元素
let arr4=arr1.splice(0,3);
console.log(arr1);//['沙和尚', '唐僧']
console.log(arr1.length);//2

//删除指定元素,并在前边添加新元素
let arr5=arr1.splice(1,3,'王母娘娘','玉皇大帝');
console.log(arr1);//['玉兔精', '王母娘娘', '玉皇大帝', '唐僧']
console.log(arr1.length);//4

//去除数组中重复的数字
let arr_1=[1,2,3,2,1,3,4,2,5,6,6,6,7,8,9]
for (let i = 0, len = arr_1.length; i < len; i++) {
    // 获取当前元素后的所有元素
    for (let j = i+1, len = arr_1.length; j < len; j++) {
        if(arr_1[i]==arr_1[j]){
            //如果存在重复元素,则删除j对应的元素
            arr_1.splice(j,1);
            // 删除了j对应的元素之后,后边的元素自动补齐,此时将不会再比较这个元素
            // 需要再比较一次j所在位置的元素
            j--;
        }
    }
}
console.log(arr_1);//[1,2,3,4,5,6,7,8,9]

7.concat(A,...,B) 拼接数组,并返回新数组

  • 不会改变原数组
let arr1=['孙悟空','猪八戒','沙和尚'];
let arr2=['玉兔','王母娘娘','玉皇大帝'];

let arr3=arr1.concat(arr2);
console.log(arr3);//['孙悟空', '猪八戒', '沙和尚', '玉兔', '王母娘娘', '玉皇大帝']

8.join(str) 把数组转换为字符串,并使用str连接

  • 不会改变原数组
  • 是字符串,只是默认使用逗号连接
let arr4=arr1.join('...');
console.log(arr4);//孙悟空...猪八戒...沙和尚

9.reverse 反转数组

  • 会直接修改原数组
console.log(arr1.reverse());//['沙和尚', '猪八戒', '孙悟空']

10.sort 数组排序

  • 改变原数组
  • 默认按照unicode编码排序
  • 纯数字数组,也会按照unicode编码排序,需要自己指定排序规则
    • 使用回调函数指定数组排序规则
    • 定义2个形参,分别使用数组中的元素作为实参去调用回调函数.(a在b前边,但谷歌浏览器相反,b在a前边)
    • 使用哪个元素调用不确定。
  • 浏览器会根据回调函数的返回值决定元素顺序
    • >0,则元素交换位置
    • <0,元素位置不变
    • =0,元素相等,不交换
//按照unicode编码排序结果
let arr5=[12,5,7,23,56,4,3,78,54,36];
console.log(arr5.sort());//[12, 23, 3, 36, 4, 5, 54, 56, 7, 78]

//使用回调函数指定排序规则
arr5.sort(function(a,b){
    //升序
    return a-b;
    //降序
    return b-a;
})
console.log(arr5);//[3, 4, 5, 7, 12, 23, 36, 54, 56, 78]

数组的遍历

将数组中所有的元素都取出来

//for 循环
 let arr1=['孙悟空','猪八戒','沙和尚'];
for (let i = 0, len = arr1.length; i < len; i++) {
    console.log(arr1[i]);
}
//for in
for (let str in arr1) {
    //str表示索引
    console.log(arr1[str]);//孙悟空,猪八戒,沙和尚
}

//对象遍历
let obj={
    name:'孙悟空',
    age:18,
    sex:'男'
}
for (let str in obj) {
    //console.log('属性名:'+str);
    //console.log('属性值:'+obj[str]);
    console.log(obj[str]);//孙悟空,18,男
}

foreach

只支持IE8以上的浏览器

  • 需要一个函数作为参数:通常为匿名函数
  • 由我们创建但不由我们调用,即回调函数
  • 由浏览器调用
  • 每次执行时,浏览器会将遍历到的元素以实参的形式传递过来

三个参数

  • 正在遍历的元素
  • 元素的索引
  • 正在遍历的数组
personArr.forEach(function(value){
    console.log(value);
    });

  

personArr.forEach(function(value,index,obj){
    console.log(value,index,obj);
});

String字符串的方法

在底层:字符串是以字符数组的形式保存的。

操作字符串可以想象为操作数组

let str='hello';

//底层保存:['h','e','l','l','o']

属性

1.length
返回字符串的长度

 let str='hello';
console.log(str.length);//5

2.prototype
向对象中添加共有的属性和方法

方法

字符串的大部分方法不会修改原字符串,即字符串的内容不可变
1.charAt(munber) 获取指定位置(索引)的字符

let str='hello world';
console.log(str.charAt(1));//e

2.charCodeAt(number) 获取指定位置(索引)的字符的unicode编码

console.log(str.charCodeAt(1));//101

3.fromCharCode() 根据字符编码获取字符串

  • String调用
let result=String.fromCharCode(101);
console.log(result);//e

let result=String.fromCharCode(0x2682);
console.log(result);//特殊字符

4.concat(A,...,B) 连接字符串

  • 作用和+加号一样
let str1='北京,';
let str2='欢迎你!';
let str3=str1.concat(str2);
console.log(str3);//北京,欢迎你!

5.indexOf(str,index) 从index开始,检索字符串中是否含有指定字符串

  • 若存在,返回第一次出现的索引(从前往后)
  • 否则,返回-1
let str4='hello word!';
console.log(str4.indexOf('lo'));//3

let str4='hello hword!';
console.log(str4.indexOf('h',1));//6

6.lastIndexOf(str,index) 从index开始,检索字符串中是否含有指定字符串

  • 若存在,返回索引。(从后往前找)
  • 否则,返回-1
let str5='hehllo hworhd!';
console.log(str5.lastIndexOf('h',5));//2

7.slice(start,end) 截取字符串

  • 包括start,但不包括end
  • 没有end,则截取到后边所有的
  • -1 从后边计算
let str6='abcdefgh';
console.log(str6.slice(1,4));//bcd

8.subString(start,end) 截取字符串

  • 和slice类似
  • 但:substring不能接受负值,默认为0
  • 会自动调整参数位置,若第二个小于第一个,则交换位置
let str7='abcdefghij';
console.log(str7.substring(1,3));//bc
自动调整参数位置
console.log(str7.substring(5,2));//cde

9.substr(start,length) 截取字符串

let str8='abcdefghij';
console.log(str8.substr(1,3));//bcd

10.split(str) 将字符串拆分为数组,并用str分隔

  • 和数组的join相反:将数组转换为字符串,并用str连接
  • 若传递的是**('')**,则将每个字符都拆分为数组元素
let str9='hello,money,year,date';
console.log(str9);//hello,money,year,date
let result1=str9.split(',');
console.log(result1);['hello', 'money', 'year', 'date']

let result2=result1.join('-');
console.log(result2);//hello-money-year-date

11.toLowerCase 转为小写字母
12.toUpperCase 转为大写字母

 let str10='ABCdefGH';
console.log(str10.toLowerCase());//abcdefgh
console.log(str10.toUpperCase());//ABCDEFGH

Date

Date是构造函数

创建时间

  • 指定日期格式:月/日/年 时:分:秒
//使用构造函数创建--->当前代码执行的时间
let d=new Date();
console.log(d);//Tue Mar 29 2022 11:03:39 GMT+0800 (中国标准时间)

//创建指定的时间对象,传递表示时间的实参
let d2=new Date("03/29/2022 11:10:30");
console.log(d2);//Tue Mar 29 2022 11:10:30 GMT+0800 (中国标准时间)

方法

1.getDate() 获取当前日期对象是几日

let d1=new Date();
 console.log(d1);//Tue Mar 29 2022 13:56:55 GMT+0800 (中国标准时间)
console.log(d1.getDate());//29

2.getDay() 获取当前日期对象是周几

  • 会返回0-6的值,0表示周日......
console.log(d1.getDay());//day=2

3.getMonth() 获取当前日期对象的月份

  • 返回0-11的值,0表示1月
console.log('Month='+d1.getMonth());//Month=2

4.getFullYear() 获取当前日期对象的年份

console.log('Year='+d1.getFullYear());//Year=2022

5.getHours() 获取当前日期对象的小时
6.getMinutes() 获取当前日期对象的分钟
7.getSeconds() 获取当前日期对象的秒数
8.getMilliSecond() 获取当前日期对象的毫秒数

console.log('Hour='+d1.getHours());//Hour=14
console.log('Minutes='+d1.getMinutes());//Minute=4
console.log('Seconds='+d1.getSeconds());//Second=36
console.log('MilliSecond='+d1.getMilliseconds());//MilliSecond=302

9.getTime 获取当前日起对象的时间戳

  • 从格林威治的1970年1月1日,0时0分0秒到现在的毫秒数
  • 1秒=1000毫秒
console.log('Time='+d1.getTime());//Time=1648534040417

10.now获取当前时间戳

  • 可以利用时间戳测试代码执行的性能
let d2=Date.now();
console.log(d2);//1648534559277

let start=Date.now();
执行代码。
let end=Date.now();
let timespan=end-start//时间差就是中间代码执行的时间

Math

  • Math不是构造函数,属于工具类,不需要创建对象
  • Math封装了许多属性和函数(可以直接用)
//ceil  向上取整
//floor  向下取整
//round  (四舍五入)
//random   生成0-1之间的随机数(不包括0和1)
    console.log(Math.round(Math.random()*10));//生成0-10之间的整数
//max(x,...,y)  多个数之间的最大值
//min(x,...,y)  多个数之间的最小值
//pow(x,y)   x的y次幂
//sqrt(x)    根号x

包装类

基本数据类型:string number boolean null undefined symbol

引用数据类型:object(包括Function,Math,Date等)

通过3种包装类可以将基本类型数据转换为对象,可以添加属性和方法

  • 在实际应用中不会使用基本数据类型对象。
  • 在做比较时可能会带来一些不可预料的结果
  • 对基本数据类型调用属性和方法时:
    • 浏览器会使用包装类将数据封装为对象,然后再调用对象的属性和方法
    • 调用完以后,再转换为基本数据类型。

String()

将基本数据类型字符串转换为String对象

let num=new Number(3);
console.log('num='+num);//num=3
console.log(typeof num);//object

Number()

将基本数据类型Number转换为Number对象

let str=new String('hello');
console.log('str='+str);//str=hello
console.log(typeof str);//object

Boolean

将基本数据类型Boolean转换为Boolean对象

let bool=new Boolean('true')
console.log('bool='+bool);//bool=true
console.log(typeof bool);//object

正则表达式

介绍

正则表达式用于定义一些字符串的规则

  • 计算机可以根据正则表达式,检查一个字符串是否符合规则
  • 正则表达式
  • 匹配模式
    • i 忽略大小写
    • g 全局匹配模式
//构造函数创建正则表达式
let reg=new RegExp('正则表达式','匹配模式');

//检查字符串是否符合正则表达式的规则,严格五分大小写
reg.test(str)

正则语法

  • 字面量创建正则表达式 /表达式/匹配模式
//使用字面量创建正则表达式  
let reg=/正则表达式/匹配模式
let reg1=/a/i;
  • a|b 表示或者
  • [ab] 表示或者
  • [a-z] 任意小写字母
  • [A-Z] 任意大写字母
  • [A-z] 任意字母
  • [0-9] 任意数字
//创建正则表达式检查字符串是否有a或b
let reg2=/a|b/i;
console.log(reg2.test('bcd'));//true
 console.log(reg2.test('acd'));//true
 console.log(reg2.test('ab'));//true
 
 [ab]==a|b
 
 //检查字符串是否含有abc 或 adc 或 aec
 let reg5=/a[bde]c/;
  • [^n] 除了
//除了ab以外的字符串
let reg6=/[^ab]/;
console.log(reg6.test('ab'));
  • 量词{number} 设置内容出现的最少次数
    • 只对括号之前的一个内容起作用
    • 多个内容可以用括号括起来
et reg7=/a{3}/;
console.log(reg7.test('abc'));//false
console.log(reg7.test('aaabc'));//true

let reg8=/(ab){3}/;
console.log(reg8.test('abc'));//false
console.log(reg8.test('ababab'));//true

当前后都有内容时,严格限制出现的次数
let reg9=/d(ab){3}c/;
console.log(reg9.test('dababababc'));//false
console.log(reg9.test('dabababc'));//true
  • 量词{m,n} 设置内容出现的次数介于m-n之间
    • {m,} 表示m次以上
let reg10=/d(ab){1,3}c/;
console.log(reg10.test('dabc'));//true
console.log(reg10.test('dabababc'));//true
  • n+ 至少一个{1,}
  • n* 0个或多个{0,}
  • n? 0个或1个{0,1}
let reg11=/ab+c/;
console.log(reg11.test('dac'));//false
console.log(reg11.test('dabbc'));//true

let reg12=/ab*c/;
console.log(reg12.test('dac'));//true
console.log(reg12.test('dabbbc'));//true

let reg13=/ab?c/;
console.log(reg13.test('dac'));//true
console.log(reg13.test('dabc'));//true
console.log(reg13.test('dabbc'));//false
  • ^n 是否以n开头
  • n$ 是否以n结尾
//开头
let reg14=/^c/;
console.log(reg14.test('cde'));//true
console.log(reg14.test('dabbc'));//false

//结尾
let reg15=/a$/;
console.log(reg15.test('cda'));//true
console.log(reg15.test('dabbc'));//false

a既是开头立刻又是结尾
let reg16=/^a$/;
console.log(reg16.test('a'));//true
console.log(reg16.test('aba'));//false

以a开头或者以a结尾
let reg17=/^a|a$/;
console.log(reg17.test('ab'));//true
  • . 表示任意字符
    • 使用== \表示转义字符==
查找字符串是否含有  .
let reg19=/\./;
console.log(reg19.test('a.bc'));//true

查找字符串是否含有  \
let reg20=/\\/;
console.log(reg20.test('a\\bc'));//true
  • \w(任意字母、数字、下划线)
  • \W(除了字母数字、下划线)
  • \d(任意数字)
  • \D(除了数字)
  • \s(空格)
  • \S(除了空格)
  • \b(单词边界)(是独立的内容)
  • \B(除了单词边界)
/**
* 去除字符串的空格
*/
let str10="      h      e      l      lo";
//去掉字符串前后的空格,即用''代替空格
console.log(str10.replace(/\s/g,''));

//去掉去开头的空格
console.log(str10.replace(/^\s*/g,''));

//去掉开头或结尾的空格
console.log(str10.replace(/^\s*|\s*$/g,''));

邮件的正则表达式

/**
* 邮件的正则表达式
* hello  .nihao  @abc.com.cn
* 任意字母数字下划线.任意字母数字下划线@任意字母、数字.任意字母(2-5位).任意字母(2-5位)
*/
let mail=/^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/;
console.log('mail = '+mail.test('vienna_wa@163.com'));

字符串和正则相关方法

1.split 字符串拆分成数组

  • 方法中可以传递正则表达式作为参数,根据正则表达式拆分字符串
  • 默认全局匹配
let str='1a2b3c4d5e';
let result=str.split(/[A-z]/);
console.log(result);//['1', '2', '3', '4', '5', '']

2.search 搜索字符串中是否含有指定内容

  • 搜索到,则返回第一次出现的索引
  • 否则,返回-1
  • 还可以传递正则表达式作为参数
  • 只会查找第一次出现的
let str1='hello abc hello abc';
console.log(str1.search('abc'));//6

let str2='hello hello aec afc';
console.log(str2.search(/a[bde]c/));//12

3.match 根据正则表达式,将符合条件的内容提取出来

  • 默认:只会找到第一个符合要求的内容
  • 设置全局匹配模式,就可以找到所有符合条件的
  • 可以为一个正则表达式设置多个匹配模式
  • 结果被封装到数组中返回
let str2='1a2b3c4d5e';
console.log(str2.match(/[A-z]/));
//['a', index: 1, input: '1a2b3c4d5e', groups: undefined]

console.log(str2.match(/[A-z]/g));
//['a', 'b', 'c', 'd', 'e']

4.replace(A,B) 将字符串的指定内容,替换为新的内容

  • A可以是正则表达式
let str3='1a2b3c4d5eA8B9';
console.log(str3.replace('a','@-@'));//1@-@2b3c4d5eA8B9

console.log(str3.replace(/[A-z]/g,'@-@'));//1@-@2@-@3@-@4@-@5@-@@-@8@-@9

console.log(str3.replace(/[A-z]/g,''));//1234589
举报

相关推荐

0 条评论