## 一、BOM
### 1、定義
瀏覽器對(duì)象模型BOM(Browser Object Model),它使 JavaScript 有能力與瀏覽器進(jìn)行“對(duì)話”,控制瀏覽器行為(跳轉(zhuǎn),前進(jìn),后退,獲取屏幕大小等)
### 2、結(jié)構(gòu)
- BOM是Browser Object Model的縮寫,簡(jiǎn)稱瀏覽器對(duì)象模型
- BOM提供了獨(dú)立于內(nèi)容而與瀏覽器窗口進(jìn)行交互的對(duì)象
- 由于BOM主要用于管理窗口與窗口之間的通訊,因此其核心對(duì)象是window
- BOM由一系列相關(guān)的對(duì)象構(gòu)成,并且每個(gè)對(duì)象都提供了很多方法與屬性
- BOM缺乏標(biāo)準(zhǔn),JavaScript語(yǔ)法的標(biāo)準(zhǔn)化組織是ECMA,DOM的標(biāo)準(zhǔn)化組織是W3C(WHATWG,WebHypertextApplicationTechnologyWorkingGroup——網(wǎng)頁(yè)超文本應(yīng)用程序技術(shù)工作組目前正在努力促進(jìn)BOM的標(biāo)準(zhǔn)化)
- BOM最初是Netscape瀏覽器標(biāo)準(zhǔn)的一部分
結(jié)構(gòu)圖如下:

BOM提供了可以訪問(wèn)窗口對(duì)象的一些方法,我們可以用它來(lái)移動(dòng)窗口位置,改變窗口大小,打開(kāi)新窗口和關(guān)閉窗口,彈出對(duì)話框,進(jìn)行導(dǎo)航以及獲取客戶的一些信息如:瀏覽器品牌、版本,屏幕分辨率等。但BOM最強(qiáng)大的功能是它提供了一個(gè)訪問(wèn)HTML頁(yè)面的入口——document對(duì)象,以使得我們可以通過(guò)這個(gè)入口來(lái)使用DOM的強(qiáng)大功能。
### 3、BOM對(duì)象用法小結(jié)
#### (一) window 對(duì)象
window對(duì)象是BOM的頂層(核心)對(duì)象,所有對(duì)象都是通過(guò)它延伸出來(lái)的,也可以稱為window的子對(duì)象。由于window是頂層對(duì)象,因此調(diào)用它的子對(duì)象時(shí)可以不顯示的指明window對(duì)象,window對(duì)象表示整個(gè)瀏覽器窗口,但不必表示其中包含的內(nèi)容。此外,window還可用于移動(dòng)或調(diào)整它表示的瀏覽器的大小,或者對(duì)它產(chǎn)生其他影響。
##### 1. window 對(duì)象的屬性:
屬性 | 描述
---|---
closed | 返回窗口是否已被關(guān)閉
defaultStatus | 設(shè)置或返回窗口狀態(tài)欄中的默認(rèn)文本
frames| 返回窗口中所有命名的框架。該集合是 Window 對(duì)象的數(shù)組,每個(gè) Window 對(duì)象在窗口中含有一個(gè)框架
length | 設(shè)置或返回窗口中的框架數(shù)量
name | 設(shè)置或返回窗口的名稱
opener | 返回對(duì)創(chuàng)建此窗口的窗口的引用
parent | 返回父窗口
self | 返回對(duì)當(dāng)前窗口的引用。等價(jià)于window屬性
status | 設(shè)置窗口狀態(tài)欄的文本
top | 返回最頂層的父窗口
screenX | 設(shè)定窗口距離屏幕左邊界的像素長(zhǎng)度
screenY | 設(shè)定窗口距離屏幕上邊界的像素長(zhǎng)度
screenLeft | 等價(jià)于window.screenX
screenTop | 等價(jià)于window.screenY
outerHeight | 返回窗口的外部高度
outerWidth | 返回窗口的外部寬度
innerHeight | 返回窗口的文檔顯示區(qū)的高度
innerWidth | 返回窗口的文檔顯示區(qū)的寬度
pageXoffset | 設(shè)置或返回當(dāng)前頁(yè)面相對(duì)于窗口顯示區(qū)左上角的X位置(此方法只有IE支持)
pageYoffset | 設(shè)置或返回當(dāng)前頁(yè)面相對(duì)于窗口顯示區(qū)左上角的Y位置 (此方法只有IE支持)
##### 2. window 對(duì)象的方法:
方法 | 描述
---|---
alert() | 彈出一個(gè)帶有一段消息和確認(rèn)按鈕的窗體
confirm() | 顯示帶有一段消息以及確認(rèn)按鈕盒取消按鈕的對(duì)話框
prompt() | 顯示可提示用戶輸入的對(duì)話框
focus() | 把鍵盤焦點(diǎn)給予一個(gè)窗口
blur() | 把鍵盤焦點(diǎn)從頂層窗口移開(kāi)
open() | 打開(kāi)一個(gè)新的瀏覽器窗體
close() | 關(guān)閉瀏覽器窗口
forward() | 模擬用戶點(diǎn)擊瀏覽器上的“前進(jìn)”按鈕,將頁(yè)面轉(zhuǎn)到瀏覽器的下一頁(yè)
back() | 模擬用戶點(diǎn)擊瀏覽器上的“后退”按鈕,將頁(yè)面轉(zhuǎn)到瀏覽器的上一頁(yè)
home() | 模擬用戶點(diǎn)擊瀏覽器上的“主頁(yè)”按鈕,將頁(yè)面轉(zhuǎn)到指定的頁(yè)面上
stop() | 模擬用戶點(diǎn)擊瀏覽器上的“停止”按鈕,終止瀏覽器的下載操作
print() | 模擬用戶點(diǎn)擊瀏覽器上的“打印”按鈕,通知瀏覽器打開(kāi)打印對(duì)話框打印當(dāng)前頁(yè)
resizeBy() | 按照指定的像素調(diào)整窗口的大小
resizeTo() | 把窗體的大小調(diào)整到指定的寬度和高度
moveBy() | 可相對(duì)窗口的當(dāng)前坐標(biāo)移動(dòng)指定的像素
moveTo() | 把窗口的左上角移動(dòng)到一個(gè)指定的坐標(biāo)
scrollBy() | 按照指定的像素值來(lái)滾動(dòng)內(nèi)容
scrollTo() | 把內(nèi)容滾動(dòng)到指定的坐標(biāo)
setInterval() | 按照指定的周期(毫秒)來(lái)調(diào)用函數(shù)或計(jì)算表達(dá)式
setTimeout() | 在指定的毫秒數(shù)后調(diào)用函數(shù)或表達(dá)式
clearInterval() | 取消由setInterval()設(shè)置的timeout
clearTimeout() | 取消由setTimeout()方法設(shè)置的timeout
計(jì)時(shí)器:
```
<script>
var timer = null;
function printTime () {
var d = new Date();
var h= d.getHours();
var m= d.getMinutes();
var s= d.getSeconds();
document.getElementById("time").innerHTML = h + ":" + m+ ":" + s;
}
function begin () {
timer = setInterval(printTime,1000)
}
function pause () {
clearInterval(timer)
}
</script>
<div id="time"></div>
<button onclick='begin()'>開(kāi)始</button>
<button onclick='pause()'>暫停</button>
```
#### (二) window的子對(duì)象
##### 1. History 對(duì)象
History 對(duì)象包含用戶(在瀏覽器窗口中)訪問(wèn)過(guò)的 URL
**(1)對(duì)象屬性:**
屬性 | 描述
---|---
length | 返回瀏覽器歷史列表中的 URL 數(shù)量
state | 表示當(dāng)前地址欄中網(wǎng)址對(duì)應(yīng)的狀態(tài)
**(2)對(duì)象方法:**
方法 | 描述
---|---
history.back() | 回退一個(gè)地址,相當(dāng)于瀏覽器的后退鍵;對(duì)第一個(gè)網(wǎng)址無(wú)效。
history.forward()| 前進(jìn)一個(gè)地址,相當(dāng)于瀏覽器的前進(jìn)鍵;對(duì)最后一個(gè)網(wǎng)址無(wú)效。
history.go(n) | 當(dāng)n>0時(shí),前進(jìn)n個(gè)歷史記錄;當(dāng)n>history.length時(shí),失效。當(dāng)n=0時(shí),go(0);刷新當(dāng)前頁(yè)面。當(dāng)n<0時(shí),后退n個(gè)歷史記錄;當(dāng)n>history.length時(shí),失效。
history.pushState(state, title, url) | 可以改變當(dāng)前地址欄的url,且在歷史記錄中添加一條;不會(huì)刷新頁(yè)面。
history.replaceState(state, title, url) | 功能是修改history對(duì)象的當(dāng)前記錄。其他參數(shù)和pushState相同,不會(huì)刷新頁(yè)面。
##### 2. Location 對(duì)象
Location 對(duì)象包含有關(guān)當(dāng)前 URL 的信息。
**(1)對(duì)象屬性:**
屬性 | 描述
---|---
hash | 設(shè)置或返回從井號(hào) (#) 開(kāi)始的 URL(錨)。
host | 設(shè)置或返回主機(jī)名和當(dāng)前 URL 的端口號(hào)。
hostname | 設(shè)置或返回當(dāng)前 URL 的主機(jī)名。
href | 設(shè)置或返回完整的 URL。
pathname| 設(shè)置或返回當(dāng)前 URL 的路徑部分。
port | 設(shè)置或返回當(dāng)前 URL 的端口號(hào)。
protocol | 設(shè)置或返回當(dāng)前 URL 的協(xié)議。
search| 設(shè)置或返回從問(wèn)號(hào) (?) 開(kāi)始的 URL(查詢部分)。
url 地址解析:
```
function getQueryString (name) {
const reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i')
const r = window.location.search.substr(1).match(reg)
if (r != null) return (r[2])
return null
}
function createQueryString (data) {
let dataStr = '';
Object.keys(data).forEach(key => {
dataStr += key + '=' + data[key] + '&';
})
dataStr = dataStr.substr(0, dataStr.lastIndexOf('&'));
return dataStr;
}
function parseQueryString () {
let obj = {};
const temp = window.location.search.substr(1).split('&') || [];
for (let item of temp) {
obj[item.split('=')[0]] = item.split('=')[1]
}
return obj;
}
```
**(2)對(duì)象方法:**
方法 | 描述
---|---
assign() | 加載新的文檔。
reload() | 重新加載當(dāng)前文檔。
replace() | 用新的文檔替換當(dāng)前文檔。
##### 3. Navigator 對(duì)象
Navigator 對(duì)象包含有關(guān)瀏覽器的信息。
**(1)對(duì)象屬性:**
屬性 | 描述
---|---
appCodeName | 返回瀏覽器的代碼名。
appMinorVersion | 返回瀏覽器的次級(jí)版本。
appName | 返回瀏覽器的名稱。
appVersion | 返回瀏覽器的平臺(tái)和版本信息。
browserLanguage | 返回當(dāng)前瀏覽器的語(yǔ)言。
cookieEnabled | 返回指明瀏覽器中是否啟用 cookie 的布爾值。
cpuClass | 返回瀏覽器系統(tǒng)的 CPU 等級(jí)。
onLine | 返回指明系統(tǒng)是否處于脫機(jī)模式的布爾值。
platform | 返回運(yùn)行瀏覽器的操作系統(tǒng)平臺(tái)。
systemLanguage| 返回 OS 使用的默認(rèn)語(yǔ)言。
userAgent | 返回由客戶機(jī)發(fā)送服務(wù)器的 user-agent 頭部的值。
userLanguage | 返回 OS 的自然語(yǔ)言設(shè)置。
判斷瀏覽器:
```
function goPage() {
if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
window.location.href="你的手機(jī)版地址";
}
else {
window.location.href="你的電腦版地址";
}
}
function judgeSystem () {
var value
if (ua.match(/phone|pad|pod|iPhone|iPod|ios|iPad/i)) {
value = 'ios'
} else if (ua.match(/Android/i)) {
value = 'android'
}
return value
}
function isMobile () {
if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
return true
}
else {
return false
}
}
function isWeixin () {
var ua = navigator.userAgent.toLowerCase();
return /micromessenger/i.test(ua) === true;
}
```
**(2)對(duì)象方法:**
方法 | 描述
---|---
javaEnabled() | 規(guī)定瀏覽器是否啟用 Java。
taintEnabled() | 規(guī)定瀏覽器是否啟用數(shù)據(jù)污點(diǎn) (data tainting)。
##### 4. Screen 對(duì)象
Screen 對(duì)象包含有關(guān)客戶端顯示屏幕的信息。
**(1)對(duì)象屬性:**
屬性 | 描述
---|---
availHeight | 返回顯示屏幕的高度 (除 Windows 任務(wù)欄之外)。
availWidth | 返回顯示屏幕的寬度 (除 Windows 任務(wù)欄之外)。
width | 返回顯示器屏幕的寬度。
height | 返回顯示器屏幕的高度。
bufferDepth | 設(shè)置或返回調(diào)色板的比特深度。
colorDepth | 返回目標(biāo)設(shè)備或緩沖器上的調(diào)色板的比特深度。
deviceXDPI | 返回顯示屏幕的每英寸水平點(diǎn)數(shù)。
deviceYDPI | 返回顯示屏幕的每英寸垂直點(diǎn)數(shù)。
fontSmoothingEnabled | 返回用戶是否在顯示控制面板中啟用了字體平滑。
logicalXDPI | 返回顯示屏幕每英寸的水平方向的常規(guī)點(diǎn)數(shù)。
logicalYDPI | 返回顯示屏幕每英寸的垂直方向的常規(guī)點(diǎn)數(shù)。
pixelDepth | 返回顯示屏幕的顏色分辨率(比特每像素)。
updateInterval | 設(shè)置或返回屏幕的刷新率。
## 二、DOM
### 1、定義
DOM(文檔對(duì)象模型)描述了處理網(wǎng)頁(yè)內(nèi)容的方法和接口,是HTML和XML的API,DOM把整個(gè)頁(yè)面規(guī)劃成由節(jié)點(diǎn)層級(jí)構(gòu)成的文檔。
### 2、結(jié)構(gòu)
**HTML DOM 樹(shù)形結(jié)構(gòu):**

### 3、DOM對(duì)象用法小結(jié)
#### (1)查找節(jié)點(diǎn)
##### 直接查找:
- document.getElementById()  根據(jù)ID獲取一個(gè)標(biāo)簽
- document.getElementsByClassName()  根據(jù)class屬性獲?。梢垣@取多個(gè)元素,所以返回的是一個(gè)數(shù)組)
- document.getElementsByTagName()  根據(jù)標(biāo)簽名獲取標(biāo)簽合集
```
<div class="c1" id="d1">
待到將軍歸來(lái)日,朕與將軍解戰(zhàn)袍!
</div>
<div class="c1" id="d2">
日照香爐生紫煙,遙看瀑布掛前川!
</div>
var a = document.getElementById('d1'); //獲取id屬性值為d1的標(biāo)簽 拿到的直接是標(biāo)簽對(duì)象
var b = document.getElementsByClassName('c1'); //獲取class值為c1的所有標(biāo)簽 拿到的是數(shù)組
var c = document.getElementsByTagName('div'); //獲取所有div標(biāo)簽 拿到的是數(shù)組
```
##### 間接查找:
- dom.parentElement  獲取節(jié)點(diǎn)標(biāo)簽的父級(jí)標(biāo)簽
- dom.children  獲取所有子標(biāo)簽
- dom.firstElementChild  獲取第一個(gè)子標(biāo)簽元素
- dom.lastElementChild  獲取最后一個(gè)子標(biāo)簽元素
- dom.nextElementSibling  獲取下一個(gè)兄弟標(biāo)簽元素
- dom.previousElementSibling  獲取上一個(gè)兄弟標(biāo)簽元素
```
<div class="parent">
<span class="c1" id="d1">
待到將軍歸來(lái)日,朕與將軍解戰(zhàn)袍!
</span>
<p class="c1" id="d2">
日照香爐生紫煙,遙看瀑布掛前川!
</p>
</div>
var a = document.getElementById('d1');
var b = document.getElementsByClassName('c1')[0];
var c = document.getElementsByClassName('c1')[1];
var d = document.getElementsByTagName('div')[0];
var p = document.getElementsByClassName('parent')[0];
console.log(a.parentElement.nodeName); // "DIV"
console.log(Array.from(p.children).map(function(v){
return v.nodeName
})); // ["SPAN", "P"]
console.log(d.firstElementChild.nodeName); // "SPAN"
console.log(d.lastElementChild.nodeName); // "P"
console.log(b.nextElementSibling.nodeName); // "P"
console.log(c.previousElementSibling.nodeName); // "SPAN"
```
#### (2)節(jié)點(diǎn)操作
- dom.createElement()  創(chuàng)建節(jié)點(diǎn)
- dom.appendChild()  在元素末尾插入節(jié)點(diǎn)
- dom.insertBefore()   在某個(gè)節(jié)點(diǎn)之前插入節(jié)點(diǎn)
- dom.removeChild()  刪除節(jié)點(diǎn)
- dom.replaceChild()  替換節(jié)點(diǎn)
```
//動(dòng)態(tài)創(chuàng)建script標(biāo)簽
function loadScriptString(code) {
var script = document.createElement('script'); //創(chuàng)建一個(gè)script標(biāo)簽
script.type = 'text/javascript';
// script.setAttribute('src', '');
try {
//IE瀏覽器認(rèn)為script是特殊元素,不能再訪問(wèn)子節(jié)點(diǎn);報(bào)錯(cuò);
script.appendChild(document.createTextNode(code));
}
catch (ex) {
script.text = code;
}
document.getElementsByTagName('head')[0].appendChild(script);
}
window.onload = function () {
loadScriptString("alert('Hello World!!!')");
}
```
#### (3)文本操作
- dom.innerText  獲取標(biāo)簽的文本內(nèi)容
- dom.innerHTML  獲取標(biāo)簽內(nèi)的所有內(nèi)容,包括文本和標(biāo)簽
#### (4)屬性操作
- dom.setAttribute()  設(shè)置屬性
- dom.getAttribute()  獲取屬性
- dom.removeAttribute()  刪除屬性
#### (5)值操作
- dom.value  獲取值
- dom.value = ' '  設(shè)置值
#### (6)class的操作
- dom.classList  獲得這個(gè)標(biāo)簽的class屬性的所有的值
- dom.classList.add()  添加class值
- dom.classList.remove()  刪除class值
- dom.classList.contains()  判斷是否含有有某個(gè)class值,有返回true,沒(méi)有返回false
- dom.classList.toggle()  切換class,有就刪除,沒(méi)有就增加
```
const u = {};
u.isElement = function(obj){
return !!(obj && obj.nodeType == 1);
};
u.hasCls = function(el, cls){
if(!u.isElement(el)){
console.warn('$api.hasCls Function need el param, el param must be DOM Element');
return;
}
if(el.classList.contains(cls)){
return true;
}else{
return false;
}
};
u.addCls = function(el, cls){
if(!u.isElement(el)){
console.warn('$api.addCls Function need el param, el param must be DOM Element');
return;
}
if('classList' in el){
el.classList.add(cls);
}else{
var preCls = el.className;
var newCls = preCls +' '+ cls;
el.className = newCls;
}
return el;
};
u.removeCls = function(el, cls){
if(!u.isElement(el)){
console.warn('$api.removeCls Function need el param, el param must be DOM Element');
return;
}
if('classList' in el){
el.classList.remove(cls);
}else{
var preCls = el.className;
var newCls = preCls.replace(cls, '');
el.className = newCls;
}
return el;
};
u.toggleCls = function(el, cls){
if(!u.isElement(el)){
console.warn('$api.toggleCls Function need el param, el param must be DOM Element');
return;
}
if('classList' in el){
el.classList.toggle(cls);
}else{
if(u.hasCls(el, cls)){
u.removeCls(el, cls);
}else{
u.addCls(el, cls);
}
}
return el;
};
```
#### (7)css操作
- dom.style.backgroundColor
- dom.style.height
注:有橫杠的css屬性,寫法要去掉橫杠,并且橫杠后面的單詞首字母大寫
#### (8)事件
```
onclick 當(dāng)用戶點(diǎn)擊某個(gè)對(duì)象時(shí)調(diào)用的事件句柄。
ondblclick 當(dāng)用戶雙擊某個(gè)對(duì)象時(shí)調(diào)用的事件句柄。
onfocus 元素獲得焦點(diǎn)。 應(yīng)用場(chǎng)景:輸入框
onblur 元素失去焦點(diǎn)。 應(yīng)用場(chǎng)景:用于表單驗(yàn)證,用戶離開(kāi)某個(gè)輸入框時(shí),代表已經(jīng)輸入完了,我們可以對(duì)它進(jìn)行驗(yàn)證
onchange 域的內(nèi)容被改變。 應(yīng)用場(chǎng)景:通常用于表單元素,當(dāng)元素內(nèi)容被改變時(shí)觸發(fā)(select聯(lián)動(dòng))
onkeydown 某個(gè)鍵盤按鍵被按下。 應(yīng)用場(chǎng)景: 當(dāng)用戶在最后一個(gè)輸入框按下回車按鍵時(shí),表單提交.
onkeypress 某個(gè)鍵盤按鍵被按下并松開(kāi)。
onkeyup 某個(gè)鍵盤按鍵被松開(kāi)。
onload 一張頁(yè)面或一幅圖像完成加載。
onmousedown 鼠標(biāo)按鈕被按下。
onmousemove 鼠標(biāo)被移動(dòng)。
onmouseout 鼠標(biāo)從某元素移開(kāi)。
onmouseover 鼠標(biāo)移到某元素之上。
onselect 在文本框中的文本被選中時(shí)發(fā)生。
onsubmit 確認(rèn)按鈕被點(diǎn)擊,使用的對(duì)象是form。
```
onblur和onfocus事件
```
<input type="text" id="username" />
var inp = document.getElementById('username');
inp.onfocus = function () {
this.style.backgroundColor = '#f00';
}
inp.onblur = function () {
this.style.backgroundColor = '#00f';
}
```
onchange事件,域內(nèi)容發(fā)生變化時(shí)觸發(fā)
```
<input type="text" id="username" />
<select name="" id="book">
<option value="1">論語(yǔ)</option>
<option value="2">大學(xué)</option>
<option value="3">中庸</option>
<option value="4">孟子</option>
</select>
var inp = document.getElementById('username');
var s = document.getElementById('book');
s.onchange = function () {
inp.value = this.options[this.selectedIndex].innerText;
}
```
- 前言
- 一、css垂直居中的幾種實(shí)現(xiàn)方法
- 二、簡(jiǎn)單說(shuō)一下盒模型,說(shuō)下如何利用BFC解決外邊距重疊的問(wèn)題
- 三、說(shuō)一說(shuō)產(chǎn)生塌陷的原因以及清除浮動(dòng)的幾種方法
- 四、偽類和偽元素的區(qū)別?聊一下css選擇器的優(yōu)先級(jí)
- 五、css中的過(guò)渡和動(dòng)畫效果了解嗎
- 六、彈性盒模型了解嗎
- 七、簡(jiǎn)單說(shuō)下BOM和DOM的區(qū)別
- 八、如何解決瀏覽器的兼容性問(wèn)題?瀏覽器調(diào)優(yōu)都用到過(guò)哪些方法
- 九、之前寫過(guò)h5嗎?有遇到過(guò)哪些兼容性問(wèn)題?說(shuō)下怎么解決的
- 十、h5是如何做移動(dòng)端適配的?折行的時(shí)候如何實(shí)現(xiàn)不斷行
- 十一、聊一聊js中實(shí)現(xiàn)數(shù)組拷貝的常用方法
- 十二、聊聊js中的數(shù)據(jù)類型,如何用js實(shí)現(xiàn)一個(gè)對(duì)象的深拷貝
- 十三、偽數(shù)組和數(shù)組的區(qū)別?相互轉(zhuǎn)化的方法有哪些
- 十四、請(qǐng)介紹Js中有哪些循環(huán)遍歷的方法,關(guān)于數(shù)組常用的方法有哪些
- 十五、js中的reduce了解嗎?都用他解決過(guò)什么問(wèn)題
- 十六、事件冒泡和捕獲的執(zhí)行順序了解嗎?什么是事件委托
- 十七、call和apply的區(qū)別是什么?caller和callee的區(qū)別有哪些
- 十八、javascript中的this都有哪些用法
- 十九、怎么理解js中的原型鏈?如何實(shí)現(xiàn)繼承?實(shí)現(xiàn)繼承常用的方式有哪些
- 二十、聊一聊js的作用域和作用域鏈
- 二十一、js的閉包了解嗎?閉包的常見(jiàn)用法說(shuō)一下
- 二十二、setTimeout和setInterval的運(yùn)行機(jī)制了解嗎
- 二十三、函數(shù)的柯里化了解嗎?說(shuō)下函數(shù)柯里化應(yīng)用的場(chǎng)景
- 二十四、用js寫一個(gè)ajax的原生實(shí)現(xiàn)方法
- 二十五、js如何實(shí)現(xiàn)跨域?聊一聊你之前用到過(guò)的方法
- 二十六、聊一下cookie、session和token三者的區(qū)別及使用
- 二十七、用js實(shí)現(xiàn)一下數(shù)組去重和排序,有哪些方法可以實(shí)現(xiàn)
- 二十八、寫一個(gè)方法,統(tǒng)計(jì)一下html文檔的元素包括元素的數(shù)量
- 二十九、用js實(shí)現(xiàn)一個(gè)省市級(jí)聯(lián)效果
- 三十、用js實(shí)現(xiàn)一個(gè)輪播圖效果,簡(jiǎn)單說(shuō)下原理
- 三十一、請(qǐng)你實(shí)現(xiàn)一個(gè)大文件上傳和斷點(diǎn)續(xù)傳
- 三十二、什么是模塊化開(kāi)發(fā)?談下AMD、CMD、CommonJs和ES6的區(qū)別
- 三十三、es6了解嗎?說(shuō)幾個(gè)常見(jiàn)的新特性,set和weakSet的區(qū)別是什么
- 三十四、解構(gòu)賦值的用法了解嗎?如何實(shí)現(xiàn)對(duì)象和數(shù)組的嵌套和重命名
- 三十五、談?wù)勀銓?duì)promise的用法和理解
- 三十六、談?wù)勀銓?duì)es6中的Generator函數(shù)的認(rèn)識(shí)
- 三十七、談一下async-await的實(shí)現(xiàn)原理
- 三十八、用js實(shí)現(xiàn)一下觀察者模式?簡(jiǎn)單說(shuō)一下原理
- 三十九、了解JavaScript中的裝飾器嗎?聊一下JS中的getter與setter的用法
- 四十、聊一下正則表達(dá)式里的常見(jiàn)用法