0%

  • 程序运行过程中会产生垃圾,需要建立垃圾回收机制来回收垃圾
  • 当一个对象没有任何的变量或属性对他进行应用,此时他将永远无法操作该对象
  • 此时这种对象就是垃圾,会占用大量内存空间,导致程序运行变慢
  • 在JS中有自动垃圾回收机制,会自动将这些垃圾对象从内存中销毁
  • 我们不需要也不能进行垃圾回收操作
  • 我们需要做的只是将不再使用的对象设置null即可

  • Math和其他的对象不同,他不是一个构造函数
    • 他属于一个工具类不用创建对象,他里面封装了数学运算相关的属性和方法
  • 比如:
    • Math.PI表示pai
    • console.log(Math.PI);
  • abs()可以用来计算一个数的绝对值
    • console.log(Math.abs(-1));
  • Math.ceil()
    • 可以对一个数进行向上取整,小数位只要有值就自动进1
    • console.log(Math.ceil(1.1));
  • Math.floor()
    • 可以对一个数进行向下取整,小数部分被舍去
  • Math.round()
    • 把数四舍五入为最接近的整数
  • Math.random()
    • 用来生成一个0~1之间的随机数
    • 生成一个一个0~x之间的随机数
      Math.round(Math.random()*x);
    • 生成一个x~y之间的随机数
      Math.round(Math.random()*(y-x)+x);
  • max()可以获取多个数中的最大值
  • min()可以获取多个数中的最小值
    • var max = Math.max(10,28,19,299);
    • var min = Math.max(12,42,23,14);
  • Math.pow(x,y)返回x的y次幂

在JS中使用Date对象来表示一个时间

1
2
3
4
5
6
7
8
9
//创建一个Date对象
//如果直接使用构造函数创建一个Date对象,则会封装为当前代码执行的时间
var d = new Date();
console.log(d);
//创建一个指定的时间对象
//需要在构造函数中传递一个表示时间的字符串作为参数
//格式 月份/日/年 时:分:秒 //年份一定要写够4位数,否则可能写16,传1916
var d2 = new Date("12/03/2021 11:18:30");
console.log(d2);
  • getDate()
    • 获取当前日期对象是几号
1
var date = d2.getDate();
  • getDay()
    • 获取当前日期对象是周几
    • 返回0~6的值,0表示周日,1表示周一
1
var day = d2.getDay();
  • getMonth()
    • 获取当前时间对象的月份
    • 会返回一个0~11的值,
      • 0表示1月
      • 1表示2月
1
2
d2 = new Date("12/18/2021 11:10:20");
var month = d2.getMonth();
  • getYear()
    • 获取当前对象的年份
1
var year = d2.getYear();
  • getTime()
    • 获取当前日期对象的时间戳
    • 时间戳指的是从格林威治标准时间的1970年1月1日0时0分0秒 所花费的毫秒数(1秒 = 1000毫秒)
    • 计算机底层在保存时间时使用都是时间戳
1
2
var time = d2.getTime();
console.log(time);
1
2
3
var d3 = new Date("1/1/1970 0:0:0");
time = d3.getTime();
console.log(time); //输出一个负值,因为我们输入的默认时东八区的1970 1/1 0:0:0
  • 利用时间戳来测试代码的执行性能
    • 获取当前时间戳
1
2
3
4
5
6
var start = Date.now();
for(var i = 0; i<100;i++){
console.log(i);
}
var end = Date.now();
console.log("执行了"+(end - start)+"毫秒");

在调用函数时,浏览器每次都会传递进两个隐含参数

1. 函数的上下文对象this 2. 封装实参的对象arguments
  • arguments是一个类数组对象,他也可以通过索引来操作数据,也获取长度
    • arguments是类数组,并不是数组
    • 在调用函数时,我们所传递的实参都会在arguments中保存
    • arguments.length可以用来获取实参的长度
    • 我们即使不定义形参,也可以通过arguments来使用实参
      • arguments[0]表示第一个实参
      • arguments[1]表示第二个实参
  • arguments的callee属性
    • 这个属性对应的一个函数对象,就是当前正在指向的函数对象
1
2
3
4
5
6
7
function fun(a,b){
console.log(Array.isArray(arguments)); //输出false
console.log(arguments[1]); //输出you
console.log(arguments.length); //输出2
console.log(arguments.callee == fun); //输出true
}
fun("hello","you");

call()和apply()

  • 解释:这两个函数的作用都是在特定的作用域中将函数绑定到另一个对象上去运行,即可以用来重新定义函数的执行环境,两者仅在定义参数方式上有所区别
    • 这两个方法都是函数对象的方法,需要通过函数对象来调用
    • 当对函数调用call()和apply()都会调用函数执行
    • 在调用call和apply()可以将一个对象指定为第一参数
      • 此时这个对象将会成为函数执行时的this
    • call()方法可以将实参在对象之后依次传递
    • apply()方法需要将实参封装到一个数组中统一传递

this的情况:

  1. 以函数形式调用时,this永远都是window
  2. 以方法形式调用时,this时调用方法的对象
  3. 以构造函数的形式调用时,this时新创建的那个对象
  4. 使用call和apply调用时,this是指定的那个对象
1
2
fun.call(obj,2,3);  //2,3是fun函数的参数
fun.apply(obj,[2,3]); //2,3是fun函数的参数

concat()

  • 可以连接两个或多个数组,并将新的数组返回
  • 该方法不会对原数组产生影响
1
2
var result = arr.concat(arr2,arr3,"牛魔王","铁扇公主");
console.log(result);

join()

  • 该方法可以讲数组转换为一个字符串
  • 该方法不会对原数组产生影响,而是将转换后的字符串作为结果返回
  • 在join()中可以指定一个字符串作为参数,这个字符串将会成为数组中元素的连接符
  • 默认用”,”连接数组中的每个元素
  • join后面的括号中是连接符
1
2
3
var result = arr.join("");  //填写空串才是无连接符
var result = arr.join("@-@");
console.log(result);

reverse()

  • 该方法可以用来反转数组(前边的去后边,后边的去前边)
  • 该方法会直接修改原数组

sort()

  • 可以用来对数组中的元素进行排序
  • 会修改原数组 默认会按照Unicode编码进行排序
  • 即使对于纯数字的数组,使用sort()也会按照Unicode编码排序
  • 所以对数字进行排序可能会得到错误的结果
1
2
3
var arr = [11,2,4,3];
arr.sort();
console.log(arr); //输出11,2,3,4 错误了!
  • 我们可以在sort()添加一个回调函数,来指定排序规则
    • 回调函数中需要定义两个形参
    • 浏览器会分别使用数组中的元素作为实参去调用回调函数
    • 使用哪个元素调用不确定,但是肯定的是在数组中a一定在b前边
  • 浏览器会根据回调函数的返回值来决定元素的顺序
    sort后面的括号中的值:
    • 如果返回一个大于0的值,则会元素交换位置
    • 如果返回一个小于0,则元素位置不变
    • 如果返回一个0,则两个元素相等,不回交换位置
1
2
3
4
arr = [5,4,7];
arr.sort(function(a,b)){
return a-b; //升序排列,若为b-a为降序排列
}

1
2
3
4
5
6
7
8
9
var arr = {2,1,4,3,1,4,1,2};
for(var i = 0;i < arr.length; i++){
for(var j = i + 1;j < arr.length;j++){
if(arr[i] == arr[j]){
arr.splice(j,1); //如果有重复元素,则删除j对应的元素
j--;
}
}
}

slice()

  • 可以用来从数组提取指定元素
  • 该方法不会改变元素数组
  • 参数:
    • 截取开始的位置索引,包含开始索引
    • 截取结束的位置索引,不包含结束索引
      • 第二个参数可以省略不写,此时会截取从开始索引完后的所有元素
    • 索引可以传递一个负值
      • -2表示倒数第二个数
1
2
3
var result = arr.slice(1,2);
var result = arr.slice(3);
var result = arr.slice(1,-2);

splice()

  • 删除数组中的指定元素
  • 使用splice()会删除指定元素
    • 并将被删除的元素作为返回值返回
  • 参数
    • 第一个:表示开始位置的索引
    • 第二个:表示删除的数量
    • 第三个及以后:可以传递一些新的元素,这些元素会自动插入到开始位置索引的前面
1
2
arr.splice(0,2);
var result = arr.splice(1,2,"牛魔王","红孩儿");

JS为我们提供了foreach方法来遍历数组
  • forEach()方法需要一个函数作为参数,像这种函数,有我们创建但是不由我们调用的,我们称之为回调函数。
  • 数组中有几个元素函数就会执行几次,每次执行时,浏览器会将遍历到的元素以实参的形式传递进来,我们可以定义形参来读取这些内容

  • 浏览器会在会调函数中传递三个参数:
    • 第一个参数,就是当前正在遍历的元素——>依次输出 孙悟空 猪八戒 沙和尚 唐僧
    • 第二个参数,当前正在遍历的元素的索引—>依次输出 0,1,2,3,4
    • 第三个参数,正在遍历的整个数组————>依次输出 孙悟空,猪八戒,沙和尚,唐僧

  • 这个方法只支持IE8以上的浏览器,IE8以及以下的浏览器都不兼容
  • 如果要兼容IE8,则不要使用forEach()方法,还是用for循环来遍历
1
2
3
4
var arr = [”孙悟空”,”猪八戒”,”沙和尚”,”唐僧”];
arr.forEach(function(a){
console.log(”a = ”+a);
});

  • 创建一个数组
  • 所谓的遍历数组,就是将数组中所有的元素都取出来
    用for循环
1
var arr = ["孙悟空","猪八戒","沙和尚"];
1
2
3
4
5
6
7
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.toString = function(){
return "name ="+name +"age = "+age;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var per = new Person("孙悟空",18);
var per = new Person("猪八戒",28);
var per = new Person("红孩儿",38);
var per = new Person("二郎神",48);
var perArr = [per,per2,per3,per4,per5];
function getAdult(arr){
var newarr = [];
for(var i = 0;i < arr.length;i++){
var p = arr[i];
if(p.age >= 18){
newarr.push(p);
}
}
return newarr;
}
var result = getAdult(perArr);
console.log(result);