2019前端基礎(chǔ)面試秘籍

一义屏、html和css部分
1、如何理解CSS的盒子模型恒界?
標(biāo)準(zhǔn)盒子模型:寬度=內(nèi)容的寬度(content)+ border + padding
低版本IE盒子模型:寬度=內(nèi)容寬度(content+border+padding)
2俺孙、BFC?

  • 什么是 BFC
    BFC(Block Formatting Context)格式化上下文拧晕,是 Web 頁(yè)面中盒模型布局的 CSS 渲染模式,指一個(gè)獨(dú)立的渲染區(qū)域或者說(shuō)是一個(gè)隔離的獨(dú)立容器梅垄。
  • 形成 BFC 的條件
    • 浮動(dòng)元素厂捞,float 除 none 以外的值
    • 定位元素,position(absolute队丝,fixed)
    • display 為以下其中之一的值 inline-block靡馁,table-cell,table-caption
    • overflow 除了 visible 以外的值(hidden机久,auto臭墨,scroll)
  • BFC 的特性
    • 內(nèi)部的 Box 會(huì)在垂直方向上一個(gè)接一個(gè)的放置。
    • 垂直方向上的距
      3膘盖、如何清除浮動(dòng)胧弛?
      不清楚浮動(dòng)會(huì)發(fā)生高度塌陷:浮動(dòng)元素父元素高度自適應(yīng)(父元素不寫高度時(shí),子元素寫了浮動(dòng)后衔憨,父元素會(huì)發(fā)生高度塌陷)
  • clear清除浮動(dòng)(添加空div法)在浮動(dòng)元素下方添加空div,并給該元素寫css樣式: {clear:both;height:0;overflow:hidden;}
  • 給浮動(dòng)元素父級(jí)設(shè)置高度
  • 父級(jí)同時(shí)浮動(dòng)(需要給父級(jí)同級(jí)元素添加浮動(dòng))
  • 父級(jí)設(shè)置成inline-block叶圃,其margin: 0 auto居中方式失效
  • 給父級(jí)添加overflow:hidden 清除浮動(dòng)方法
  • 萬(wàn)能清除法 after偽類 清浮動(dòng)(現(xiàn)在主流方法,推薦使用)
    .float_div:after{
    content:".";
    clear:both;
    display:block;
    height:0;
    overflow:hidden;
    visibility:hidden;
    }
    .float_div{
    zoom:1
    }
    4践图、用純CSS創(chuàng)建一個(gè)三角形的原理是什么掺冠?
    span {
    width: 0;
    height: 0;
    border-top: 40px solid transparent;
    border-left: 40px solid transparent;
    border-right: 40px solid transparent;
    border-bottom: 40px solid #ff0000;
    }
    5、css3實(shí)現(xiàn)0.5px的細(xì)線?
    /* css /
    .line {
    position: relative;
    }
    .line:after {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 1px;
    background-color: #000000;
    -webkit-transform: scaleY(.5);
    transform: scaleY(.5);
    }
    /
    html */
    <div class="line"></div>
    6德崭、css實(shí)現(xiàn)三欄布局
    左右固定斥黑,中間自適應(yīng)。
    flex方式
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
    .box {
    display: flex;
    justify-content: center;
    height: 200px;
    }
    .left {
    width: 200px;
    background-color: red;
    height: 100%;
    }
    .content {
    background-color: yellow;
    flex: 1;
    }
    .right {
    width: 200px;
    background-color: green;
    }
    </style>
    </head>
    <body>
    <div class="box">
    <div class="left"></div>
    <div class="content"></div>
    <div class="right"></div>
    </div>
    </body>
    </html>
    絕對(duì)定位方式
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
    .box {
    position: relative;
    height: 200px;
    }
    .left {
    width: 200px;
    background-color: red;
    left: 0;
    height: 100%;
    position: absolute;
    }
    .content {
    background-color: yellow;
    left: 200px;
    right: 200px;
    height: 100%;
    position: absolute;
    }
    .right {
    width: 200px;
    background-color: green;
    right: 0;
    height: 100%;
    position: absolute;
    }
    </style>
    </head>
    <body>
    <div class="box">
    <div class="left"></div>
    <div class="content"></div>
    <div class="right"></div>
    </div>
    </body>
    </html>
    浮動(dòng)方式
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
    .box {
    height: 200px;
    }
    .left {
    width: 200px;
    background-color: red;
    float: left;
    height: 100%;
    }
    .content {
    background-color: yellow;
    height: 100%;
    }
    .right {
    width: 200px;
    background-color: green;
    float: right;
    height: 100%;
    }
    </style>
    </head>
    <body>
    <div class="box">
    <div class="left"></div>
    <div class="right"></div>
    <div class="content"></div>
    </div>
    </body>
    </html>
    7眉厨、讓一個(gè)div垂直居中
    寬度和高度已知的
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
    .box {
    width: 400px;
    height: 200px;
    position: relative;
    background: red;
    }
    .content {
    width: 200px;
    height: 100px;
    position: absolute;
    top: 50%;
    left: 50%;
    margin-left: -100px;
    margin-top: -50px;
    background: green;
    }
    </style>
    </head>
    <body>
    <div class="box">
    <div class="content"></div>
    </div>
    </body>
    </html>
    寬度和高度未知
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
    .box {
    width: 400px;
    height: 200px;
    position: relative;
    background: red;
    }
    .content {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    background: green;
    }
    </style>
    </head>
    <body>
    <div class="box">
    <div class="content"></div>
    </div>
    </body>
    </html>
    flex布局
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
    .box {
    width: 400px;
    height: 200px;
    background: red;
    display: flex;
    justify-content: center;
    align-items: center;
    }
    .content {
    width: 200px;
    height: 100px;
    background: green;
    }
    </style>
    </head>
    <body>
    <div class="box">
    <div class="content"></div>
    </div>
    </body>
    </html>
    二锌奴、JS
    1、閉包
    閉包概念
    能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)憾股÷故瘢或簡(jiǎn)單理解為定義在一個(gè)函數(shù)內(nèi)部的函數(shù),內(nèi)部函數(shù)持有外部函數(shù)內(nèi)變量的引用服球。
    閉包用途
    1茴恰、讀取函數(shù)內(nèi)部的變量
    2、讓這些變量的值始終保持在內(nèi)存中斩熊。不會(huì)再f1調(diào)用后被自動(dòng)清除往枣。
    3、方便調(diào)用上下文的局部變量粉渠。利于代碼封裝分冈。
    原因:f1是f2的父函數(shù),f2被賦給了一個(gè)全局變量霸株,f2始終存在內(nèi)存中雕沉,f2的存在依賴f1,因此f1也始終存在內(nèi)存中淳衙,不會(huì)在調(diào)用結(jié)束后蘑秽,被垃圾回收機(jī)制回收饺著。
    閉包缺點(diǎn)
    1箫攀、由于閉包會(huì)使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大幼衰,所以不能濫用閉包靴跛,否則會(huì)造成網(wǎng)頁(yè)的性能問(wèn)題,在IE中可能導(dǎo)致內(nèi)存泄露渡嚣。解決方法是梢睛,在退出函數(shù)之前,將不使用的局部變量全部刪除识椰。
    2绝葡、閉包會(huì)在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值腹鹉。所以藏畅,如果你把父函數(shù)當(dāng)作對(duì)象(object)使用,把閉包當(dāng)作它的公用方法(Public Method)功咒,把內(nèi)部變量當(dāng)作它的私有屬性(private value)愉阎,這時(shí)一定要小心绞蹦,不要隨便改變父函數(shù)內(nèi)部變量的值。
    閉包應(yīng)用場(chǎng)景
    閉包應(yīng)用場(chǎng)景之setTimeout
    //setTimeout傳遞的第一個(gè)函數(shù)不能帶參數(shù)
    setTimeout((param) => {
    alert(param)
    }, 1000);
    //通過(guò)閉包可以實(shí)現(xiàn)傳參效果
    function func(param) {
    return function() {
    alert(param)
    }
    }
    var f1 = func('汪某');
    setTimeout(f1, 1000)//汪某
    2榜旦、js中函數(shù)執(zhí)行
    在 ES5.1 里面函數(shù)是這樣執(zhí)行的(不討論use strict和一些特殊情況幽七,JS好復(fù)雜的),按如下順序執(zhí)行:
  1. 確定“this”的值 (確切的來(lái)說(shuō)溅呢,this在JS里面不是一個(gè)變量名而是一個(gè)關(guān)鍵字)
  2. 創(chuàng)建一個(gè)新的作用域
  3. 處理形參/實(shí)參(沒(méi)有定義過(guò)才聲明澡屡,無(wú)論如何都重新賦值,沒(méi)有對(duì)應(yīng)實(shí)參則賦值為"undefined"):
    對(duì)于每一個(gè)傳入的實(shí)參咐旧,按照從左往右的順序依次執(zhí)行:如果對(duì)應(yīng)的形參在本作用域中還沒(méi)有定義挪蹭,則在本作用域中聲明形參,并賦值休偶。如果已經(jīng)定義過(guò)了梁厉,則重新給其賦值。(沒(méi)有對(duì)應(yīng)實(shí)參則賦值為"undefined")(沒(méi)有定義:就是“沒(méi)有聲明”的意思)
  4. 處理函數(shù)定義(沒(méi)有定義過(guò)才聲明踏兜,無(wú)論如何都重新賦值):
    對(duì)該函數(shù)中所有的定義的函數(shù)词顾,按照代碼寫的順序依次執(zhí)行:如果這個(gè)變量名在本作用域中還沒(méi)有定義,則在本作用域中聲明這個(gè)函數(shù)名碱妆,并且賦值為對(duì)應(yīng)的函數(shù)肉盹,如果定義了這個(gè)變量,在可寫的情況下重新給這個(gè)變量賦值為這個(gè)函數(shù)疹尾,否則拋出異常上忍。
  5. 處理 "arguments"(沒(méi)有定義過(guò)才聲明和賦值):
    如果在本作用域中沒(méi)有定義 arguments,則在本作用域中聲明arguments并給其賦值纳本。
  6. 處理變量聲明(沒(méi)有定義過(guò)才聲明窍蓝,不賦值):
    對(duì)于所有變量聲明,按照代碼寫的順序依次執(zhí)行:如果在本作用域中沒(méi)有定義這個(gè)變量繁成,則在本作用域中聲明這個(gè)變量吓笙,賦值為undefined
  7. 然后執(zhí)行函數(shù)代碼。(當(dāng)然是去變量定義里面的 var 執(zhí)行)
    3巾腕、new一個(gè)對(duì)象的過(guò)程中發(fā)生了什么嘛
  8. 創(chuàng)建空對(duì)象面睛;
    var obj = {};
  9. 設(shè)置新對(duì)象的constructor屬性為構(gòu)造函數(shù)的名稱,設(shè)置新對(duì)象的proto屬性指向構(gòu)造函數(shù)的prototype對(duì)象尊搬;
    obj.proto = ClassA.prototype;
  10. 使用新對(duì)象調(diào)用函數(shù)叁鉴,函數(shù)中的this被指向新實(shí)例對(duì)象:
    ClassA.call(obj);//{}.構(gòu)造函數(shù)();
  11. 將初始化完畢的新對(duì)象地址,保存到等號(hào)左邊的變量中
    4佛寿、宏任務(wù)跟微任務(wù)
    macro-task(宏任務(wù)):包括整體代碼script幌墓,setTimeout,setInterval
    micro-task(微任務(wù)):Promise,process.nextTick
    這一次克锣,徹底弄懂 JavaScript 執(zhí)行機(jī)制
    5茵肃、防抖和節(jié)流
    綜合應(yīng)用場(chǎng)景
    防抖(debounce):就是指觸發(fā)事件后在 n 秒內(nèi)函數(shù)只能執(zhí)行一次,如果在 n 秒內(nèi)又觸發(fā)了事件袭祟,則會(huì)重新計(jì)算函數(shù)執(zhí)行時(shí)間验残。
    search搜索聯(lián)想,用戶在不斷輸入值時(shí)巾乳,用防抖來(lái)節(jié)約請(qǐng)求資源您没。
    window觸發(fā)resize的時(shí)候,不斷的調(diào)整瀏覽器窗口大小會(huì)不斷的觸發(fā)這個(gè)事件胆绊,用防抖來(lái)讓其只觸發(fā)一次
    節(jié)流(throttle):就是指連續(xù)觸發(fā)事件但是在 n 秒中只執(zhí)行一次函數(shù)氨鹏。節(jié)流會(huì)稀釋函數(shù)的執(zhí)行頻率。
    鼠標(biāo)不斷點(diǎn)擊觸發(fā)压状,mousedown(單位時(shí)間內(nèi)只觸發(fā)一次)
    監(jiān)聽滾動(dòng)事件仆抵,比如是否滑到底部自動(dòng)加載更多,用throttle來(lái)判斷 所謂防抖种冬,就是指觸發(fā)事件后在 n 秒內(nèi)函數(shù)只能執(zhí)行一次镣丑,如果在 n 秒內(nèi)又觸發(fā)了事件,則會(huì)重新計(jì)算函數(shù)執(zhí)行時(shí)間娱两。
    防抖函數(shù)分為非立即執(zhí)行版和立即執(zhí)行版莺匠。
    非立即執(zhí)行版的意思是觸發(fā)事件后函數(shù)不會(huì)立即執(zhí)行,而是在 n 秒后執(zhí)行十兢,如果在 n 秒內(nèi)又觸發(fā)了事件趣竣,則會(huì)重新計(jì)算函數(shù)執(zhí)行時(shí)間。
    立即執(zhí)行版的意思是觸發(fā)事件后函數(shù)會(huì)立即執(zhí)行旱物,然后 n 秒內(nèi)不觸發(fā)事件才能繼續(xù)執(zhí)行函數(shù)的效果遥缕。
    /**
  • @desc 函數(shù)防抖
  • @param func 函數(shù)
  • @param wait 延遲執(zhí)行毫秒數(shù)
  • @param immediate true 表立即執(zhí)行,false 表非立即執(zhí)行
    /
    function debounce(func,wait,immediate) {
    let timeout;
    return function () {
    let context = this;
    let args = arguments;
    if (timeout) clearTimeout(timeout);
    if (immediate) {
    var callNow = !timeout;
    timeout = setTimeout(() => {
    timeout = null;
    }, wait)
    if (callNow) func.apply(context, args)
    }
    else {
    timeout = setTimeout(function(){
    func.apply(context, args)
    }, wait);
    }
    }
    }
    所謂節(jié)流异袄,就是指連續(xù)觸發(fā)事件但是在 n 秒中只執(zhí)行一次函數(shù)通砍。 節(jié)流會(huì)稀釋函數(shù)的執(zhí)行頻率玛臂。
    對(duì)于節(jié)流烤蜕,一般有兩種方式可以實(shí)現(xiàn),分別是時(shí)間戳版和定時(shí)器版迹冤。
    時(shí)間戳版的函數(shù)觸發(fā)是在時(shí)間段內(nèi)開始的時(shí)候
    定時(shí)器版的函數(shù)觸發(fā)是在時(shí)間段內(nèi)結(jié)束的時(shí)候讽营。
    /
    *
  • @desc 函數(shù)節(jié)流
  • @param func 函數(shù)
  • @param wait 延遲執(zhí)行毫秒數(shù)
  • @param type 1 表時(shí)間戳版,2 表定時(shí)器版
    /
    function throttle(func, wait ,type) {
    if(type===1){
    let previous = 0;
    }else if(type===2){
    let timeout;
    }
    return function() {
    let context = this;
    let args = arguments;
    if(type===1){
    let now = Date.now();
    if (now - previous > wait) {
    func.apply(context, args);
    previous = now;
    }
    }else if(type===2){
    if (!timeout) {
    timeout = setTimeout(() => {
    timeout = null;
    func.apply(context, args)
    }, wait)
    }
    }
    }
    }
    6泡徙、數(shù)組的常用方法
    改變?cè)瓟?shù)組的方法
    splice() 添加/刪除數(shù)組元素
    語(yǔ)法:arrayObject.splice(index,howmany,item1,.....,itemX)
    參數(shù):
    1.index:必需橱鹏。整數(shù),規(guī)定添加/刪除項(xiàng)目的位置,使用負(fù)數(shù)可從數(shù)組結(jié)尾處規(guī)定位置莉兰。
    2.howmany:可選挑围。要?jiǎng)h除的項(xiàng)目數(shù)量。如果設(shè)置為 0糖荒,則不會(huì)刪除項(xiàng)目杉辙。
    3.item1, ..., itemX: 可選。向數(shù)組添加的新項(xiàng)目捶朵。
    返回值: 如果有元素被刪除,返回包含被刪除項(xiàng)目的新數(shù)組蜘矢。
    sort() 數(shù)組排序
    語(yǔ)法:arrayObject.sort(sortby)
    參數(shù):
    1.sortby 可選。規(guī)定排序順序综看。必須是函數(shù)品腹。。
    返回值: 返回包排序后的新數(shù)組红碑。
    pop() 刪除一個(gè)數(shù)組中的最后的一個(gè)元素
    語(yǔ)法:arrayObject.pop()
    參數(shù):無(wú)
    返回值: 返回被刪除的元素舞吭。
    shift() 刪除數(shù)組的第一個(gè)元素
    語(yǔ)法:arrayObject.shift()
    參數(shù):無(wú)
    返回值: 返回被刪除的元素。
    push() 向數(shù)組的末尾添加元素
    語(yǔ)法:arrayObject.push(newelement1,newelement2,....,newelementX)
    參數(shù):
    1.newelement1 必需析珊。要添加到數(shù)組的第一個(gè)元素镣典。
    2.newelement2 可選。要添加到數(shù)組的第二個(gè)元素唾琼。
    3.newelementX 可選兄春。可添加若干個(gè)元素锡溯。
    返回值: 返回被刪除的元素赶舆。
    unshift() 向數(shù)組的開頭添加一個(gè)或更多元素
    語(yǔ)法:arrayObject.unshift(newelement1,newelement2,....,newelementX)
    參數(shù):
    1.newelement1 必需。要添加到數(shù)組的第一個(gè)元素祭饭。
    2.newelement2 可選芜茵。要添加到數(shù)組的第二個(gè)元素。
    3.newelementX 可選倡蝙【糯可添加若干個(gè)元素。
    返回值: arrayObject 的新長(zhǎng)度寺鸥。猪钮。
    reverse() 顛倒數(shù)組中元素的順序
    語(yǔ)法:arrayObject.reverse()
    參數(shù):無(wú)
    返回值: 顛倒后的新數(shù)組。
    copyWithin() 指定位置的成員復(fù)制到其他位置
    語(yǔ)法: array.copyWithin(target, start = 0, end = this.length)
    參數(shù):
    1.target(必需):從該位置開始替換數(shù)據(jù)胆建。如果為負(fù)值烤低,表示倒數(shù)。
    2.start(可選):從該位置開始讀取數(shù)據(jù)笆载,默認(rèn)為 0扑馁。如果為負(fù)值涯呻,表示倒數(shù)。
    3.end(可選):到該位置前停止讀取數(shù)據(jù)腻要,默認(rèn)等于數(shù)組長(zhǎng)度复罐。如果為負(fù)值,表示倒數(shù)雄家。
    返回值: 返回當(dāng)前數(shù)組市栗。
    fill() 填充數(shù)組
    語(yǔ)法: array.fill(value, start, end)
    參數(shù):
    1.value 必需。填充的值咳短。
    2.start 可選填帽。開始填充位置。
    3.end 可選咙好。停止填充位置 (默認(rèn)為 array.length)
    返回值: 返回當(dāng)前數(shù)組篡腌。
    不改變?cè)瓟?shù)組的方法
    slice() 淺拷貝數(shù)組的元素
    語(yǔ)法: array.slice(begin, end);
    參數(shù):
    1.begin(可選): 索引數(shù)值,接受負(fù)值,從該索引處開始提取原數(shù)組中的元素,默認(rèn)值為0勾效。
    2.end(可選):索引數(shù)值(不包括),接受負(fù)值嘹悼,在該索引處前結(jié)束提取原數(shù)組元素,默認(rèn)值為數(shù)組末尾(包括最后一個(gè)元素)层宫。
    返回值: 返回一個(gè)從開始到結(jié)束(不包括結(jié)束)選擇的數(shù)組的一部分淺拷貝到一個(gè)新數(shù)組對(duì)象杨伙,且原數(shù)組不會(huì)被修改。
    join() 數(shù)組轉(zhuǎn)字符串
    語(yǔ)法:array.join(str)
    參數(shù):
    1.str(可選): 指定要使用的分隔符萌腿,默認(rèn)使用逗號(hào)作為分隔符限匣。
    返回值: 返回生成的字符串。
    concat() 合并兩個(gè)或多個(gè)數(shù)組
    語(yǔ)法: var newArr =oldArray.concat(arrayX,arrayX,......,arrayX)
    參數(shù):
    1.arrayX(必須):該參數(shù)可以是具體的值毁菱,也可以是數(shù)組對(duì)象米死。可以是任意多個(gè)贮庞。
    返回值: 返回返回合并后的新數(shù)組峦筒。
    indexOf() 查找數(shù)組是否存在某個(gè)元素
    語(yǔ)法:array.indexOf(searchElement,fromIndex)
    參數(shù):
    1.searchElement(必須):被查找的元素
    2.fromIndex(可選):開始查找的位置(不能大于等于數(shù)組的長(zhǎng)度,返回-1)窗慎,接受負(fù)值物喷,默認(rèn)值為0。
    返回值: 返回下標(biāo)
    lastIndexOf() 查找指定元素在數(shù)組中的最后一個(gè)位置
    語(yǔ)法:arr.lastIndexOf(searchElement,fromIndex)
    參數(shù):
    1.searchElement(必須): 被查找的元素
    2.fromIndex(可選): 逆向查找開始位置遮斥,默認(rèn)值數(shù)組的長(zhǎng)度-1峦失,即查找整個(gè)數(shù)組。
    返回值: 方法返回指定元素,在數(shù)組中的最后一個(gè)的索引伏伐,如果不存在則返回 -1宠进。(從數(shù)組后面往前查找)
    includes() 查找數(shù)組是否包含某個(gè)元素
    語(yǔ)法: array.includes(searchElement,fromIndex=0)
    參數(shù):
    1.searchElement(必須):被查找的元素
    2.fromIndex(可選):默認(rèn)值為0,參數(shù)表示搜索的起始位置藐翎,接受負(fù)值材蹬。正值超過(guò)數(shù)組長(zhǎng)度,數(shù)組不會(huì)被搜索吝镣,返回false堤器。負(fù)值絕對(duì)值超過(guò)長(zhǎng)數(shù)組度,重置從0開始搜索末贾。
    返回值: 返回布爾
    7闸溃、立即執(zhí)行函數(shù)
    聲明一個(gè)匿名函數(shù),馬上調(diào)用這個(gè)匿名函數(shù)拱撵。目的是保護(hù)內(nèi)部變量不受污染辉川。
    (function(n1, n2) {
    console.log("這是匿名函數(shù)的自執(zhí)行的第一種寫法,結(jié)果為:" + (n1 + n2))
    })(10, 100);
    (function start(n1, n2) {
    console.log("這是函數(shù)聲明方式的自執(zhí)行的第一種寫法拴测,結(jié)果為:" + (n1 + n2))
    })(10, 100);
    (function(n1, n2) {
    console.log("這是匿名函數(shù)的自執(zhí)行的第二種寫法乓旗,結(jié)果為:" + (n1 + n2))
    }(10, 100));
    (function start(n1, n2) {
    console.log("這是函數(shù)聲明方式的自執(zhí)行的第二種寫法,結(jié)果為:" + (n1 + n2))
    }(10, 100));
    8集索、js原型和原型鏈
    每個(gè)對(duì)象都會(huì)在其內(nèi)部初始化一個(gè)屬性屿愚,就是prototype(原型),當(dāng)我們?cè)L問(wèn)一個(gè)對(duì)象的屬性時(shí)务荆,如果這個(gè)對(duì)象內(nèi)部不存在這個(gè)屬性妆距,那么他就會(huì)去prototype里找這個(gè)屬性,這個(gè)prototype又會(huì)有自己的prototype函匕,于是就這樣一直找下去娱据,也就是我們平時(shí)所說(shuō)的原型鏈的概念。
    關(guān)系:instance.constructor.prototype = instance.proto
    特點(diǎn):JavaScript對(duì)象是通過(guò)引用來(lái)傳遞的盅惜,我們創(chuàng)建的每個(gè)新對(duì)象實(shí)體中并沒(méi)有一份屬于自己的原型副本吸耿,當(dāng)我們修改原型時(shí),與之相關(guān)的對(duì)象也會(huì)繼承這一改變酷窥。 當(dāng)我們需要一個(gè)屬性時(shí)咽安,JavaScript引擎會(huì)先看當(dāng)前對(duì)象中是否有這個(gè)屬性,如果沒(méi)有的話蓬推,就會(huì)查找它的prototype對(duì)象是否有這個(gè)屬性妆棒,如此遞推下去,一致檢索到Object內(nèi)建對(duì)象沸伏。
    function Func(){}
    Func.prototype.name = "汪某";
    Func.prototype.getInfo = function() {
    return this.name;
    }
    var person = new Func();
    console.log(person.getInfo());//"汪某"
    console.log(Func.prototype);//Func { name = "汪某", getInfo = function() }
    參考:js原型和原型鏈
    9糕珊、js中call,apply,bind
    參考:JavaScript中call,apply,bind方法的總結(jié)。
    10毅糟、Promise
    一句話概括Promise:Promise對(duì)象用于異步操作红选,它表示一個(gè)尚未完成且預(yù)計(jì)在未來(lái)完成的異步操作。
    promise是用來(lái)解決兩個(gè)問(wèn)題的:
    回調(diào)地獄姆另,代碼難以維護(hù)喇肋,常常第一個(gè)的函數(shù)的輸出是第二個(gè)函數(shù)的輸入這種現(xiàn)象
    promise可以支持多個(gè)并發(fā)的請(qǐng)求坟乾,獲取并發(fā)請(qǐng)求中的數(shù)據(jù)
    這個(gè)promise可以解決異步的問(wèn)題,本身不能說(shuō)promise是異步的
    /
    Promise 的簡(jiǎn)單實(shí)現(xiàn)*/
    class MyPromise {
    constructor(fn) {
    this.resolvedCallbacks = [];
    this.rejectedCallbacks = [];
    this.state = "PADDING";
    this.value = "";
    fn(this.resolve.bind(this), this.reject.bind(this));
    }
    resolve(value) {
    if (this.state === "PADDING") {
    this.state = "RESOLVED";
    this.value = value;
    this.resolvedCallbacks.forEach(cb => cb());
    }
    }
    reject(value) {
    if (this.state === "PADDING") {
    this.state = "REJECTED";
    this.value = value;
    this.rejectedCallbacks.forEach(cb => cb());
    }
    }
    then(resolve = function() {}, reject = function() {}) {
    if (this.state === "PADDING") {
    this.resolvedCallbacks.push(resolve);
    this.rejectedCallbacks.push(reject);
    }
    if (this.state === "RESOLVED") {
    resolve(this.value);
    }
    if (this.state === "REJECTED") {
    reject(this.value);
    }
    }
    }
    11蝶防、async/await
    如何使用 Async 函數(shù)
    async function timeout(ms) {
    await new Promise((resolve) => {
    setTimeout(resolve, ms);
    });
    }
    async function asyncPrint(value, ms) {
    await timeout(ms);
    console.log(value);
    }
    asyncPrint('hello world', 50);
    上面代碼指定50毫秒以后甚侣,輸出hello world。 進(jìn)一步說(shuō)间学,async函數(shù)完全可以看作多個(gè)異步操作殷费,包裝成的一個(gè) Promise 對(duì)象,而await命令就是內(nèi)部then命令的語(yǔ)法糖低葫。
    待補(bǔ)充详羡。。嘿悬。
    12实柠、深拷貝、淺拷貝
    淺拷貝和深拷貝都只針對(duì)于引用數(shù)據(jù)類型鹊漠,淺拷貝只復(fù)制指向某個(gè)對(duì)象的指針主到,而不復(fù)制對(duì)象本身,新舊對(duì)象還是共享同一塊內(nèi)存躯概;但深拷貝會(huì)另外創(chuàng)造一個(gè)一模一樣的對(duì)象登钥,新對(duì)象跟原對(duì)象不共享內(nèi)存,修改新對(duì)象不會(huì)改到原對(duì)象娶靡;
    區(qū)別:淺拷貝只復(fù)制對(duì)象的第一層屬性牧牢、深拷貝可以對(duì)對(duì)象的屬性進(jìn)行遞歸復(fù)制;
    淺拷貝的實(shí)現(xiàn)方式
    自定義函數(shù)
    function simpleCopy (initalObj) {
    var obj = {};
    for ( var i in initalObj) {
    obj[i] = initalObj[i];
    }
    return obj;
    }
    ES6 的 Object.assign()
    let newObj = Object.assign({}, obj);
    ES6 的對(duì)象擴(kuò)展
    let newObj = {...obj};
    深拷貝的實(shí)現(xiàn)方式
    JSON.stringify 和 JSON.parse
    用 JSON.stringify 把對(duì)象轉(zhuǎn)換成字符串姿锭,再用 JSON.parse 把字符串轉(zhuǎn)換成新的對(duì)象塔鳍。
    let newObj = JSON.parse(JSON.stringify(obj));
    lodash
    用 lodash 函數(shù)庫(kù)提供的 _.cloneDeep 方法實(shí)現(xiàn)深拷貝。
    var _ = require('lodash');
    var newObj = _.cloneDeep(obj);
    自己封裝
    function deepClone(obj) {
    let objClone = Array.isArray(obj) ? [] : {};
    if (obj && typeof obj === "object") {
    // for...in 會(huì)把繼承的屬性一起遍歷
    for (let key in obj) {
    // 判斷是不是自有屬性呻此,而不是繼承屬性
    if (obj.hasOwnProperty(key)) {
    //判斷ojb子元素是否為對(duì)象或數(shù)組轮纫,如果是,遞歸復(fù)制
    if (obj[key] && typeof obj[key] === "object") {
    objClone[key] = this.deepClone(obj[key]);
    } else {
    //如果不是焚鲜,簡(jiǎn)單復(fù)制
    objClone[key] = obj[key];
    }
    }
    }
    }
    return objClone;
    }
    13掌唾、跨域
    跨域需要針對(duì)瀏覽器的同源策略來(lái)理解,同源策略指的是請(qǐng)求必須是同一個(gè)端口忿磅,同一個(gè)協(xié)議糯彬,同一個(gè)域名,不同源的客戶端腳本在沒(méi)有明確授權(quán)的情況下葱她,不能讀寫對(duì)方資源撩扒。
    受瀏覽器同源策略的影響,不是同源的腳本不能操作其他源下面的對(duì)象吨些。想要操作另一個(gè)源下的對(duì)象是就需要跨域搓谆。
    jsonp
    iframe
    跨域資源共享(CORS)
    nginx 代理跨域
    14炒辉、for in 和 for of
    for in
    1.一般用于遍歷對(duì)象的可枚舉屬性。以及對(duì)象從構(gòu)造函數(shù)原型中繼承的屬性挽拔。對(duì)于每個(gè)不同的屬性辆脸,語(yǔ)句都會(huì)被執(zhí)行但校。
    2.不建議使用for in 遍歷數(shù)組螃诅,因?yàn)檩敵龅捻樞蚴遣还潭ǖ摹?br> 3.如果迭代的對(duì)象的變量值是null或者undefined, for in不執(zhí)行循環(huán)體,建議在使用for in循環(huán)之前状囱,先檢查該對(duì)象的值是不是null或者undefined
    for of
    1.for…of 語(yǔ)句在可迭代對(duì)象(包括 Array术裸,Map,Set亭枷,String袭艺,TypedArray,arguments 對(duì)象等等)上創(chuàng)建一個(gè)迭代循環(huán)叨粘,調(diào)用自定義迭代鉤子猾编,并為每個(gè)不同屬性的值執(zhí)行語(yǔ)句
    遍歷對(duì)象
    var s = {
    a: 1,
    b: 2,
    c: 3
    }
    var s1 = Object.create(s);
    for (var prop in s1) {
    console.log(prop); //a b c
    console.log(s1[prop]); //1 2 3
    }
    for (let prop of s1) {
    console.log(prop); //報(bào)錯(cuò)如下 Uncaught TypeError: s1 is not iterable
    }
    for (let prop of Object.keys(s1)) {
    console.log(prop); // a b c
    console.log(s1[prop]); //1 2 3
    }
    15、如何阻止冒泡升敲?
    冒泡型事件:事件按照從最特定的事件目標(biāo)到最不特定的事件目標(biāo)(document對(duì)象)的順序觸發(fā)答倡。
    w3c的方法是e.stopPropagation(),IE則是使用e.cancelBubble = true驴党。
    //阻止冒泡行為
    function stopBubble(e) {
    //如果提供了事件對(duì)象瘪撇,則這是一個(gè)非IE瀏覽器
    if ( e && e.stopPropagation )
    //因此它支持W3C的stopPropagation()方法
    e.stopPropagation();
    else
    //否則,我們需要使用IE的方式來(lái)取消事件冒泡
    window.event.cancelBubble = true;
    }
    16港庄、如何阻止默認(rèn)事件倔既?
    w3c的方法是e.preventDefault(),IE則是使用e.returnValue = false
    //阻止瀏覽器的默認(rèn)行為
    function stopDefault( e ) {
    //阻止默認(rèn)瀏覽器動(dòng)作(W3C)
    if ( e && e.preventDefault )
    e.preventDefault();
    //IE中阻止函數(shù)器默認(rèn)動(dòng)作的方式
    else
    window.event.returnValue = false;
    return false;
    }
    17鹏氧、var,let,const
    //變量提升
    console.log(a); // undefined
    console.log(b); // 報(bào)錯(cuò)
    console.log(c); // 報(bào)錯(cuò)
    var a = 1;
    let b = 2;
    const c = 3;
    // 全局聲明
    console.log(window.a) // 1
    // 重復(fù)聲明
    let b = 200;//報(bào)錯(cuò)
    其實(shí)這里很容易理解渤涌,var是可以變量提升的。而let和const是必須聲明后才能調(diào)用的把还。 對(duì)于let和const來(lái)說(shuō)实蓬,這里就是暫緩性死區(qū)。
    18笨篷、Class
    es6新增的Class其實(shí)也是語(yǔ)法糖瞳秽,js底層其實(shí)沒(méi)有class的概念的,其實(shí)也是原型繼承的封裝率翅。
    class People {
    constructor(props) {
    this.props = props;
    this.name = '汪某';
    }
    callMyName() {
    console.log(this.name);
    }
    }
    class Name extends People { // extends 其實(shí)就是繼承了哪個(gè)類
    constructor(props) {
    // super相當(dāng)于 把類的原型拿過(guò)來(lái)
    // People.call(this, props)
    super(props)
    }
    callMyApple() {
    console.log('我是汪某练俐!')
    }
    }
    let a = new Name('啊啊啊')
    a.callMyName(); //汪某
    a.callMyApple(); // 我是汪某!
    19冕臭、Set
    Set數(shù)據(jù)結(jié)構(gòu)類似數(shù)組腺晾,但所有成員的值唯一燕锥。
    let a = new Set();
    [1,2,2,1,3,4,5,4,5].forEach(x=>a.add(x));
    for(let k of a){
    console.log(k)
    };
    // 1 2 3 4 5
    基本使用
    let a = new Set([1,2,3,3,4]);
    [...a]; // [1,2,3,4]
    a.size; // 4
    // 數(shù)組去重
    [...new Set([1,2,3,4,4,4])];// [1,2,3,4]
    方法
    add(value):添加某個(gè)值,返回 Set 結(jié)構(gòu)本身悯蝉。
    delete(value):刪除某個(gè)值归形,返回一個(gè)布爾值,表示刪除是否成功鼻由。
    has(value):返回一個(gè)布爾值暇榴,表示該值是否為Set的成員。
    clear():清除所有成員蕉世,沒(méi)有返回值蔼紧。
    let a = new Set();
    a.add(1).add(2); // a => Set(2) {1, 2}
    a.has(2); // true
    a.has(3); // false
    a.delete(2); // true a => Set(1) {1}
    a.clear(); // a => Set(0) {}
    20、Map
    Map結(jié)構(gòu)提供了“值—值”的對(duì)應(yīng)狠轻,是一種更完善的 Hash 結(jié)構(gòu)實(shí)現(xiàn)奸例。
    let a = new Map();
    let b = {name: 'leo' };
    a.set(b,'my name'); // 添加值
    a.get(b); // 獲取值
    a.size; // 獲取總數(shù)
    a.has(b); // 查詢是否存在
    a.delete(b); // 刪除一個(gè)值
    a.clear(); // 清空所有成員 無(wú)返回
    基本使用
    傳入數(shù)組作為參數(shù),指定鍵值對(duì)的數(shù)組向楼。
    let a = new Map([
    ['name','wzx'],
    ['age',23]
    ])
    如果對(duì)同一個(gè)鍵多次賦值查吊,后面的值將覆蓋前面的值。
    let a = new Map();
    a.set(1,'aaa').set(1,'bbb');
    a.get(1); // 'bbb'
    如果讀取一個(gè)未知的鍵湖蜕,則返回undefined逻卖。
    new Map().get('asdsad'); // undefined
    同樣的值的兩個(gè)實(shí)例,在 Map 結(jié)構(gòu)中被視為兩個(gè)鍵重荠。
    let a = new Map();
    let a1 = ['aaa'];
    let a2 = ['aaa'];
    a.set(a1,111).set(a2,222);
    a.get(a1); // 111
    a.get(a2); // 222
    方法
    keys():返回鍵名的遍歷器箭阶。
    values():返回鍵值的遍歷器。
    entries():返回所有成員的遍歷器戈鲁。
    forEach():遍歷 Map 的所有成員仇参。
    let a = new Map([
    ['name', 'leo'],
    ['age', 18]
    ])
    for (let i of a.keys()) {
    console.log(i)
    };
    //name
    //age
    for (let i of a.values()) {
    console.log(i)
    };
    //leo
    //18
    for (let i of a.entries()) {
    console.log(i)
    };
    //["name", "leo"]
    a.forEach((v, k, m) => {
    console.log(key:${k},value:${v},map:${m})
    })
    //["age", 18]
    三、手?jǐn)]代碼
    1婆殿、實(shí)現(xiàn)一個(gè)new操作符
    function New(func) {
    var res = {};
    if (func.prototype !== null) {
    res.proto = func.prototype;
    }
    var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));
    if ((typeof ret === "object" || typeof ret === "function") && ret !== null) {
    return;
    ret;
    }
    return;
    res;
    }
    var obj = New(A, 1, 2);
    // equals to
    var obj = new A(1, 2);
    2诈乒、實(shí)現(xiàn)一個(gè)call或 apply
    call
    Function.prototype.call2 = function (context) {
    var context = context || window;
    context.fn = this;
    var args = [];
    for(var i = 1, len = arguments.length; i < len; i++) {
    args.push('arguments[' + i + ']');
    }
    var result = eval('context.fn(' + args +')');
    delete context.fn
    return result;
    }
    apply
    Function.prototype.apply2 = function (context, arr) {
    var context = Object(context) || window;
    context.fn = this;
    var result;
    if (!arr) {
    result = context.fn();
    }
    else {
    var args = [];
    for (var i = 0, len = arr.length; i < len; i++) {
    args.push('arr[' + i + ']');
    }
    result = eval('context.fn(' + args + ')')
    }
    delete context.fn
    return result;
    }
    參考:JavaScript深入之call和apply的模擬實(shí)現(xiàn)
    3、實(shí)現(xiàn)一個(gè)Function.bind
    Function.prototype.bind2 = function (context) {
    if (typeof this !== "function") {
    throw new Error("Function.prototype.bind - what is trying to be bound is not callable");
    }
    var self = this;
    var args = Array.prototype.slice.call(arguments, 1);
    var fNOP = function () {};
    var fbound = function () {
    self.apply(this instanceof self ? this : context, args.concat(Array.prototype.slice.call(arguments)));
    }
    fNOP.prototype = this.prototype;
    fbound.prototype = new fNOP();
    return fbound;
    }
    參考:JavaScript深入之bind的模擬實(shí)現(xiàn)
    4婆芦、實(shí)現(xiàn)一個(gè)繼承
    function Parent(name) {
    this.name = name;
    }
    Parent.prototype.sayName = function() {
    console.log('parent name:', this.name);
    }
    function Child(name, parentName) {
    Parent.call(this, parentName);
    this.name = name;
    }
    function create(proto) {
    function F() {}
    F.prototype = proto;
    return new F();
    }
    Child.prototype = create(Parent.prototype);
    Child.prototype.sayName = function() {
    console.log('child name:', this.name);
    }
    Child.prototype.constructor = Child;
    var parent = new Parent('汪某');
    parent.sayName();// parent name: 汪某
    var child = new Child('son', '汪某');
    5怕磨、手寫一個(gè)Promise(中高級(jí)必考)
    面試夠用版
    function myPromise(constructor) {
    let self = this;
    self.status = "pending"
    //定義狀態(tài)改變前的初始狀態(tài)
    self.value = undefined;
    //定義狀態(tài)為resolved的時(shí)候的狀態(tài)
    self.reason = undefined;
    //定義狀態(tài)為rejected的時(shí)候的狀態(tài)
    function resolve(value) {
    //兩個(gè)==="pending",保證了狀態(tài)的改變是不可逆的
    if (self.status === "pending") {
    self.value = value;
    self.status = "resolved";
    }
    }
    function reject(reason) {
    //兩個(gè)==="pending"消约,保證了狀態(tài)的改變是不可逆的
    if (self.status === "pending") {
    self.reason = reason;
    self.status = "rejected";
    }
    }
    //捕獲構(gòu)造異常
    try {
    constructor(resolve, reject);
    } catch (e) {
    reject(e);
    }
    }
    //同時(shí)肠鲫,需要在 myPromise的原型上定義鏈?zhǔn)秸{(diào)用的 then方法:
    myPromise.prototype.then = function(onFullfilled, onRejected) {
    let self = this;
    switch (self.status) {
    case "resolved":
    onFullfilled(self.value);
    break;
    case "rejected":
    onRejected(self.reason);
    break;
    default:
    }
    }
    //測(cè)試一下:
    var p = new myPromise(function(resolve, reject) {
    resolve(1)
    });
    p.then(function(x) {
    console.log(x)
    })
    6、手寫防抖(Debouncing)和節(jié)流(Throttling)
    // 防抖函數(shù)
    function debounce(fn, wait = 50, immediate) {
    let timer;
    return function() {
    if (immediate) {
    fn.apply(this, arguments)
    }
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
    fn.apply(this, arguments)
    }, wait)
    }
    }
    // 節(jié)流函數(shù)
    function throttle(fn, wait) {
    let prev = new Date();
    return function() {
    const args = arguments;
    const now = new Date();
    if (now - prev > wait) {
    fn.apply(this, args);
    prev = new Date();
    }
    }
    }
    7或粮、手寫一個(gè)JS深拷貝
    面試版
    function deepCopy(obj) {
    //判斷是否是簡(jiǎn)單數(shù)據(jù)類型导饲,
    if (typeof obj == "object") {
    //復(fù)雜數(shù)據(jù)類型
    var result = obj.constructor == Array ? [] : {};
    for (let i in obj) {
    result[i] = typeof obj[i] == "object" ? deepCopy(obj[i]) : obj[i];
    }
    } else {
    //簡(jiǎn)單數(shù)據(jù)類型 直接 == 賦值
    var result = obj;
    }
    return result;
    }
    四、VUE
    1、Vue的雙向數(shù)據(jù)綁定原理是什么渣锦?
    vue.js 是采用數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者模式的方式硝岗,通過(guò)Object.defineProperty()來(lái)劫持各個(gè)屬性的setter,getter袋毙,在數(shù)據(jù)變動(dòng)時(shí)發(fā)布消息給訂閱者型檀,觸發(fā)相應(yīng)的監(jiān)聽回調(diào)。
    //vue實(shí)現(xiàn)數(shù)據(jù)雙向綁定的原理就是用Object.defineproperty()重新定義(set方法)對(duì)象設(shè)置屬性值和(get方法)獲取屬性值的操縱來(lái)實(shí)現(xiàn)的听盖。
    //Object.property()方法的解釋:Object.property(參數(shù)1胀溺,參數(shù)2,參數(shù)3) 返回值為該對(duì)象obj
    //其中參數(shù)1為該對(duì)象(obj)媳溺,參數(shù)2為要定義或修改的對(duì)象的屬性名月幌,參數(shù)3為屬性描述符碍讯,屬性描述符是一個(gè)對(duì)象悬蔽,主要有兩種形式:數(shù)據(jù)描述符和存取描述符。這兩種對(duì)象只能選擇一種使用捉兴,不能混合使用蝎困。而get和set屬于存取描述符對(duì)象的屬性。
    //這個(gè)方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性或者修改對(duì)象上的現(xiàn)有屬性倍啥,并返回該對(duì)象禾乘。
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    </head>
    <body>
    <div id="myapp">
    <input v-model="message" />

    <span v-bind="message"></span>
    </div>
    <script type="text/javascript">
    var model = {
    message: ""
    };
    var models = myapp.querySelectorAll("[v-model=message]");
    for (var i = 0; i < models.length; i++) {
    models[i].onkeyup = function() {
    model[this.getAttribute("v-model")] = this.value;
    }
    }
    // 觀察者模式 / 鉤子函數(shù)
    // defineProperty 來(lái)定義一個(gè)對(duì)象的某個(gè)屬性
    Object.defineProperty(model, "message", {
    set: function(newValue) {
    var binds = myapp.querySelectorAll("[v-bind=message]");
    for (var i = 0; i < binds.length; i++) {
    binds[i].innerHTML = newValue;
    };
    var models = myapp.querySelectorAll("[v-model=message]");
    for (var i = 0; i < models.length; i++) {
    models[i].value = newValue;
    };
    this.value = newValue;
    },
    get: function() {
    return this.value;
    }
    })
    </script>
    </body>
    </html>
    2、請(qǐng)?jiān)敿?xì)說(shuō)下你對(duì)vue生命周期的理解虽缕?
    總共分為8個(gè)階段創(chuàng)建前/后始藕,載入前/后,更新前/后氮趋,銷毀前/后
    beforeCreate 創(chuàng)建前執(zhí)行(vue實(shí)例的掛載元素el和數(shù)據(jù)對(duì)象data都為undefined伍派,還未初始化) created 完成創(chuàng)建 (完成了data數(shù)據(jù)初始化,el還未初始化) beforeMount 載入前(vue實(shí)例的el和data都初始化了剩胁,但還是掛載之前為虛擬的dom節(jié)點(diǎn)诉植,data.message還未替換。)
    mounted 載入后html已經(jīng)渲染(vue實(shí)例掛載完成昵观,data.message成功渲染晾腔。)
    beforeUpdate 更新前狀態(tài)(view層的數(shù)據(jù)變化前,不是data中的數(shù)據(jù)改變前)
    updated 更新狀態(tài)后
    beforeDestroy 銷毀前
    destroyed 銷毀后 (在執(zhí)行destroy方法后啊犬,對(duì)data的改變不會(huì)再觸發(fā)周期函數(shù)灼擂,說(shuō)明此時(shí)vue實(shí)例已經(jīng)解除了事件監(jiān)聽以及和dom的綁定,但是dom結(jié)構(gòu)依然存在)
    說(shuō)一下每一個(gè)階段可以做的事情
    beforeCreate:可以在這里加一個(gè)loading事件觉至,在加載實(shí)例時(shí)觸發(fā)剔应。
    created:初始化完成時(shí)的事件寫這里,如果這里結(jié)束了loading事件,異步請(qǐng)求也在這里調(diào)用领斥。
    mounted:掛在元素嫉到,獲取到DOM節(jié)點(diǎn)
    updated:對(duì)數(shù)據(jù)進(jìn)行處理的函數(shù)寫這里。
    beforeDestroy:可以寫一個(gè)確認(rèn)停止事件的確認(rèn)框月洛。
    3何恶、動(dòng)態(tài)路由定義和獲取
    在 router 目錄下的 index.js 文件中,對(duì) path 屬性加上 /:id嚼黔。
    使用 router 對(duì)象的 params.id 獲取
    4细层、vue-router 有哪幾種導(dǎo)航鉤子?
    三種
    全局導(dǎo)航鉤子(跳轉(zhuǎn)前進(jìn)行判斷攔截)
    router.beforeEach(to, from, next),
    router.beforeResolve(to, from, next),
    router.afterEach(to, from ,next)
    組件內(nèi)鉤子
    beforeRouteEnter
    beforeRouteUpdate
    beforeRouteLeave
    單獨(dú)路由獨(dú)享組件
    beforeEnter
    5、組件之間的傳值通信唬涧?
    父組件向子組件傳值:
    子組件在props中創(chuàng)建一個(gè)屬性疫赎,用來(lái)接收父組件傳過(guò)來(lái)的值;
    在父組件中注冊(cè)子組件碎节;
    在子組件標(biāo)簽中添加子組件props中創(chuàng)建的屬性捧搞;
    把需要傳給子組件的值賦給該屬性
    子組件向父組件傳值:
    子組件中需要以某種方式(如點(diǎn)擊事件)的方法來(lái)觸發(fā)一個(gè)自定義的事件;
    將需要傳的值作為$emit的第二個(gè)參數(shù)狮荔,該值將作為實(shí)參傳給響應(yīng)事件的方法胎撇;
    在父組件中注冊(cè)子組件并在子組件標(biāo)簽上綁定自定義事件的監(jiān)聽。
    6殖氏、vuex
    是一個(gè)能方便vue實(shí)例及其組件傳輸數(shù)據(jù)的插件 方便傳輸數(shù)據(jù)晚树,作為公共存儲(chǔ)數(shù)據(jù)的一個(gè)庫(kù)
    state: 狀態(tài)中心
    mutations: 更改狀態(tài),同步的
    actions: 異步更改狀態(tài)
    getters: 獲取狀態(tài)
    modules: 將state分成多個(gè)modules雅采,便于管理
    應(yīng)用場(chǎng)景:?jiǎn)雾?yè)應(yīng)用中爵憎,組件之間的狀態(tài)。音樂(lè)播放婚瓜、登錄狀態(tài)票灰、加入購(gòu)物車骂铁。
    網(wǎng)上找的一個(gè)通俗易懂的了解vuex的例子
    公司有個(gè)倉(cāng)庫(kù)
    1.State(公司的倉(cāng)庫(kù))
    2.Getter(只能取出物品舶沛,包裝一下还绘,不能改變物品任何屬性)
    3.Muitation(倉(cāng)庫(kù)管理員,只有他可以直接存儲(chǔ)到倉(cāng)庫(kù))
    4.Action(公司的物料采購(gòu)員冈涧,負(fù)責(zé)從外面買東西和接貨茂附, 要往倉(cāng)庫(kù)存東西,告訴倉(cāng)庫(kù)管理員要存什么)
    非常要注意的地方:只要刷新或者退出瀏覽器督弓,倉(cāng)庫(kù)清空营曼。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市愚隧,隨后出現(xiàn)的幾起案子蒂阱,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件录煤,死亡現(xiàn)場(chǎng)離奇詭異鳄厌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)妈踊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門了嚎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人廊营,你說(shuō)我怎么就攤上這事歪泳。” “怎么了露筒?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵呐伞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我慎式,道長(zhǎng)伶氢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任瞬捕,我火速辦了婚禮鞍历,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肪虎。我一直安慰自己,他們只是感情好惧蛹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布扇救。 她就那樣靜靜地躺著,像睡著了一般香嗓。 火紅的嫁衣襯著肌膚如雪迅腔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天靠娱,我揣著相機(jī)與錄音沧烈,去河邊找鬼。 笑死像云,一個(gè)胖子當(dāng)著我的面吹牛锌雀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播迅诬,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼腋逆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了侈贷?” 一聲冷哼從身側(cè)響起惩歉,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后撑蚌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體上遥,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年争涌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了露该。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡第煮,死狀恐怖解幼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情包警,我是刑警寧澤撵摆,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站害晦,受9級(jí)特大地震影響特铝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜壹瘟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一鲫剿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧稻轨,春花似錦灵莲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至线欲,卻和暖如春明场,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背李丰。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工苦锨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趴泌。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓舟舒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親踱讨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子魏蔗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355