前端海底撈不定期跟新

2017年8月

1,ES6 Map和Set

Map

ES6中新增的數(shù)據(jù)類型,類似PHP中的鍵值對(duì)形式結(jié)構(gòu)

var m = new Map([['a',1],['b',2],['c',3]]);

m.get('a'); //1

m.set('d',4); //新增

Set

ES6中新增了Set數(shù)據(jù)結(jié)構(gòu),類似于數(shù)組,但是它的成員都是唯一的,其構(gòu)造函數(shù)可以接受一個(gè)數(shù)組作為參數(shù)

let array = Array.from(newSet([1,1,1,2,3,2,4]));
//Array.from函數(shù)可以實(shí)現(xiàn)set-->Array的轉(zhuǎn)化
console.log(array);// => [1, 2, 3, 4]

2,MVVM

angular,js
臟檢查模式:在angular中當(dāng)觸發(fā)某些執(zhí)行條件時(shí)(如change,input等),執(zhí)行一個(gè)檢測(cè)輪詢,來(lái)遍歷所有數(shù)據(jù),對(duì)比更改的地方,然后執(zhí)行變化,響應(yīng)到DOM
因?yàn)榇朔椒ú豢茖W(xué),有很多多余的遍歷,故稱為臟檢查
vue.js
數(shù)據(jù)劫持:在ES5中定義了一個(gè)名為"屬性描述符的對(duì)象",可以通過(guò)Object.getPropertyDescriptor()來(lái)查詢,getPropertyDescriptor接收一個(gè)對(duì)象,和對(duì)象上的某個(gè)屬性兩個(gè)參數(shù),查詢?cè)搶傩缘乃膫€(gè)描述符狀態(tài),如:

Object.getPropertyDescriptor({x:1},x);
//返回該屬性的值,可寫性,可枚舉性和可配置性
{
          value:1,
          writable:true,
          enumeable:true,
          configurable:true
}

而需要設(shè)置,修改這些特性時(shí),使用Object.defineProperty。在vue vm中通過(guò)Object.defineProperty()對(duì)需要監(jiān)聽的每個(gè)對(duì)象屬性設(shè)置getter和setter,每當(dāng)對(duì)象屬性的數(shù)據(jù)發(fā)生變更時(shí),觸發(fā)setter的函數(shù)(劫持),在setter中通知所有的訂閱者,watcher監(jiān)聽到變化之后更新視圖

函數(shù)節(jié)流

「函數(shù)節(jié)流讓一個(gè)函數(shù)只有在你不斷觸發(fā)后停下來(lái)歇會(huì)才開始執(zhí)行,中間你操作得太快它直接無(wú)視你?!?br> 為了節(jié)制某些函數(shù)的執(zhí)行頻率,在觸發(fā)時(shí)設(shè)置setTimeout,如果短時(shí)間內(nèi)再次觸發(fā),清除上一個(gè)定時(shí)器,設(shè)置新的定時(shí)器。

function throttle(method, context) {
     clearTimeout(methor.tId);
     method.tId = setTimeout(function(){
         method.call(context);
     }, 100);
 }
//接收一個(gè)函數(shù)和一個(gè)上下文(函數(shù)執(zhí)行上下文為非必選參數(shù)),將定時(shí)器設(shè)為該函數(shù)的一個(gè)屬性,100ms內(nèi)再次調(diào)用這個(gè)函數(shù)將清除并重新設(shè)置定時(shí)器
//調(diào)用
window.onresize = function(){
    throttle(myFunc);
}
//摘自js高程

2017年9月

1,獲取瀏覽器窗口大小

//PC
var pageWidth = document.documentElement.clientWidth || document.body.clientWidth;
pageHeight = document.documentElement.clientHeight || document.body.clientHeight;
//移動(dòng)設(shè)備中,除了以上方法window.innerWidth || window.innerHeight都保存著可見視口信息

2,常見的POST數(shù)據(jù)提交方式

application/x-www-form-urlencoded:瀏覽器的原生表單提交,若不設(shè)置參數(shù)格式,默認(rèn)就為application/x-www-form-urlencoded,后端可以方便讀取
multipart/form-data:常用于文件上傳,于表單和請(qǐng)求頭中設(shè)置
application/json:這種方案,可以方便的提交復(fù)雜的結(jié)構(gòu)化數(shù)據(jù),特別適合 RESTful 的接口。各大抓包工具如 Chrome 自帶的開發(fā)者工具、Firebug、Fiddler,都會(huì)以樹形結(jié)構(gòu)展示 JSON 數(shù)據(jù),非常友好。

3,前端安全XSS和CRSF

XSS,跨站腳本攻擊,全稱cross-site scripting,使用js腳本注入的方式攻擊網(wǎng)站。

防范:
1,過(guò)濾轉(zhuǎn)義輸入輸出,若輸入輸出中帶有<script>等標(biāo)簽,將不會(huì)被執(zhí)行。
2,通信cookie使用httponly屬性,防止被讀寫.

CRSF,跨站請(qǐng)求偽造,偽造請(qǐng)求發(fā)送到服務(wù)器

防范:
1,防止登錄的session長(zhǎng)時(shí)間儲(chǔ)存在客戶端中,設(shè)置reprice
2,檢測(cè)請(qǐng)求域名
3,關(guān)鍵請(qǐng)求使用驗(yàn)證碼

4,CSS中的box-sizing

box-sizing用于設(shè)置盒模型的模式
其中屬性
context-box:(默認(rèn)值)標(biāo)準(zhǔn)盒模型,border和padding不計(jì)入元素width中,一個(gè)塊的總寬度等于margin+padding+border+width
border-box:IE怪異盒模型,border和padding計(jì)入width中,一個(gè)塊的總寬度等于margin+width
padding-box:padding計(jì)算入width內(nèi)

5,H5語(yǔ)義化標(biāo)簽

標(biāo)簽寫得語(yǔ)義化有助于SEO,搜索引擎易檢索查到。
充分利用各種HTML標(biāo)簽完成他們本職的工作。

h5.png

6,創(chuàng)建對(duì)象方式

1,對(duì)象字面量 var obj = {a:1}
2,構(gòu)造函數(shù)創(chuàng)建對(duì)象 var obj = new Function()
3,對(duì)象原生方法創(chuàng)建 var obj = Object.create({})

7,New一個(gè)新對(duì)象時(shí)發(fā)生了什么?

var obj = new Function()
1,創(chuàng)建了一個(gè)新對(duì)象 obj
2,將this上下文指向這個(gè)新對(duì)象 this-->obj,此時(shí)的這個(gè)對(duì)象已經(jīng)是繼承于構(gòu)造函數(shù).prototype
3,執(zhí)行構(gòu)造函數(shù)中的代碼
4,返回一個(gè)新對(duì)象 return obj 共四步

8,性能優(yōu)化

1,雪碧圖,減少http請(qǐng)求
2,減少dom操作(事件代理等)
3,壓縮js,css
4,CDN靜態(tài)資源托管
5,DNS預(yù)加載(在頭部添加meta標(biāo)簽,預(yù)先請(qǐng)求域名外的域名文件)

9,今日雜項(xiàng)

1,表單reset之后不是清空表表單,而是重置到每個(gè)input都為默認(rèn)的value值
2,Jq中設(shè)置dom屬性為$("#id").attr('src',path);
而在JS中為dom.setattribute('value',value);
3,原生表單提交阻止頁(yè)面自動(dòng)跳轉(zhuǎn),設(shè)置一個(gè)隱藏的iframe,然后將表單的target指向該iframe,返回信息顯示在iframe中而頁(yè)面不會(huì)跳轉(zhuǎn)。原始發(fā)送表單submit()。
4,刷新頁(yè)面location.reload。

10,ES6深拷貝

var arr = [1,2,3]
var copy = Object.assign([],arr)   //此處的第一個(gè)參數(shù)也能換成{}對(duì)象形式,返回的copy即為鍵值對(duì)對(duì)象
copy.push(4)
console.log(arr)   //[1, 2, 3]
console.log(copy)  //[1,2,3,4]  對(duì)copy的操作并未對(duì)arr產(chǎn)生影響

11,事件委托性能優(yōu)化

在一個(gè)UI李有10個(gè)li,實(shí)現(xiàn)點(diǎn)擊對(duì)應(yīng)的li,輸出對(duì)應(yīng)的下標(biāo)

var lis = querySelectorAll('li')
for(var i = 0 ; i < 10 ; i++){
   lis[i].onclick = (function(a) {
      return function() {
       alert(a)
    }
  })(i)   //閉包實(shí)現(xiàn)塊級(jí)作用域
}   

使用事件委托

利用冒泡的原理,把事件加到父級(jí)上,觸發(fā)執(zhí)行效果。

1.可以大量節(jié)省內(nèi)存占用,減少事件注冊(cè)。
2.可以方便地動(dòng)態(tài)添加和修改元素,不需要因?yàn)樵氐母膭?dòng)而修改事件綁定。

var ul = document.querySelector('ul'); 
var list = document.querySelectorAll('ul li'); 
   
ul.addEventListener('click', function(ev){ 
    var ev = ev || window.event; 
    var target = ev.target || ev.srcElemnt; 
   
    for(var i = 0, len = list.length; i < len; i++){ 
        if(list[i] == target){ 
            alert(i + "----" + target.innerHTML); 
            return
        } 
    } 
}); 

!?。?!注意:addEventListener()方法添加的匿名函數(shù)是無(wú)法移除的,所以如果需要移除監(jiān)聽器,添加時(shí)應(yīng)使用函數(shù)名添加。(若多次添加相同的監(jiān)聽器不會(huì)覆蓋,而是在觸發(fā)時(shí)執(zhí)行兩次)

11,split、join、splice、slice

var a = [1,2,3,4,5]
a = a.join('-')   //將數(shù)組以傳入的參數(shù)連接起來(lái),返回一個(gè)合并的字符串
console.log(a)    //1-2-3-4-5
a = a.split("") //將字符串以傳入的參數(shù)分隔,返回一個(gè)分隔的數(shù)組
console.log(a)    //[1,-,2,-,3,-,4,-,5]
var del = a.splice(0,3)  //直接對(duì)源數(shù)組進(jìn)行修改從下標(biāo)0開始的長(zhǎng)度為3數(shù)組
console.log(del)  //[1,-,2]
console.log(a)    //[-,3,-,4,-,5]
a = a.slice(0,1)  //不修改原數(shù)組,返回從下標(biāo)0開始長(zhǎng)度為1的截取的數(shù)組
console.log(a)    //[-]
***********************************************************************************
split(' ')操作字符串
join('-')操作數(shù)組  -->合并為字符串
splice(0,3)操作數(shù)組 -->刪除
slice(0,3)操作字符串,數(shù)組皆可  -->即可分隔數(shù)組,又可分隔字符串

12,Object.creat()函數(shù)

Object.creat()函數(shù)接受兩個(gè)參數(shù),第一個(gè)設(shè)置的是這個(gè)新創(chuàng)建的對(duì)象所指向的原型對(duì)象,第二個(gè)是這個(gè)新創(chuàng)建對(duì)象的屬性。收獲一種新的創(chuàng)建對(duì)象的方法hhh

var  obj = Object.create(null,{   //此處原型對(duì)象可以傳空值,此時(shí)obj的__proto__指針指向null
    name:{
        value:'cty', //使用Object.create創(chuàng)建對(duì)象時(shí),對(duì)象的屬性名內(nèi),屬性值必須用value設(shè)置
        enumerable: true //enumerable設(shè)為true將其設(shè)置為可枚舉屬性
    }
})
console.log(obj.name) //cty

13,文件上傳

直接上代碼

label for="resource" class="upload">pdf上傳</label>
<input type="file" id="resource" name="resource" ref="resource" @change="fileChange">
----------------分割線-----------------------
fileChange(e) {
//通過(guò)事件獲取到上傳的文件,操作字符串獲得文件格式,files的size方法控制上傳文件大小
    var fileSize = 0;        
    獲取上傳的文件
    var files = e.target.files || e.dataTransfer.files;
    fileSize = e.target.files[0].size;        
    var size = fileSize / 1024;    
    if(size>2000){  
     alert("附件不能大于2M");
     e.target.value="";
     return
    }
      var name = e.target.value;
      var fileName = name.substring(name.lastIndexOf(".")+1).toLowerCase();
      if(fileName != "pdf" && fileName != "mp4" && fileName != "ppt" && fileName != "pptx" && fileName != "avi"){
            this.$alert('文件格式有誤,請(qǐng)選擇PPT,PDF,PPTX,avi,mp4格式上傳', '提示', {
                 confirmButtonText: '確定', 
                 type: 'warning'
            })
          e.target.value="";
          return
}

14,js獲取事件和h5中的data-*屬性

在全局下發(fā)生點(diǎn)擊的事件可以直接傳入函數(shù)中,如click(e)(即便綁定時(shí)并沒有傳入這個(gè)參數(shù))
然后,通過(guò)e.target可以獲取目標(biāo)元素,即事件流中的事件觸發(fā)階段的最具體的元素
再然后,
獲取元素上綁定的data-*屬性,用原生js,方法為let value = e.target.dataset.*
動(dòng)態(tài)設(shè)置,用原生js,方法為e.target.dataset.*='xxx'
dataset屬性的值是DOMStringMap的一個(gè)實(shí)例,名值對(duì)的映射。每個(gè)data-name形式的屬性都有一個(gè)對(duì)應(yīng)的屬性,只不過(guò)該屬性名沒有data-前綴。

15,reduce方法

reduce為數(shù)組方法,數(shù)組對(duì)象可以調(diào)用,接收的回調(diào)函數(shù)接收兩個(gè)參數(shù),第一個(gè)是上一次處理后的屬性的值,第二個(gè)是上一個(gè)屬性的下一個(gè)屬性

var arr = [1,2,3,4,5]
arr.reduce(function(pre,cur){
    return pre+cur
})
//可以簡(jiǎn)單地對(duì)number數(shù)組求和
//回調(diào)函數(shù)第一次執(zhí)行pre為空,cur為1
//第二次執(zhí)行pre為上一次返回的數(shù)值,即1,cur進(jìn)入數(shù)組下一個(gè)值為2
//第三次執(zhí)行pre為上一次返回的數(shù)值,即3,cur進(jìn)入數(shù)組下一個(gè)值為3
//...以此類推,最后得出1至5的累加為15

15,Object.key(obj)

或得一個(gè)對(duì)象數(shù)組的屬性值,通常檢測(cè)屬性值可以使用hasOwnProperty

var o = {a:'123',b:'456'}
Object.keys(o).forEach(res=>{
        console.log(res)
})   //a  b

2017年10月

1,這里放一些Vue全局對(duì)象的基本操作

1,axios.defaults.withCredentials = true

默認(rèn)允許后臺(tái)跨域操作,如在客戶端存儲(chǔ)cookie等需要權(quán)限的操作。重要,若請(qǐng)求不設(shè)置,后端無(wú)法在客戶度設(shè)置cookie,再發(fā)起請(qǐng)求時(shí)無(wú)法在請(qǐng)求頭中攜帶cookie會(huì)發(fā)生302錯(cuò)誤

2,Vue.config.productionTip = false

設(shè)置 Vue.config.productionTip = false 來(lái)關(guān)閉生產(chǎn)模式下給出的提示

3,Vue.prototype.$axios = axios

Vue實(shí)例添加axios方法

4,前端響應(yīng)式布局

rem怎么來(lái)的?

rem是css3中新增加的一個(gè)單位屬性(font size of the root element),根據(jù)頁(yè)面的根節(jié)點(diǎn)的字體大小進(jìn)行轉(zhuǎn)變的單位。根節(jié)點(diǎn),也就是html。
例:(下面例子中的根節(jié)點(diǎn)是html ,它的字體大小是100px,所以根節(jié)點(diǎn)下面的元素所設(shè)置的rem,都是1rem=100px。)
rem的初始值是16px,也就是說(shuō)在沒有設(shè)置根節(jié)點(diǎn)的font-size的時(shí)候,1rem=16px;
于是,只要在媒體查詢中改變根節(jié)點(diǎn)的font-size設(shè)置,rem將自動(dòng)根據(jù)根節(jié)點(diǎn)設(shè)置的font-size進(jìn)行適配。

html,body{ 
height: 100%;
margin: 0; 
padding: 0; 
font-size: 14px;
}
@media screen and (max-width:320px ) {
   html{font-size: 12px;} 
}
@media screen and (min-width:321px) and (max-width:750px ) {
   html{font-size: 14px;} 
} 
@media screen and (min-width:751px ) { 
  html{font-size: 16px;}
}

以此適配三種屏幕大小。

5,判斷一個(gè)字符串是否是回文字

function isreverse(str){
      //reverse只能作用于數(shù)組,將數(shù)組反轉(zhuǎn)
      return str.split('').reverse().join('') == str
}

6,統(tǒng)計(jì)一個(gè)字符串中出現(xiàn)最多的字符

var str = 'aabbcc'
function findMaxDuplicateChar(str){
    var obj = {}
    var max = 0
    var maxindex = []
    for(var index in str){
                //存儲(chǔ)在對(duì)象類數(shù)組中,并統(tǒng)計(jì)次數(shù)
        if(!obj[str[index]]){
            obj[str[index]] = 1
        }else{
            obj[str[index]] += 1
        }
    }
    for(var index in obj){
        //for..in..也可以作用于類數(shù)組  
        if(obj[index] >= max){
            max = obj[index]
            maxindex.push(index)
        }
    }
    return maxindex
} 
findMaxDuplicateChar(str)
> 輸出(3) ["a", "b", "c"]

以下排序算法皆是從小到大

7,冒泡排序

冒泡排序原理是,每次比較數(shù)組中相鄰的兩個(gè)元素,每次將大的數(shù)放在后面,小的數(shù)向上冒泡,所以經(jīng)過(guò)第一輪冒泡后,最大的數(shù)已經(jīng)在最后一位了。第一輪比較了n-1次,第二輪只要比較n-2次,最后最大的那個(gè)數(shù)已經(jīng)不用比較了。代碼如下:

function bubbleSort(arr){
        //每次要比較的次數(shù)減一
    for(var i = arr.length ; i > 0 ; i--){
        for(var j = 0 ; j < i ; j++){
            if(arr[j] > arr[j+1]){
                        //如果滿足條件,交換位置 
                var tmp = arr[j]
                arr[j] = arr[j+1]
                arr[j+1] = tmp 
            }
        }   
    }
    return arr
}
var arr = [1,4,3,6,7,23,56,2]
bubbleSort(arr)
> 輸出(8) [1, 2, 3, 4, 6, 7, 23, 56]

8,快速排序

快速排序的原理是:遞歸
每次遞歸判斷數(shù)組長(zhǎng)度是否小于或等于1個(gè)數(shù)。若否,則取出數(shù)組中的第一個(gè)數(shù),對(duì)剩下的n-1個(gè)數(shù)進(jìn)行遍歷,把較大的數(shù)放在右邊,較小的數(shù)放在左邊,再對(duì)左右數(shù)組再次進(jìn)行快排,分別以左右兩邊數(shù)組的第一個(gè)數(shù)為哨兵,再次比較分組,最后將所有的分組數(shù)組使用[].concat方法連接,得到一個(gè)從小到大的數(shù)組。代碼如下:

function quickSort(arr){
    //此處還有左邊或右邊數(shù)組一個(gè)元素都沒有的情況
    if(arr.length <= 1){
        return arr
    }

    let leftArr = []
    let rightArr = []
    let p = arr[0]

    for(var i = 1 ; i < arr.length ; i++){
        if(arr[i] < p){
            leftArr.push(arr[i])
        }else{
            console.log(arr[i])
            rightArr.push(arr[i])
        }
    }

    return [].concat(quickSort(leftArr),arr[0],quickSort(rightArr))
}
var arr = [7,3,45,2]
quickSort(arr)
> 輸出(4) [2,3,7,45]

9,斐波那契數(shù)列

又稱黃金分割數(shù)列:0,1,1,2,3,5,8,13.....
斐波那契數(shù)列的原理也是遞歸,代碼如下

function getFibonacci(n){
      var fibarr = []
      for(var i = 0 ; i < n ; i++){
            if(i < 2){
                //前面兩個(gè)數(shù)不需要遞歸,從0,1開始產(chǎn)生遞歸
                fibarr.push(i)    
            }else{
                fibarr.push(fibarr[i-2]+fibarr[i-1])
            }
      }
      //其實(shí)整個(gè)方法只調(diào)用了一次,只是通過(guò)fibarr[i-2]+fibarr[i-1]不斷調(diào)用了之前的數(shù)組,所以也叫遞歸
      return fibarr
}

上次筆試竟然寫不出來(lái)。。。。平時(shí)用不到,但是原理不能忘?。?!

10,前端上傳多種格式文件參數(shù)設(shè)置

fileChange(e){
//監(jiān)聽文件上傳的input框change事件
      var value = e.target.dataset.type
      var name = e.target.value
      var fileName = name.substring(name.lastIndexOf(".")+1)
      //獲取文件后綴名,這里也可以用slice
      //var fileName = name.substring(name.lastIndexOf(".")+1).toLowerCase()
      if(value == 'pdf'){
        if(fileName != "pdf"){
            this.$alert('文件格式有誤,請(qǐng)選擇PDF格式上傳', '提示', {
                              confirmButtonText: '確定', 
                              type: 'warning'
                          })
          e.target.value="";
          return
                }else{
                this.file1 = event.target.files[0]                  
                }
      }
      if(value == 'ppt'){
        if(fileName != "ppt" && fileName != "pptx"){
            this.$alert('文件格式有誤,請(qǐng)選擇PPT,PPTX格式上傳', '提示', {
                              confirmButtonText: '確定', 
                              type: 'warning'
                          })
          e.target.value="";
          return
            }else{
                this.file2 = event.target.files[0]
            }           
      }
                        this.loading = true
          //通過(guò)驗(yàn)證
          this.$axios.post(BASEPATH+'/subject/info/list/all').then(
                        res=>{
                        var data = res.data.allSubjectList
                        var subId = document.getElementById('subjectid').value
                        //重復(fù)驗(yàn)證
                        for(var index in data){
                                if(subId == data[index].subjectid){                         
                                    this.$alert('此課程id重復(fù),請(qǐng)重新輸入!', '提示', {
                              confirmButtonText: '確定',
                              type: 'warning'
                           })                               
                                    return
                                }
                        }                           

                        //文件轉(zhuǎn)為formData格式才能正確上傳帶文件的from表單
                        var formData = new FormData();//formData屬性
                        formData.append('subjectid',this.subjectid)
                        formData.append('title',this.title)
                        formData.append('remark',this.remark)
                        formData.append('parentid',this.parentid)
                        formData.append('status',this.status)
                        //formData.append('imgPath',this.imgPath)
                        formData.append('lessonDetail',this.lessonDetail)
                        formData.append('relatedLesson',this.relatedLesson)
                        if(this.file1){
                                                //file文件append到formData后數(shù)據(jù)格式發(fā)生變化
                            formData.append('resource',this.file1)
                        }    
                        formData.append('lessonPptnum',this.lessonPptnum)
        var config = {
                      //文件上傳使用multipart/form-data格式上傳,設(shè)置ajax參數(shù)
                  headers: {
                    'Content-Type': 'multipart/form-data'
                    }
                }
//發(fā)送請(qǐng)求  this.$axios.post(BASEPATH+'/subject/info/upload',formData,config).then(res=>{
                     if(res.data.code == 1){
                            this.$message({
                                type: 'success',
                                message: '上傳成功!'
                                })
                            this.$router.push({path:'super_courselist'})
                     }else{
                        this.$message({
                                type: 'error',
                                message: '上傳失敗!'
                                })
                        this.loading = false
                        
                     }
            })
                        }).catch(err=>{
                            this.$alert('提交出錯(cuò)!', '提示', {
                              confirmButtonText: '確定', 
                              type: 'error'
                       })
                        this.loading = false                        
                        })
        }).catch((err) => {
          this.$message({
            type: 'warning', 
            showClose: true,
            message: '已取消提交'
          });          
        });             
        },
                //判斷輸入字符格式,使用了ES6模板解析
        isString(...s){
            for(var i of s){
                if(i!=null && typeof i != 'string'){
                    return false
                }
            }
            return true
        },
        isNumber(...n){    
            var pattern =/^[0-9]+([.]{1}[0-9]{1,2})?$/          
            for(var i of n){
                if(i!=null && !pattern.test(i)){
                    return false
                }
            }
            return true
        }
  }

11,css偽類創(chuàng)建三角形箭

原理是利用絕對(duì)定位的偽類元素,創(chuàng)建邊框顏色為透明色的,僅有邊框的正方形,在需要設(shè)箭頭方向的的另一側(cè)設(shè)置邊框?yàn)樗杓^顏色。即出現(xiàn)一個(gè)小△。
若要出現(xiàn)箭頭,則使用after,before兩個(gè)大小相同的三角形通過(guò)position定位重疊后留下一個(gè)小箭頭。

12,閉包

閉包是指能夠訪問其他函數(shù)內(nèi)部變量的函數(shù)。
最常見的產(chǎn)生閉包的方法就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)。
閉包的作用域鏈包含所引用的外部函數(shù)的活動(dòng)對(duì)象,自身活動(dòng)對(duì)象(如果有的話)和全局變量對(duì)象(全局變量對(duì)象,誰(shuí)都有)
理解閉包的作用域鏈,就可以清晰地知道this的指向了

this對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的:在全局函數(shù)中,this指向window對(duì)象,而當(dāng)函數(shù)被當(dāng)作某個(gè)對(duì)象的方法調(diào)用時(shí),this等于那個(gè)對(duì)象。

匿名函數(shù)的this對(duì)象延作用域鏈向上搜尋,但是只會(huì)搜索到其活動(dòng)對(duì)象為止,搜索不到外外部函數(shù)的活動(dòng)對(duì)象,如果都沒有,this則會(huì)指向全局對(duì)象window

13,清除浮動(dòng)

1,給父元素設(shè)置高度
2,在父元素的結(jié)尾處添加一個(gè)有clear:both屬性的盒子標(biāo)簽
3,overflow:hidden
4,使用偽類元素

.clearfix:after{
      content:'';
      height:'';
      display:block;
      visibility:hidden;
      clear:both;
}
.clearfix{
      zoom:1;//兼容ie
}

第五種方法應(yīng)用最為廣泛,不用添加額外的標(biāo)簽,而且可以通用,添加一個(gè)class類名即可。

14,BFC(block fomating context)塊級(jí)格式上下文

描述:簡(jiǎn)單地說(shuō),BFC描述的是塊級(jí)盒的布局規(guī)則
作用:BFC可以用來(lái)清除浮動(dòng)和防止margin重疊
防止margin重疊:因?yàn)楫?dāng)塊級(jí)盒外層沒有BFC作保護(hù)時(shí),margin-top和margin-bottom會(huì)發(fā)生重疊,解決辦法是在外層套一個(gè)BFC保護(hù),則不會(huì)再發(fā)生重疊
**清除浮動(dòng)""

  1. BFC會(huì)阻止垂直外邊距(margin-top、margin-bottom)折疊
  2. BFC不會(huì)重疊浮動(dòng)元素
  3. BFC可以包含浮動(dòng)

我們可以利用BFC的第三條特性來(lái)“清浮動(dòng)”,這里其實(shí)說(shuō)清浮動(dòng)已經(jīng)不再合適,應(yīng)該說(shuō)包含浮動(dòng)。也就是說(shuō)只要父容器形成BFC就可以,如何形成BFC

  1. float為 left|right
  2. overflow為 hidden|auto|scroll
  3. display為 table-cell|table-caption|inline-block
  4. position為 absolute|fixed

我們可以對(duì)父容器添加這些屬性來(lái)形成BFC達(dá)到“清浮動(dòng)”效果。

15,undefined和null的區(qū)別

如果一個(gè)變量聲明后未初始化,那么改值為undefined
如果一個(gè)變量聲明后接下來(lái)是為了保存某種對(duì)象的,那么就把它初始化為null,也因此typeof null結(jié)果為object

16,文檔聲明<!DOCTYPE>

文檔聲明在html文檔的最前面,作用是為了告知瀏覽器的解析器,用什么文檔類型規(guī)范來(lái)解析這個(gè)文檔,只有正確地確定了一個(gè)文檔類型,html和css才能正常生效。
html4.01是基于SGML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言,xml可擴(kuò)展標(biāo)記語(yǔ)言是它的子集)的,在文檔聲明中需要引用.dtd文件(DTD文件就是文檔類型聲明文件)
根據(jù)DTD引入的不同會(huì)觸發(fā)兩種格式

標(biāo)準(zhǔn)模式和混雜模式
標(biāo)準(zhǔn)模式,瀏覽器以其支持的最高標(biāo)準(zhǔn)呈現(xiàn)頁(yè)面
混雜模式,頁(yè)面以一種比較寬松的向后兼容的方式顯示。混雜模式通常模擬老式瀏覽器的行為以防止老站點(diǎn)無(wú)法工作。

而html5既然沒有DTD,也就沒有嚴(yán)格模式與寬松模式的區(qū)別,html5有相對(duì)寬松的語(yǔ)法,實(shí)現(xiàn)時(shí),已經(jīng)盡可能大的實(shí)現(xiàn)了向后兼容。文檔聲明只要簡(jiǎn)單的<!DOCTYPE html>

17,==運(yùn)算符

下面程序得到的結(jié)果分別是什么?()

console.log(([])?true:false);

console.log(([]==false?true:false));

console.log(({}==false)?true:false)

A.false true true B.true true true C.true false true D.true true false

解析:

Boolean([]); //true Number([]); //0 Number({}); // NaN Number(false); //0

因此:

console.log(([])?true:fasle);// => console.log((true)?true:false); //true

console.log([]==false?true:false); // => console.log(0==0?true:false); //true

console.log(({}==false)?true:false); // => console.log((NaN==0)?true:false); //false

選D選項(xiàng)

拓展:《JavaScript權(quán)威指南》的部分相關(guān)知識(shí)點(diǎn)

“==”運(yùn)算符(兩個(gè)操作數(shù)的類型不相同時(shí))

如果一個(gè)值是null,另一個(gè)值是undefined,則它們相等

如果一個(gè)值是數(shù)字,另一個(gè)值是字符串,先將字符串轉(zhuǎn)換為數(shù)學(xué),然后使用轉(zhuǎn)換后的值進(jìn)行比較。

如果其中一個(gè)值是true,則將其轉(zhuǎn)換為1再進(jìn)行比較。如果其中的一個(gè)值是false,則將其轉(zhuǎn)換為0再進(jìn)行比較。

如果一個(gè)值是對(duì)象,另一個(gè)值是數(shù)字或字符串,則將對(duì)象轉(zhuǎn)換為原始值,再進(jìn)行比較。

18,Vue Virtual DOM

由于原始的DOM操作非常耗時(shí),對(duì)性能造成了很大的影響,但是js很快。
vue框架使用的是virtual dom來(lái)進(jìn)行dom操作。
虛擬dom的核心思想是:對(duì)復(fù)雜的文檔dom結(jié)構(gòu),提供一種方便的工具進(jìn)行最小化的dom操作。dom的子節(jié)點(diǎn),標(biāo)簽,屬性,都可以用js來(lái)表示,當(dāng)數(shù)據(jù)狀態(tài)發(fā)生改變時(shí),先通過(guò)js對(duì)象表示的虛擬dom計(jì)算出實(shí)際dom需要進(jìn)行的最小改動(dòng)再去操作dom。

11月

1,簡(jiǎn)單的git操作

提交

$ git add . 將文件添加到緩存區(qū)
$ git commit -m "說(shuō)明" 提交緩存區(qū)的代碼
$ git push origin master 推送到源分支


拉取并合并

$ git pukk origin master

2,--save和--save-dev

  1. --save將install的依賴包名放入package.json的dependencies中,dependencies屬于項(xiàng)目發(fā)布之后還是需要依賴的東西。
  2. --save-dev將insatll的依賴包名放入package.json的devDependencies中,devDependencies屬于項(xiàng)目發(fā)布前打包,編譯等需要所依賴的工具,項(xiàng)目上線以后并不需要這些東西。webpack屬于打包工具,安裝時(shí)npm install webpack --sava-dev

3,css選擇器權(quán)重

行內(nèi)樣式(1000) > id選擇器(100) > class選擇器(10) == 屬性選擇器(10) > 偽類選擇器(+1) > 標(biāo)簽選擇器(1) > 通用選擇器(0)

4,逗號(hào)選擇器總是由逗號(hào)最后的一個(gè)表達(dá)式?jīng)Q定的

5,瀏覽器渲染過(guò)程

  1. html文檔加載后,構(gòu)建dom tree
  2. css文檔加載后,構(gòu)建css rule tree
  3. dom tree 和 rule tree 結(jié)合生成 render tree,渲染樹
  4. layout 計(jì)算出每一個(gè)渲染對(duì)象的位置和尺寸,將其安置在瀏覽器窗口的正確位置,叫回流,或者布局
  5. 繪制(Painting)根據(jù)上一步的layout計(jì)算出的位置和元素尺寸進(jìn)行頁(yè)面的繪制
    dom tree --> rule tree --> render tree --> layout --> painting

6,call,apply

通過(guò)document.getElementsByTagName選擇的dom 節(jié)點(diǎn)是一種類似array的array。它不能應(yīng)用Array下的push,pop等方法。我們可以通過(guò):
var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));
這樣domNodes就可以應(yīng)用Array下的所有方法了。

12月

1,Object.prototype.toString.call([1,2,3])

數(shù)組是類對(duì)象,但它不是真正的對(duì)象,不能直接調(diào)用toString方法,通過(guò)call改變this的指向,使得數(shù)組調(diào)用對(duì)象原型上的toString方法,數(shù)組作為類對(duì)象返回[Object string],而真正的對(duì)象則返回[Object object]。
另外判斷其是否為數(shù)組

[1,2,3].__proto__.constructor == Array
true

2,vue生命周期的操作問題

vue生命周期從init到destroy,應(yīng)該在哪個(gè)地方操作dom,那個(gè)地方操作數(shù)據(jù)?
首先,獲取異步數(shù)據(jù)在created中,因?yàn)閏reated中還未掛載vue實(shí)例,且未渲染,如果在其后獲取異步數(shù)據(jù),雖然也可以,但是會(huì)導(dǎo)致頁(yè)面刷新兩次,導(dǎo)致加載時(shí)間過(guò)長(zhǎng),所以獲取異步數(shù)據(jù),預(yù)處理數(shù)據(jù)都應(yīng)該在created中操作。
其次,操作dom,應(yīng)該在mounted或者vm.nextTick之后,因?yàn)榇藭r(shí)所有的dom的掛載和渲染都已經(jīng)完成,此時(shí)操作dom才不會(huì)出現(xiàn)問題。
最后再提一下updated,updated在每次數(shù)據(jù)更新的時(shí)候都會(huì)被觸發(fā),而mounted只觸發(fā)一次,如果updated中獲取異步數(shù)據(jù),則每次頁(yè)面有數(shù)據(jù)變化時(shí)都會(huì)觸發(fā)這個(gè)異步請(qǐng)求。所以u(píng)pdated一般不推薦使用。

3,fork和clone的區(qū)別

  1. 區(qū)別
    git clone 是在自己電腦(這里我是ubuntu)直接敲命令,結(jié)果是將github倉(cāng)庫(kù)中的項(xiàng)目克隆到自己本地電腦中了
    fork是直接訪問github網(wǎng)站,在項(xiàng)目頁(yè)面中點(diǎn)擊fork,然后自己github項(xiàng)目中就會(huì)多出一個(gè)復(fù)制的項(xiàng)目
  2. 用法
    如果我們想要修改他人github項(xiàng)目的話,我們直接git clone代碼到本地是不能pull的,所以我們使用fork,先把代碼復(fù)制到自己的github倉(cāng)庫(kù),然后git clone到本地修改,然后在提交pull(這里的pull是pull到自己github倉(cāng)庫(kù)了,我們自己的github倉(cāng)庫(kù)中的代碼是fork源的一個(gè)分支),這時(shí)候我們想要把修改的代碼提交給他人的話,就可以在自己github上pull,等其他人看到后就可以把代碼做一個(gè)合并。

2018.5.21

1,重溫圣杯布局和雙飛翼布局

圣杯布局和雙飛翼布局都是三列布局左右長(zhǎng)度固定,中間寬度隨左右變化的的一種方式,當(dāng)然現(xiàn)在可以使用flex,中間flex為1,左右固定。
圣杯布局:

外層標(biāo)準(zhǔn)盒模型盒子向內(nèi)padding,之后全部左浮動(dòng),利用margin負(fù)邊距和relative相對(duì)定位(相對(duì)自身定位)來(lái)實(shí)現(xiàn)。
image.png

雙飛翼布局:
盒子固定,中間自適應(yīng)內(nèi)容用新的寬度100%的盒子包裹,新盒子向內(nèi)padding,左右兩側(cè)僅需利用margin負(fù)邊距即可。
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    前端進(jìn)階之旅閱讀 115,563評(píng)論 24 450
  • 【今日話題】 你吃過(guò)最好吃的東西是什么?描述一下吧 ! 生蠔羊肉火鍋: 生蠔鮮美,湯汁濃郁,搭配羊肉,在冬天可以補(bǔ)...
    好聽的暖陽(yáng)閱讀 238評(píng)論 0 0
  • 單身的甲(女)和乙(男)通過(guò)熟人牽線搭橋,相互加微信,只是見過(guò)對(duì)方的照片而已,沒多久甲便是主動(dòng)詢問起男方乙的家境狀...
    胡桃_f08b閱讀 407評(píng)論 0 0
  • 一對(duì)黑天鵝,在湖中相依相偎,恩愛有加。陽(yáng)光灑在水面上,形成彩色的漣漪,給單一顏色的湖面增添了幾分美感。 好不容易等...
    故鄉(xiāng)月閱讀 205評(píng)論 0 4

友情鏈接更多精彩內(nèi)容