主要補(bǔ)充兩個(gè)函數(shù)相關(guān)的方法call和apply。以及學(xué)習(xí)除了函數(shù)對(duì)象之外一些常用的對(duì)象類型。
1.call和apply
call和apply是函數(shù)的兩個(gè)比較常用的方法沸版。兩個(gè)方法都是函數(shù)對(duì)象的方法,需要通過(guò)函數(shù)來(lái)調(diào)用。兩個(gè)方法都可以指定一個(gè)對(duì)象為參數(shù)尚氛,這個(gè)對(duì)象會(huì)被指定為調(diào)用這兩個(gè)方法的函數(shù)的this,也就是說(shuō)我們可以使用這兩個(gè)方法將函數(shù)應(yīng)用于我們指定的對(duì)象洞渤。
除了傳入對(duì)象作為參數(shù)之外阅嘶,還可以將實(shí)參傳入這兩個(gè)方法。這里二者就有不同的地方,call傳入可以直接在對(duì)象參數(shù)的后面?zhèn)魅雽?shí)參讯柔,而在apply方法中傳入實(shí)參的時(shí)候抡蛙,必須將實(shí)參封裝到一個(gè)數(shù)組中。
function fun(a, b) {
console.log(this.name);
console.log(a);
console.log(b);
};
let person = {
name:"Jack"
};
// fun.call(person, 2, 3);//調(diào)用call方法函數(shù)執(zhí)行
fun.apply(person, [2, 3]);//調(diào)用apply方法函數(shù)執(zhí)行
2.arguments
函數(shù)在被調(diào)用的時(shí)候魂迄,瀏覽器會(huì)默認(rèn)向其中傳入一個(gè)參數(shù)this粗截,關(guān)于this的指向這里不在過(guò)多的介紹。其實(shí)除了this之外捣炬,還有另外一個(gè)參數(shù)也會(huì)默認(rèn)傳遞進(jìn)函數(shù)熊昌,這個(gè)就是arguments。它是一個(gè)類數(shù)組對(duì)象湿酸,和數(shù)組一樣可以通過(guò)索引對(duì)內(nèi)部的元素進(jìn)行操作婿屹。我們?cè)谡{(diào)用函數(shù)的時(shí)候向函數(shù)內(nèi)部傳入的實(shí)參都被封裝在了arguments中。
function fun() {
console.log(arguments.length);//2
console.log(arguments[0]);
console.log(arguments[1]);
};
fun("hello",true);//未定義形參 但是通過(guò)索引我們依然訪問(wèn)到了實(shí)參
arguments還有一個(gè)需要掌握的方法callee推溃,它會(huì)指向一個(gè)函數(shù)對(duì)象昂利,該函數(shù)對(duì)象就是當(dāng)前正在執(zhí)行的函數(shù)。
function def() {
console.log(arguments.callee);
};
3.Date對(duì)象
date在英語(yǔ)中的意思是日期铁坎。所以在JavaScript中它表示的是一個(gè)時(shí)間相關(guān)的對(duì)象蜂奸。直接看代碼來(lái)看該對(duì)象的使用。
let day = new Date("12/06/2022 12:36:18");//傳入表示時(shí)間的字符串 即可創(chuàng)建一個(gè)指定時(shí)間的對(duì)象
//時(shí)間的格式 月/日/年 時(shí):分:秒
console.log(day);
Date作為一個(gè)JavaScript中內(nèi)置的對(duì)象厢呵,我們可以直接使用窝撵。既然是對(duì)象那么它就有自己所獨(dú)有的一些方法
/*針對(duì)Date對(duì)象的方法
* getDate 獲取日期 也就是幾號(hào)
* getDay 獲取星期幾 注意范圍為0-6 0表示周日
* getMonth 獲取月份 0表示1月 1表示2月 以此類推
* getFullYear 獲取年份
* 。襟铭。碌奉。詳細(xì)的可以查看W3C的手冊(cè)*/
// let d = time.getDate();
// let d = time.getDay();
// let d = time.getMonth();
let d = time.getHours();
console.log(d);
/*getTime 獲取當(dāng)期對(duì)象日期的時(shí)間戳
* 表示的實(shí)際上時(shí)格林威治時(shí)間(1970年1月1日 0時(shí)0分0秒)至日期對(duì)象所花費(fèi)的毫秒數(shù)
* 計(jì)算機(jī)底層保存時(shí)間都是使用的時(shí)間戳*/
let c = time.getTime();
console.log(c);
/*Date.now
* 獲取執(zhí)行當(dāng)前代碼的時(shí)間戳的方法
* 可以用來(lái)計(jì)算程序的運(yùn)行時(shí)間
* */
這里特別注意getDate和getDay獲取的分別是日期和一周中的"周幾",以及在JavaScript中描述周幾和幾月的方法跟我們?nèi)粘5纳钍遣灰粯拥摹?br> 另外一個(gè)值得關(guān)注的Date對(duì)象的方法寒砖,Date.now赐劣。它獲取的是執(zhí)行當(dāng)前這行代碼的時(shí)間戳,利用這個(gè)特性哩都,我們?cè)谝欢未a的開頭和結(jié)尾處各添加一行該代碼魁兼,二者結(jié)果相減就能直觀地體現(xiàn)代碼的執(zhí)行時(shí)間.比如測(cè)試瀏覽器打印1-1000時(shí)花費(fèi)的時(shí)間。
let start = Date.now();
for (let i = 0; i <= 1000; i++) {
console.log(i);
};
let end = Date.now();
console.log(end-start);
更多Date對(duì)象相關(guān)方法查閱W3C漠嵌。JavaScript Date 參考手冊(cè) (w3school.com.cn)
4.Math對(duì)象
很明顯咐汞,這個(gè)對(duì)象就是一些包含了數(shù)學(xué)運(yùn)算相關(guān)方法的對(duì)象。其中包含了一些常用的數(shù)學(xué)運(yùn)算操作包括開平發(fā)儒鹿,取整化撕,生成隨機(jī)數(shù)等等。下面的代碼展示了一些常用的方法约炎。
/*Math對(duì)象
* Math和其他類不同 他不是構(gòu)造函數(shù)
* Math是一個(gè)工具類 里面封裝了一些數(shù)學(xué)運(yùn)算相關(guān)的屬性和方法
* Math.PI表示的就是圓周率
* Math.abs表示獲取絕對(duì)值*/
let a = -12.394;
console.log(Math.abs(a));
/*ceil 對(duì)數(shù)據(jù)向上取整
* floor 對(duì)數(shù)據(jù)向下取整數(shù)
* round 對(duì)數(shù)據(jù)四舍五入 也就是取到相隔最近的整數(shù)*/
console.log(Math.ceil(1.1));
console.log(Math.floor(1.9));
console.log(Math.round(1.3));
/*random 生成0-1之間的一個(gè)隨機(jī)數(shù)
* 如果要生成一個(gè)x--y之間的隨機(jī)數(shù) 則使用
* Math.round(Math.random()*(y - x)) + x*/
for (let i = 0; i < 11; i++) {
console.log(Math.round(Math.random()*5) + 2);
};
/*max 獲取多個(gè)數(shù)中的最大值
* min 獲取多個(gè)數(shù)中的最小值*/
let max = Math.max(1,54,79,19,1);
console.log(max);
/*pow(x,y)
* 返回x的y次冪
*
* sqrt()
* 返回一個(gè)數(shù)的平方根*/
let mi = Math.pow(2, 10);
console.log(mi);
更多Math對(duì)象的方法也可以查閱W3C植阴。JavaScript Math 參考手冊(cè) (w3school.com.cn)
5.包裝類
之前提過(guò)蟹瘾,類就是構(gòu)造函數(shù)的另一個(gè)名字。包裝類就是一類特殊的構(gòu)造函數(shù)掠手,它們會(huì)將基本類型的數(shù)據(jù)轉(zhuǎn)換為對(duì)象憾朴。只要是Number String Boolean這三個(gè)包裝類,它們會(huì)將與它們名字對(duì)應(yīng)的基本類型的數(shù)據(jù)轉(zhuǎn)換為對(duì)象喷鸽。下面的代碼使用了包裝類众雷,并且驗(yàn)證了它們的作用。
let a = new String("name");
let str = "name";
console.log(a === str);//值相同 但是數(shù)據(jù)類型不一樣
實(shí)際開發(fā)當(dāng)中魁衙,我們一般不會(huì)手動(dòng)使用包裝類來(lái)轉(zhuǎn)換基本類型的數(shù)據(jù)报腔。之所以介紹它是因?yàn)榘b類時(shí)瀏覽器自動(dòng)調(diào)用的,我們需要了解這個(gè)機(jī)制剖淀。比如下面的代碼
let b = 123;
b = b.toString();
console.log(b);
console.log(typeof b);
b作為Number類型的數(shù)據(jù)是不可能去調(diào)用toString()方法的纯蛾,之索引這里代碼沒(méi)有報(bào)錯(cuò),就是因?yàn)闉g覽器自動(dòng)調(diào)用包裝類纵隔,將數(shù)據(jù)類型進(jìn)行了一個(gè)臨時(shí)的轉(zhuǎn)換翻诉。