1 - 內(nèi)置對象
1.1 內(nèi)置對象
? JavaScript 中的對象分為3種:自定義對象 厅贪、內(nèi)置對象、 瀏覽器對象
? 前面兩種對象是JS 基礎(chǔ) 內(nèi)容堤结,屬于 ECMAScript; 第三個瀏覽器對象屬于 JS 獨有的鸭丛, JS API 講解內(nèi)置對象就是指 JS 語言自帶的一些對象竞穷,這些對象供開發(fā)者使用,并提供了一些常用的或是最基本而必要的功能(屬性和方法)鳞溉,內(nèi)置對象最大的優(yōu)點就是幫助我們快速開發(fā)
? JavaScript 提供了多個內(nèi)置對象:Math瘾带、 Date 、Array熟菲、String等
1.2 查文檔
? 查找文檔:學(xué)習(xí)一個內(nèi)置對象的使用看政,只要學(xué)會其常用成員的使用即可,我們可以通過查文檔學(xué)習(xí)抄罕,可以通過MDN/W3C來查詢允蚣。
? Mozilla 開發(fā)者網(wǎng)絡(luò)(MDN)提供了有關(guān)開放網(wǎng)絡(luò)技術(shù)(Open Web)的信息,包括 HTML贞绵、CSS 和萬維網(wǎng)及 HTML5 應(yīng)用的 API厉萝。
? MDN:https://developer.mozilla.org/zh-CN/
1.3 Math對象
? Math 對象不是構(gòu)造函數(shù),它具有數(shù)學(xué)常數(shù)和函數(shù)的屬性和方法。跟數(shù)學(xué)相關(guān)的運算(求絕對值谴垫,取整章母、最大值等)可以使用 Math 中的成員。
屬性翩剪、方法名 | 功能 |
---|---|
Math.PI | 圓周率 |
Math.floor() | 向下取整 |
Math.ceil() | 向上取整 |
Math.round() | 四舍五入版 就近取整 注意 -3.5 結(jié)果是 -3 |
Math.abs() | 絕對值 |
Math.max()/Math.min() | 求最大和最小值 |
Math.random() | 獲取范圍在[0,1)內(nèi)的隨機(jī)值 |
? 注意:上面的方法使用時必須帶括號
? 獲取指定范圍內(nèi)的隨機(jī)整數(shù):
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
1.4 日期對象
? Date 對象和 Math 對象不一樣乳怎,Date是一個構(gòu)造函數(shù),所以使用時需要實例化后才能使用其中具體方法和屬性前弯。Date 實例用來處理日期和時間
-
使用Date實例化日期對象
- 獲取當(dāng)前時間必須實例化:
var now = new Date();
- 獲取指定時間的日期對象
var future = new Date('2019/5/1');
注意:如果創(chuàng)建實例時并未傳入?yún)?shù)蚪缀,則得到的日期對象是當(dāng)前時間對應(yīng)的日期對象
-
使用Date實例的方法和屬性
圖片1.png -
通過Date實例獲取總毫米數(shù)
-
總毫秒數(shù)的含義
? 基于1970年1月1日(世界標(biāo)準(zhǔn)時間)起的毫秒數(shù)
-
獲取總毫秒數(shù)
// 實例化Date對象 var now = new Date(); // 1. 用于獲取對象的原始值 console.log(date.valueOf()) console.log(date.getTime()) // 2. 簡單寫可以這么做 var now = + new Date(); // 3. HTML5中提供的方法,有兼容性問題 var now = Date.now();
-
1.5 數(shù)組對象
創(chuàng)建數(shù)組的兩種方式
-
字面量方式
-
示例代碼如下:
var arr = [1,"test",true];
-
-
new Array()
-
示例代碼如下:
var arr = new Array();
? 注意:上面代碼中arr創(chuàng)建出的是一個空數(shù)組恕出,如果需要使用構(gòu)造函數(shù)Array創(chuàng)建非空數(shù)組询枚,可以在創(chuàng)建數(shù)組時傳入?yún)?shù)
? 參數(shù)傳遞規(guī)則如下:
如果只傳入一個參數(shù),則參數(shù)規(guī)定了數(shù)組的長度
如果傳入了多個參數(shù)浙巫,則參數(shù)稱為數(shù)組的元素
-
檢測是否為數(shù)組
-
instanceof 運算符
-
instanceof 可以判斷一個對象是否是某個構(gòu)造函數(shù)的實例
var arr = [1, 23]; var obj = {}; console.log(arr instanceof Array); // true console.log(obj instanceof Array); // false
-
-
Array.isArray()
-
Array.isArray()用于判斷一個對象是否為數(shù)組金蜀,isArray() 是 HTML5 中提供的方法
var arr = [1, 23]; var obj = {}; console.log(Array.isArray(arr)); // true console.log(Array.isArray(obj)); // false
-
添加刪除數(shù)組元素的方法
-
數(shù)組中有進(jìn)行增加、刪除元素的方法的畴,部分方法如下表
圖片2.png
注意:push渊抄、unshift為增加元素方法;pop丧裁、shift為刪除元素的方法
數(shù)組排序
-
數(shù)組中有對數(shù)組本身排序的方法护桦,部分方法如下表
圖片3.png
注意:sort方法需要傳入?yún)?shù)來設(shè)置升序、降序排序
- 如果傳入“function(a,b){ return a-b;}”煎娇,則為升序
- 如果傳入“function(a,b){ return b-a;}”二庵,則為降序
數(shù)組索引方法
-
數(shù)組中有獲取數(shù)組指定元素索引值的方法,部分方法如下表
圖片4.png
數(shù)組轉(zhuǎn)換為字符串
-
數(shù)組中有把數(shù)組轉(zhuǎn)化為字符串的方法逊桦,部分方法如下表
圖片5.png
注意:join方法如果不傳入?yún)?shù)眨猎,則按照 “ , ”拼接元素
其他方法
-
數(shù)組中還有其他操作方法,同學(xué)們可以在課下自行查閱學(xué)習(xí)
圖片6.png
1.6 字符串對象
基本包裝類型
? 為了方便操作基本數(shù)據(jù)類型强经,JavaScript 還提供了三個特殊的引用類型:String睡陪、Number和 Boolean。
? 基本包裝類型就是把簡單數(shù)據(jù)類型包裝成為復(fù)雜數(shù)據(jù)類型匿情,這樣基本數(shù)據(jù)類型就有了屬性和方法兰迫。
// 下面代碼有什么問題?
var str = 'andy';
console.log(str.length);
? 按道理基本數(shù)據(jù)類型是沒有屬性和方法的炬称,而對象才有屬性和方法汁果,但上面代碼卻可以執(zhí)行,這是因為
? js 會把基本數(shù)據(jù)類型包裝為復(fù)雜數(shù)據(jù)類型玲躯,其執(zhí)行過程如下 :
// 1. 生成臨時變量据德,把簡單類型包裝為復(fù)雜數(shù)據(jù)類型
var temp = new String('andy');
// 2. 賦值給我們聲明的字符變量
str = temp;
// 3. 銷毀臨時變量
temp = null;
字符串的不可變
? 指的是里面的值不可變鳄乏,雖然看上去可以改變內(nèi)容,但其實是地址變了棘利,內(nèi)存中新開辟了一個內(nèi)存空間橱野。
? 當(dāng)重新給字符串變量賦值的時候,變量之前保存的字符串不會被修改善玫,依然在內(nèi)存中重新給字符串賦值水援,會重新在內(nèi)存中開辟空間,這個特點就是字符串的不可變茅郎。
? 由于字符串的不可變蜗元,在大量拼接字符串的時候會有效率問題
根據(jù)字符返回位置
? 字符串通過基本包裝類型可以調(diào)用部分方法來操作字符串,以下是返回指定字符的位置的方法:
案例:查找字符串"abcoefoxyozzopp"中所有o出現(xiàn)的位置以及次數(shù)
- 先查找第一個o出現(xiàn)的位置
- 然后 只要indexOf 返回的結(jié)果不是 -1 就繼續(xù)往后查找
- 因為indexOf 只能查找到第一個系冗,所以后面的查找奕扣,利用第二個參數(shù),當(dāng)前索引加1毕谴,從而繼續(xù)查找
根據(jù)位置返回字符
? 字符串通過基本包裝類型可以調(diào)用部分方法來操作字符串成畦,以下是根據(jù)位置返回指定位置上的字符:
在上述方法中,charCodeAt方法返回的是指定位置上字符對應(yīng)的ASCII碼涝开,ASCII碼對照表如下:
案例:判斷一個字符串 'abcoefoxyozzopp' 中出現(xiàn)次數(shù)最多的字符,并統(tǒng)計其次數(shù)
核心算法:利用 charAt() 遍歷這個字符串
把每個字符都存儲給對象框仔, 如果對象沒有該屬性舀武,就為1,如果存在了就 +1
-
遍歷對象离斩,得到最大值和該字符
? 注意:在遍歷的過程中银舱,把字符串中的每個字符作為對象的屬性存儲在對象總,對應(yīng)的屬性值是該字符出現(xiàn)的次數(shù)
字符串操作方法
? 字符串通過基本包裝類型可以調(diào)用部分方法來操作字符串跛梗,以下是部分操作方法:
replace()方法
? replace() 方法用于在字符串中用一些字符替換另一些字符寻馏,其使用格式如下:
字符串.replace(被替換的字符串, 要替換為的字符串)核偿;
split()方法
? split()方法用于切分字符串诚欠,它可以將字符串切分為數(shù)組。在切分完畢之后漾岳,返回的是一個新數(shù)組轰绵。
? 其使用格式如下:
字符串.split("分割字符")
2 - 簡單數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型
2.1 簡單數(shù)據(jù)類型
? 簡單類型(基本數(shù)據(jù)類型、值類型):在存儲時變量中存儲的是值本身尼荆,包括string 左腔,number,boolean捅儒,undefined液样,null
2.2 復(fù)雜數(shù)據(jù)類型
? 復(fù)雜數(shù)據(jù)類型(引用類型):在存儲時變量中存儲的僅僅是地址(引用)振亮,通過 new 關(guān)鍵字創(chuàng)建的對象(系統(tǒng)對象、自定義對象)鞭莽,如 Object双炕、Array、Date等撮抓;
2.3 堆棧
- 堆椄窘铮空間分配區(qū)別:
1、棧(操作系統(tǒng)):由操作系統(tǒng)自動分配釋放存放函數(shù)的參數(shù)值丹拯、局部變量的值等站超。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧;
簡單數(shù)據(jù)類型存放到棧里面
2乖酬、堆(操作系統(tǒng)):存儲復(fù)雜類型(對象)死相,一般由程序員分配釋放,若程序員不釋放咬像,由垃圾回收機(jī)制回收算撮。
-
簡單數(shù)據(jù)類型的存儲方式
? 值類型變量的數(shù)據(jù)直接存放在變量(棧空間)中
圖片12.png -
復(fù)雜數(shù)據(jù)類型的存儲方式
? 引用類型變量(椣匕海空間)里存放的是地址肮柜,真正的對象實例存放在堆空間中
圖片13(1).png
2.4 簡單類型傳參
? 函數(shù)的形參也可以看做是一個變量,當(dāng)我們把一個值類型變量作為參數(shù)傳給函數(shù)的形參時倒彰,其實是把變量在椛蠖矗空間里的值復(fù)制了一份給形參,那么在方法內(nèi)部對形參做任何修改待讳,都不會影響到的外部變量芒澜。
function fn(a) {
a++;
console.log(a);
}
var x = 10;
fn(x);
console.log(x);
? 運行結(jié)果如下:
2.5 復(fù)雜數(shù)據(jù)類型傳參
? 函數(shù)的形參也可以看做是一個變量创淡,當(dāng)我們把引用類型變量傳給形參時痴晦,其實是把變量在棧空間里保存的堆地址復(fù)制給了形參琳彩,形參和實參其實保存的是同一個堆地址誊酌,所以操作的是同一個對象。
function Person(name) {
this.name = name;
}
function f1(x) { // x = p
console.log(x.name); // 2. 這個輸出什么 ?
x.name = "張學(xué)友";
console.log(x.name); // 3. 這個輸出什么 ?
}
var p = new Person("劉德華");
console.log(p.name); // 1. 這個輸出什么 ?
f1(p);
console.log(p.name); // 4. 這個輸出什么 ?
? 運行結(jié)果如下: