函数的方法
call( ) 和apply( )方法 — 执行函数
function fun(){
alert("我是fun函数");
}
fun.call;
fun.apply;
fun(); //这三个都是执行函数
在调用call( )和apply( )可以将一个对象指定为第一个参数,此时这个对象会成为函数执行时的this;可以用来修改函数执行时的this
function fun (){
alert(this);
}
fun();//如果直接调用的话,this指的是window
function fun (){
alert(this.name);
}
var obj = {name:"obj1"};
var obj2 = {name:"obj2"};
call.fun(obj); //返回obj1
// 如果call()里面写一个对象作为参数,则函数调用时的this就指这个对象
call( )方法可以将实参在指定对象之后依次传递
var obj = {
name:"obj1",
age:29;
sayName:function (a, b){alert(this);}
};
var obj2 = {};
obj.sayName.call(obj2,2,3);
// obj.sayName是函数,调用call()方法之后函数的this是obj2这个对象
//call()写完第一个this指定的对象后,可以写函数的参数
apply( )方法不可以一个一个传实参,而是必须将实参封装进一个数组。
obj.sayName.apply(obj2,[2,3]);
🌟 this总结:
1. 以函数方法调用时,如fun( ); this永远都是window;
2. 以方法的形式调用时,如obj.sayName( ); this是调用方法的对象,也就是obj;
3. 以构造函数的形式调用时,this是使用构造函数构造的新对象,如 var per1 = new Person();this 就是per1
4. 使用call和apply调用时,this是写在括号里的那个对象, 如fun.call( obj1); this就是obj1
arguments
在调用函数时,浏览器每次都会传递两个隐含的参数,一个是函数的上下文对象this,一个是封装参数的对象argument
argument是一个类数组对象,不是数组但是可以根据索引来操作数据并且能够获取长度。
//使用 Array.isArray()方法检查是否为数组
function fun(){
console.log(Array.isArray(arguments)); //返回false,不是数组
}
在调用函数时,我们传递的所有参数都会封装到arguments中被保存起来。
function fun(){
console.log(arguments.length); //获取实参的长度
}
fun("hello",true); //返回2
function fun(){
console.log(arguments[0]); //将封装进arguments里的第一个实参取出来
}
fun("hello",true); //返回“hello”
//即使不定义形参,也可以将实参取出
它里面有一个callee属性,该属性对应一个函数对象,就是当前正在执行的函数对象。
function fun(){
console.log(arguments.callee == fun);
}
fun();//返回true
Date对象 — 表示时间
//创建date对象
var d = new Date();
console.log(d);
//如果直接使用构造函数创建date对象,则会封装为当前代码执行的时间
//创建一个指定的时间对象,需要在构造函数的参数位置传递一个表示时间的字符串作为参数
var d2 = new Date("09/08/2022 21:37:01");
//格式:月/日/年 时:分:秒
方法
(1)getDate( ) — 获取当前日期对象是几日
var d2 = new Date("09/08/1996 09:10:09");
var date = d2.getDate();
console.log(date); //返回08
(2)getDay — 获取当前日期对象是星期;返回一个0-6的数字,0表示周日
var d2 = new Date("09/08/1996 09:10:09");
var date = d2.getDay();
console.log(date); //返回08
getMonth( )也是从0开始的,所以12月是11,1月是0
(3)getTime( ) — 当前日期的时间戳
时间戳,指的是从格林威治时间1970年1月1日,0时0分0秒到当前日期所花费的毫秒数(1秒= 1000毫秒); 计算机底层在保存时间时都使用时间戳。
var d = new Date("08/09/1996 09:10:09");
var time = d.getTime();
console.log(time);
Date.now( ) 可以直接获取当前时间的时间戳,可以用来测试代码的执行性能。
var time = Date.now();
Math 对象
Math和其他对象不同,它不是一个构造函数,它不需要创建对象,内部已经封装了数学计算相关的属性和方法。
Math中大写的属性都是常量,如Math.PI
(1) 小数取整
Math.ceil( ) — 上舍入,向上取整,小数位只要有值就自动进1
console.log(Math.ceil(1.4)); //返回2
Math.floor( ) —下舍入,向下取整,小数点只要有值就舍掉
Math.round( ) — 四舍五入
(2)随机数
Math.random( ) — 生成0-1之间的数
//生成一个0-10的数字
console.log(Math.random()*10);
//但是这样还是出来一堆小数,且原本就不包含0和1,乘10之后也不包含
//四舍五入取整
console.log(Math.round(Math.random()*10));
//生成1-10的随机数
console.log(Math.round(Math.random()*9)+1);
//生成x-y的一个随机数
console.log(Math.round(Math.random()*(y-x))+x);
(3) 幂
Math. pow(x,y) — 返回x的y次幂
包装类
通过包装类可以将基本的数据类型转换成对象
String( )、Number( )、Boolean( )
//创建一个Number类型
var num = new Number ();
console.log(typeof num); //返回object
//向num中添加属性
num.hello = "abc";
但是一般开发中并不会使用
var bool = new Boolean(false);
if(bool){
alert("我运行了");
} //if判断的时候会先将object转换成boolean,所有的object转换后都是true
当我们对一些基本数据类型的值调用属性和方法时,浏览器会临时使用包装类将其转换成对象,然后再调用对象的属性和方法。
var s = 123; //基本数据类型
//方法和属性只能添加给对象,不能添加给基本数据类型
//但是却可以使用
s = s.toString();
console.log(typeof s); //返回“123”
s.hello = "你好";
console.log(s.hello);//返回undefined
//s.hello是在调用的时候转换成了对象1,而console里的也是调用之后才产生对象2,两个不是同一个
字符串的相关方法(针对string对象)
(1)在底层字符串是以字符数组的形式保存的
var str = "Hello Cooldog";
console.log(str.length); //属性,可以用来获取字符串的长度
console.log(str[0]); //返回H
(2) charAt( ) — 可以返回字符串中指定位置的字符;该方法不会改变原字符串
var str = "hello";
var result = str.charAt(0);
console.log(result);//返回h
//根据索引获取指定字符
var result = str.charCodeAt(0); //返回当前字符的unicode编码
(3)String.fromCharCode( ) — 根据字符编码获取字符, 该方法是string对象下的
var result = String.fromCharCode(72);
console.log(result); //返回H
(4)indexOf( ) — 该方法可以检索一个字符串中是否含有指定内容;如果字符串中含有查找的内容,则会返回其第一次出现的索引;如果没有找到指定内容,则返回-1
var str = "hello atguigu";
var result = str.indexOf("l");
console.log(result); //返回2
//indexOf() 可以写两个参数,第二个参数是指定开始查找的位置,这个位置包含当前数字
var result = str.indexOf("l",2);
lastIndexOf( ) — 从后向前查找,返回要查找内容最后一次出现的位置