2019初級中級高階web前端面試題超全面細節解析

Fe_從零到壹發表於2019-10-24

前言

文章涉及的內容可能不全面,但量很多,需要慢慢看。我花了很長的時間整理,用心分享心得,希望對大家有所幫助。但是難免會有打字的錯誤或理解的錯誤點,希望發現的可以郵箱告訴我ghui_master@163.com,我會及時的進行修改,只希望對你有所幫助,謝謝。

本片文章記錄一下當時自己學習JavaScript的過程以及一些知識點和注意事項,從基礎到中高階的內容都有,會以章節的形式慢慢展示出來

一、CSS問題

一、flex彈性佈局,

可以簡單的使一個元素居中(包括水平和垂直居中) 柵格式系統佈局,bootstrap grid

二、聖盃和雙飛翼佈局 三欄是佈局(兩邊兩欄寬度固定,中間欄寬度自適應)

方案一:position(絕對定位法) center的div需要放在最後面 ​ 絕對定位法原理將左右兩邊使用absolute定位,因為絕對定位使其脫離文件流,後面的center會自然流動到他們的上賣弄,然後margin屬性,留出左右兩邊的寬度。就可以自適應了。

方案二:float 自身浮動法 center的div需要放到後面 ​ 自身浮動法的原理就是對左右使用float:left和float:right,float使左右兩個元素脫離文件流,中間的正常文件流中,使用margin指定左右外邊距對其進行一個定位。

聖盃佈局:原理就是margin負值法。使用聖盃佈局首先需要在center元素外部包含一個div,包含的div需要設定float屬性使其形成一個BFC,並且這個寬度和margin的負值進行匹配

三、左邊定寬,右邊自適應

方案一:左邊設定浮動,右邊寬度設定100% .left{float:left} .right:{width:100%}

方案二:左設定浮動,右用cacl去補寬度計算 .left{float:left} .right:{width:cacl(100vw-200px}

方案三:父容器設定display:flex right部分是設定flex:1

方案四:右邊div套個包裹、並前置、左及包裹 雙浮動

四、水平居中

行內元素居中(父元素text-align:center)

塊狀元素居中(塊狀元素沒發用text-align)

	 - 1. 寬度一定:margin:auto
	- 2.寬度不定:塊級變行內,然後在父上text-aligin
	    float
複製程式碼

五、BFC juejin.im/post/5909db…

理解:BFC是css佈局的一個概念,是一塊獨立的渲染區域,一個環境,裡面的元素不會影響到外部的元素

​ 如何生成BFC:(脫離文件流)

​ 【1】根元素,即HTML元素(最大的一個BFC)

​ 【2】float的值不為none

​ 【3】position的值為absolute或fixed

​ 【4】overflow的值不為visible(預設值。內容不會被修剪,會呈現在元素框之外)

​ 【5】display的值為inline-block、table-cell、table-caption

BFC佈局規則:

1.內部的Box會在垂直方向,一個接一個地放置。

2.屬於同一個BFC的兩個相鄰的Box的margin會發生重疊

3.BFC就是頁面上的一個隔離的獨立容器,容器裡面的子元素不會影響到外面的元素。反之也如此, 文字環繞效果,設定float

4.BFC的區域不會與float box重疊。

5.計算BFC的高度,浮動元素也參與計算

BFC作用: 1.自適應兩欄佈局

2.可以阻止元素被浮動元素覆蓋

3.可以包含浮動元素---清除內部浮動 > > >

原理: 觸發父div的BFC屬性,使下面的子div都處在父div的同一個BFC區域之內

4.分屬於不同的BFC時,可以阻止margin重疊

display:flex; 在父元素設定,子元素受彈性盒影響,預設排成一行,如果超出一行,按比例壓縮 flex:1; 子元素設定,設定子元素如何分配父元素的空間,flex:1,子元素寬度佔滿整個父元素align-items:center 定義子元素在父容器中的對齊方式,center 垂直居中justify-content:center 設定子元素在父元素中居中,前提是子元素沒有把父元素佔滿,讓子元素水平居中。

2.css3的新特性

transtion transition-property 規定設定過渡效果的 CSS 屬性的名稱。

transition-duration 規定完成過渡效果需要多少秒或毫秒。

transition-timing-function 規定速度效果的速度曲線。

transition-delay 定義過渡效果何時開始。

animation屬性可以像Flash製作動畫一樣,通過控制關鍵幀來控制動畫的每一步,實現更為複雜的動畫效果。

ainimation實現動畫效果主要由兩部分組成:

通過類似Flash動畫中的幀來宣告一個動畫;

在animation屬性中呼叫關鍵幀宣告的動畫。

translate 3D建模效果

3.img中alt和title的區別

圖片中的 alt屬性是在圖片不能正常顯示時出現的文字提示。

圖片中的 title屬性是在滑鼠在移動到元素上的文字提示。

4.用純CSS建立一個三角形

 <style>
    div {
        width: 0;
        height: 0;
        border-top: 40px solid transparent;
        border-left: 40px solid transparent;
        border-right: 40px solid transparent;
        border-bottom: 40px solid #ff0000;
    }
    </style>
</head>
<body>
  <div></div>
</body>
複製程式碼
複製程式碼

5.如何理解CSS的盒子模型?

標準盒子模型:寬度=內容的寬度(content)+ border + padding

低版本IE盒子模型:寬度=內容寬度(content+border+padding)

6.如何讓一個div水平居中

已知寬度,block元素 ,新增新增margin:0 auto屬性。

已知寬度,絕對定位的居中 ,上下左右都為0,margin:auto

7.如何讓一個div水平垂直居中

div {
position: relative / fixed; /* 相對定位或絕對定位均可 */
width:500px;
height:300px;
top: 50%;
left: 50%;
margin-top:-150px;
margin-left:-250px;
 外邊距為自身寬高的一半 */
background-color: pink; /* 方便看效果 */
 }

.container {
display: flex;
align-items: center; /* 垂直居中 */
justify-content: center; /* 水平居中 */
 
}
.container div {
width: 100px; /* 可省 */
height: 100px; /* 可省 */
background-color: pink; /* 方便看效果 */
}  
複製程式碼
複製程式碼

8.如何清除浮動?

clear清除浮動(新增空div法)在浮動元素下方新增空div,並給該元素寫css樣式 {clear:both;height:0;overflow:hidden;}

給浮動元素父級設定高度

父級同時浮動(需要給父級同級元素新增浮動)

父級設定成inline-block,其margin: 0 auto居中方式失效

給父級新增overflow:hidden 清除浮動方法

萬能清除法 after偽類 清浮動(現在主流方法,推薦使用)

float_div:after{
content:".";
clear:both;
display:block;
height:0;
overflow:hidden;
visibility:hidden;
}
.float_div{
zoom:1
}
複製程式碼
複製程式碼

9.css3實現三欄佈局,左右固定,中間自適應

聖盃佈局/雙飛翼佈局

 <style>
        * {
            margin: 0;
            padding: 0;
        }
        .middle,
        .left,
        .right {
            position: relative;
            float: left;
            min-height: 130px;
        }
        .container {
            padding: 0 220px 0 200px;
            overflow: hidden;
        }
        .left {
            margin-left: -100%;
            left: -200px;
            width: 200px;
            background: red;
        }
        .right {
            margin-left: -220px;
            right: -220px;
            width: 220px;
            background: green;
        }
        .middle {
            width: 100%;
            background: blue;
            word-break: break-all;
        }
    </style>
</head>
<body>
    <div class='container'>
        <div class='middle'></div>
        <div class='left'></div>
        <div class='right'></div>
    </div>
</body>
複製程式碼
複製程式碼

10.display:none 和 visibility: hidden的區別

display:none 隱藏對應的元素,在文件佈局中不再給它分配空間,它各邊的元素會合攏,就當他從來不存在。

visibility:hidden 隱藏對應的元素,但是在文件佈局中仍保留原來的空間。

11.CSS中 link 和@import 的區別是?

link屬於HTML標籤,而@import是CSS提供的頁面被載入的時,link會同時被載入,而@import引用的CSS會等到頁面被載入完再載入

import只在IE5以上才能識別,而link是HTML標籤,無相容問題

link方式的樣式的權重 高於@import的權重.

12.position的absolute與fixed共同點與不同點

共同點: 改變行內元素的呈現方式,display被置為block 讓元素脫離普通流,不佔據空間 預設會覆蓋到非定位元素上

不同點: absolute的”根元素“是可以設定的 fixed的”根元素“固定為瀏覽器視窗。當你滾動網頁,fixed元素與瀏覽器視窗之間的距離是不變的。

13..transition和animation的區別

Animation和transition大部分屬性是相同的,他們都是隨時間改變元素的屬性值,他們的主要區別是transition需要觸發一個事件才能改變屬性, 而animation不需要觸發任何事件的情況下才會隨時間改變屬性值,並且transition為2幀,從from .... to,而animation可以一幀一幀的。

transition 規定動畫的名字 規定完成過渡效果需要多少秒或毫秒 規定速度效果 定義過渡效果何時開始 animation 指定要繫結到選擇器的關鍵幀的名稱

14.CSS優先順序

不同級別:總結排序:!important > 行內樣式>ID選擇器 > 類選擇器 > 標籤 > 萬用字元 > 繼承 > 瀏覽器預設屬性
	1.屬性後面加!import 會覆蓋頁面內任何位置定義的元素樣式
	2.作為style屬性寫在元素內的樣式
	3.id選擇器
	4.類選擇器
	5.標籤選擇器
	6.萬用字元選擇器(*)
	7.瀏覽器自定義或繼承
**同一級別:後寫的會覆蓋先寫的**
複製程式碼
複製程式碼

css選擇器的解析原則:選擇器定位DOM元素是從右往左的方向,這樣可以儘早的過濾掉一些不必要的樣式規則和元素

15.雪碧圖:

        多個圖片整合在一個圖片中的圖
	使用雪碧圖可以減少網路請求的次數,加快允許的速度
	通過background-position,去定點陣圖片在螢幕的哪個位置
複製程式碼

JS問題

第一章 初識JavaScript

JavaScript(JS)是什麼?

  • JavaScript一種直譯式指令碼語言,是一種動態型別、弱型別、基於原型的語言。
  • JavaScript通常用來操作HTML頁面,響應使用者操作,驗證傳輸資料等
  • java和JavaScript有什麼關係?java和JavaScript沒有關係
  • jQuery和JavaScript有什麼關係?jQuery是由JS編寫的一個js庫。

JS程式碼寫在哪裡?

  • 內嵌 js,
  • 外鏈 js檔案裡面,利用src屬性引入
  • 標籤屬性裡面(不推薦)
  • script標籤中的屬性type="text/javascript"或language=”javascript”,HTML5新規則下可以什麼都不用加;
  • script標籤可以放置於任何位置,不同的位置要注意載入順序,通常放在head或body結束之前;

寫JS程式碼需要注意什麼?

  • 嚴格區分大小寫;
  • 語句字元都是半形字元;(字串裡面可以使任意字元)
  • 某些完整語句後面要寫分號 (;)
  • 程式碼要縮排,縮排要對齊。

JS裡的系統彈窗程式碼

  • alert('內容')
  • confirm('確定?)
  • prompt('請輸入您的姓名:')

變數

很多時候,當我們重複使用某個元素或者某個資料時,內容可能太長或者資料要進行改變,這時就需要定義變數來代替他們。

語法:var + 變數名 或者 let + 變數名 (var 和 let 宣告的區別見後續章節)

Js中的註釋

  • 單行註釋 //
  • 多行註釋 /* */

獲取元素

  • 特殊的標籤
document.body
document.head
document.title
複製程式碼
複製程式碼
  • 一般標籤
document.getElementById()       // 匹配ID名稱…
ele.getElementsByTagName()      // 匹配標籤名是…的集合動態方法
document.getElementsByName()    // 匹配name是…的集合 動態方法
ele.getElementsByClassName()    // 匹配class名稱…的集合 動態方法
ele.querySelector()             // 匹配css選擇器的第一個
ele.querySelectorAll()          // 匹配css選擇器匹配的所有集合
複製程式碼
複製程式碼

獲取和修改元素HTML

  • 元素HTML內容
// ele代表獲取的元素
ele.innerHTML             // 獲取元素HTML
ele.innerHTML = '字串'  // 修改元素HTML
複製程式碼
複製程式碼
  • 元素文字內容
// 標準
ele.textContent             // 獲取元素文字
ele.textContent = '字串'  // 修改元素文字

// 非標準(ie低版本)
ele.innerText               // 獲取元素文字
ele.innerText = '字串'    // 修改元素文字
複製程式碼
複製程式碼

第二章 函式、自定義屬性、事件

變數與屬性的區別

//此為變數
var a = 123;  

//此時object 為節點物件(node)
var object = document.getElementById('box');

//為object自定義了abc屬性,且此屬性的值888888
object.abc = 888888; 

// 物件.屬性名 可以獲取屬性值
object.abc; //888888 
複製程式碼
複製程式碼
  • 屬性分為 : 節點屬性 和 js屬性
  • 節點屬性 : 元素自帶屬性
  • js屬性 : js中自定義的屬性

當js屬性為合法節點屬性的時候,可以修改節點屬性的值

//此時object 為節點物件(node)
var object = document.getElementById('box')

// 修改節點物件object的id屬性, id屬性為節點物件的合法屬性
var object.id = 'box';
複製程式碼
複製程式碼

函式

函式申明

  • 有名函式
// 此時abc就代表此函式,函式不會自動執行,需要呼叫執行。
function abc(){
    console.log(我是有名字的函式)
}
複製程式碼
複製程式碼

帶名字的函式,需函式名加小括號執行,如abc();

  • 匿名函式
function (){} 
複製程式碼
複製程式碼

匿名函式,不進行賦值會報錯

  • 函式表示式
// 匿名函式
var a = function(){}
a() //此時用變數名加()來呼叫

//匿名函式
var b = function abc(){}
b() //此時用變數名加()來呼叫; 如果abc()呼叫會報錯
複製程式碼
複製程式碼

函式/物件方法

  • 物件可以自定義屬性
  • 物件的屬性,如果賦值的是一個函式function(){}, 稱之為物件的方法
// 此時object 為節點物件(nodelist)
var object = document.getElementById('box'); 
// 為object自定義了方法
object.abc = function(){}; 
複製程式碼
複製程式碼

事件屬性

事件 : 是當事人,在特定的時間在特定的地點發生了某事

  • js中的事件: 元素.事件屬性 = 事件函式
// 獲取當前符合條件的節點
var object = document.getElementById('box');
// 給當前節點新增一個點選事件, 配合這對應的處理函式
object.onclick = function(){}
複製程式碼
複製程式碼

function () {}是一個固定的寫法,在這個例子中,它被稱之為事件函式。

事件函式也可以使用有名函式

var object = document.getElementById('box');
object.onclick =  fn;
function fn(){}
複製程式碼
複製程式碼
  • javascript中的事件 [ 滑鼠事件, 鍵盤事件, 表單事件, 系統事件, 等等]
onclick —————— 點選(單擊)事件
onmouseover ———– 滑鼠滑入事件(會冒泡)
onmouseout—————滑鼠離開事件(會冒泡)
onmouseenter————滑鼠滑入事件(不會冒泡)
onmouseleave————滑鼠離開事件(不會冒泡)
ondblclick ——————- 雙擊(單擊)事件
複製程式碼
複製程式碼

更多方法參考www.w3school.com.cn/tags/html_r…

  • 函式中的this

事件函式裡面的this就是指觸發這個事件的元素

<script>
    box.onclick = function(){
       alert( this); //box,本函式是由box觸發的
    }
    function fn(){
        //this指向window,因為fn()屬於window
        // fn()其實是window.fn();是window讓fn執行的
        alert( this );
    }
    fn();
</script>
複製程式碼
複製程式碼

更多關於this的介紹請看後續章節

第三章 操作元素屬性 CSS樣式以及 []的使用

cssStyle 操作

  • style 物件
  • 複合樣式改寫 background-color ------> backgroundColor
  • cssText
  • tyle.float的相容 cssFloat /styleFloat

attribute 屬性節點

  • 獲取: getAttribute(名稱)
優勢:  用.和[]的形式無法操作元素的自定義屬性 getAttribute可以操作元素的自定義屬性
設定: el.setAttribute(名稱, 值)
包含: el.hasAttribute(名稱)
刪除: el.removeAttribute(名稱)
複製程式碼
複製程式碼

[]的運用

當我們需要使用字串表示屬性的時候,或者此時屬性會變化的時候

obj.style.width = '100px';
//可改為
obj.style['width'] = '100px';
//亦可
var str = 'width';
obj.style[str] = '100px'
複製程式碼
複製程式碼

第四章 javascript資料型別 判斷 條件語句

javascript資料型別

七大資料型別 Number String Boolean Null Object Undefined es6新增Symbol

  • number 數字
let num = 123
複製程式碼
複製程式碼
  • String 字串
let str = '只會番茄炒蛋'
複製程式碼
複製程式碼
  • Boolean 布林值
// true / false
let falg = true
複製程式碼
複製程式碼
  • Null 空
// 函式表示式
let abc = function(){}

// 函式宣告/定義
funticon abc () {}
複製程式碼
複製程式碼
  • Object 物件
// (節點物件、自定義物件、array(陣列)、json、function、系統物件)
複製程式碼
複製程式碼
  • Undefined 未定義
  • Symbol
// Symbol是由ES6規範引入的一項新特性,它的功能類似於一種標識唯一性的ID。
複製程式碼
複製程式碼

判斷語句

判斷語句返回布林值

    ==  // 判斷值
    >   // 大於
    <   // 小於
    <=  // 小於等於
    >=  // 大於等於
    !=  // 不等於
    === // 全等於 除了判斷值,還會判斷資料型別
    !== // 不全等
複製程式碼
複製程式碼

if 條件語句

if ( 條件 ) {
    code // 這是條件 滿足時執行的程式碼
}

// 如果()括號裡面是true則執行{} 中程式碼
if ( 條件 ) {
    code 1 // 這是條件滿足時執行的程式碼
} else {
    code 2 // 這是條件不滿足時執行的程式碼
}
// 如果()括號裡面是false 則執行 else 大括號中的程式碼, 總有一個會執行
if ( 條件一 ) {
    code 1 // 這是條件一滿足時執行的程式碼
} else if (條件二) {
    code 2 // 這是條件二滿足時執行的程式碼
} else {
    code 3  // 這是以上兩種條件都不滿足時執行的程式碼
}
複製程式碼
複製程式碼

if () 中的條件會強制轉化為布林值,為false資料: false 0 '' null undefined NaN

三目運算

三目運算子的語法為conditions ? statementA : statementB ;

let num = 5
num = 5 ? 6 : 5
// 上面這段話的意思就是 num 等於5的話 值就改為6 不等於5的話值改為5
複製程式碼
複製程式碼

switch case 條件語句

switch (data) {
    case 1:
        code1 // 執行程式碼
        break // break 來阻止程式碼自動地向下一個 case 執行。
    case 2:
        code2 //// 執行程式碼
        break // break 來阻止程式碼自動地向下一個 case 執行。
    default:
        與 case 1 和 case 2 不同時執行的程式碼
}
複製程式碼
複製程式碼

break break 語句。它用於跳出 switch() 語句,來阻止程式碼自動地向下一個 case 執行

default 關鍵詞來規定匹配不存在時做的事情

第五章 for迴圈 while後迴圈 do while前迴圈

for迴圈

  • for () {}迴圈
for (初始值; 判斷條件; 步幅) {
    code // 執行程式碼
}

for (let i = 0; i < 5; i++) { // i初始值為0;i是否小於5;每次迴圈後i加1
    console.log(i) // 0 1 2 3 4
}
複製程式碼
複製程式碼
  • continue 跳過本次迴圈
for (let i = 0; i < 5; i++) { // i初始值為0;i是否小於5;每次迴圈後i加1
    if  (i === 3) {
        continue
    }
    // 因為在i為3的時候跳過了此次迴圈,所有3沒有被列印出來
    console.log(i) // 0 1 2 4
}
複製程式碼
複製程式碼
  • break的運用
for (let i = 0; i < 5; i++) { // i初始值為0;i是否小於5;每次迴圈後i加1
    if  (i === 3) {
          console.log(i) // 3
          break // 跳出中止迴圈, 提升效能
    }
}
複製程式碼
複製程式碼

變數自增/自減

  • i++ 和 i-- 先賦值後自增或者自減
let a = 10;
let b = a++ // 先把a的值賦值給b, 然後在自增1
console.log(b) // 20
console.log(a) // 21
複製程式碼
複製程式碼
  • ++i 和 --i 先自增或者自減後賦值
let a = 10;
let b = ++a // a的值先自增1, 在賦值給b
console.log(b) // 21
console.log(a) // 21
複製程式碼
複製程式碼

while 後迴圈 do while前迴圈

  • while後迴圈
while (條件) {
    code // 這裡寫要執行的程式碼,條件滿足不斷執行
}
// 條件滿足才會執行code程式碼
複製程式碼
複製程式碼
  • while前迴圈
do {
    code 1 // code 1會先執行一遍,然後在根據條件決定是否再執行code 1;
} while (條件) {
    code // 這裡寫要執行的程式碼,條件滿足不斷執行
}
複製程式碼
複製程式碼

第六章 運算子 型別轉換

算術運算

加—————[+]
減—————[-]
乘—————[*]
除—————[ / ]
取模/取餘—————[%]
複製程式碼
複製程式碼
  • 隱式型別轉換
+ 在有字串的時候,會進行字串拼接
- * / % 會盡力把不是數字的轉化為數字
複製程式碼
複製程式碼
  • NaN ———— not a number(不是一個數字)
不是數字的數字型別(number型別)
NaN和自己都不相等
isNaN( obj ) 判斷是否為NaN,是返回true,否返回false;
複製程式碼
複製程式碼
  • 顯示型別轉化

轉數字

Number() 可以用於任何資料型別轉換成數值
parseInt()、parseFloat():專門用於把字串轉換成數值都是忽略前導的空格

1) Number()
能把字串轉化為數字。
如果字串是空的(不包含任何字元),則將其轉換為0
如果帶非數字的字串,返回NaN。
undefined,返回NaN。
truefalse將分別轉換為1和0。
null值,返回0。
var a = Number( '-100.02' );
console.log( a );       // -100.02
var a = Number( '100px' );
console.log( a );       // NaN
var a = Number( '' );
console.log( a );       // 0
var a = Number( undefined );
console.log( a );       // NaN
var a = Number( true );
console.log( a );       // 1
var a = Number( null );
console.log( a );       // 0

2) parseInt() (取整)取 非數字整前的數字 ,或小數點前的數字
3) parseFloat() 能取得小數,第二個小數點前的數字
複製程式碼
複製程式碼

轉字串

String( obj );
obj.toString();
複製程式碼
複製程式碼

賦值運算

=  +=  -=  *=  /=  %=  ++  --
複製程式碼
複製程式碼

比較運算

<————–小於
> ————-大於
= = ————- 等於
<= ————-小於等於
>= ————- 大於等於
!= ————- 不等於
= = =————- 全等,除了值的判斷,還會進行unicode 編碼的對比
!==————-不全等
返回boolean值
複製程式碼
複製程式碼

邏輯運算

|| ———— 邏輯或
&& ———— 邏輯與

賦值操作
let c = a || b // 如果a為true,則用a賦值, 如何a為false,則用b賦值

let c = a && b // 如果a為true,則通過,用 b 賦值,如果a為false,用 a 賦值

布林值操作
if (a || b) {
    //如果a為true,則為true
    //如果a為false,則看b
}

if (a && b) {
    //如果a為true,則通過,看b,b為true則為true
    //如果a為false,則false
}

取反
if (!obj) {
    // 首先會把obj轉化為布林值,如果 obj是true,則!obj為false
}
複製程式碼
複製程式碼

運算子優先順序

JavaScript中的運算子優先順序是一套規則。該規則在計算表示式時控制運算子執行的順序。具有較高優先順序的運算子先於較低優先順序的運算子執行。

下圖按從最高到最低的優先順序列出JavaScript運算子。具有相同優先順序的運算子按從左至右的順序求值

![img](data:image/svg+xml;utf8,)

第七章 函式[自執行] [傳參] [return] getComputedStyle()

函式自執行

函式自執行方式,即建立立即呼叫一次

  • 函式後面加用小括號,然後在用小括號包起來
(function(){}()) // 函式後面加用小括號,然後在用小括號包起來
複製程式碼
複製程式碼
  • 函式用小括號包起來,然後後面加小括號
(function(){})() // 函式用小括號包起來,然後後面加小括號
複製程式碼
複製程式碼
  • 函式後面加小括號,然後在函式前面加 + - ~ !其中的一個符號
+function(){}()
-function(){}()
!function(){}()
~function(){}()
複製程式碼
複製程式碼

函式傳參

  • 對應傳參

形參:即形式引數,是用來接收函式呼叫時傳遞過來的資料,命名與變數一致

實參:即真實引數,是給形參傳遞的具體資料,任何資料型別都可以稱為實參

function fn(a, b) { // a,b為形參,且a 為 20,b為10,一一對應
    console.log(a) // 20
    console.log(b) // 10
    console.log(a + b) // 30
}
fn(20, 10) // 20,10為實參
複製程式碼
複製程式碼
  • 不定參 arguments

不定參:實參個數不確定 arguments: 是所有實參的集合,arguments是一個類陣列,arguments.length 可以返回實參個數

function fn() {
    console.log(arguments) // 返回一個包含實參的類陣列
}
fn(20, 10, 5) // 20, 10, 5為實參
複製程式碼
複製程式碼

關於什麼是類陣列,請看以後的章節

函式中的return

  • 函式中預設return的返回值為undefined
function fn(a, b) {
    a + b
}
let a = fn(10, 20)
console.log(a) // undefined, 函式如果沒有指定返回值,預設返回undefined
複製程式碼
複製程式碼
  • 自定義返回值

有時候我們需要函式中返回我們需要的值,這個時候return很有用

function fn(a, b) {
    return a + b
}
let a = fn(10, 20)
console.log(a) // 30 
複製程式碼
複製程式碼

return 返回的資料型別可以是任意型別

function fn(a, b) {
    a +b
    return function () {
        alert('ok')
    }
}
let a = fn(10, 20)
a() // 此時a就是返回的函式, a()開啟了一個系統彈窗 
複製程式碼
複製程式碼

return 然後的程式碼不再執行,整個函式結束

function fn(a, b) {
    a +b
    return function () {
        alert('ok')
    }
    console.log('我不會被列印出來,因為上面有return')
}
fn()
複製程式碼
複製程式碼

getComputedStyle()

getComputedStyle(obj,null)[cssStyle]獲取計算後的樣式物件,只讀

<style>
    #elem-container{
    position: absolute;
    left:     100px;
    top:      200px;
    height:   100px;
    }
</style>
<div id="elem-container">dummy</div>
<script>
    let elem = document.getElementById("elem-container");
    let theCSSprop = window.getComputedStyle(elem,null)['left']
    console.log(theCSSprop) // 100px
</script>
複製程式碼
複製程式碼

不要獲取複合樣式:如background

不要獲取未設定的樣式: 谷歌是具體寬度, ie是auto

相容:ie8及以下 obj.currentStyle[cssStyle]

if (window.getComputedStyle) {
    return getComputedStyle(obj)[attr]
} else {
    return obj.currentStyle[attr]
}
複製程式碼
複製程式碼

第八章 作用域 js預解析 閉包

作用域 指令碼的有效範圍,作用範圍。分兩大類:全域性(script)和區域性(function )

全域性(script)域

直接定義在script標籤下的變數及函式,他們都作用在一個域,全域性作用域,so..
<script>
    var a = 123;
    alert( window.a ); // 123
    function abc(){}
    alert( window.abc ); // function abc(){}
 </script>
複製程式碼
複製程式碼

直接定義在script標籤下的變數 稱之為全域性變數,script標籤下的函式,稱之為全域性函式

全域性變數及函式 都是window的一個屬性,都能通過window.變數名訪問

區域性(function )域

任何一個function(){},都會開啟一個區域性作用域

定義在function(){} 內部的變數稱之為 區域性變數

作用域鏈 :區域性作用域內部可以訪問父級作用域變數及全域性作用域變數,也可以訪問父級的函式,及全域性函式 ( 往上爬)

let a = 10
function fn() {
    console.loa(a) // 10
}
複製程式碼
複製程式碼

區域性變數會覆蓋父級(全域性)變數,函式亦如此

let a = 10
function fn() {
    let a = 20
    console.loa(a) // 20
}
複製程式碼
複製程式碼

javascript解析

javascript解析 即讀取程式碼過程

  • javascript解析 是 致上而下
  • 預解析:正式解析前的工作,預解析過程會出現 變數提升,函式提升
function () {
    console.log(a) // undefined
    var a = 10
}
複製程式碼
複製程式碼
  • 變數提升

在作用域內宣告的變數會被提升到作用域的頂部,且對其賦值undefined,這個過程稱之為變數提升

上面的列子解析過程為
function() {
    var a = undefined
    console.log(a) // undefined
    var a = 10
}
複製程式碼
複製程式碼
  • 函式提升

在作用域內的函式定義函式會被提升到作用域的頂部,其值為其函式本身,這個過程稱之為函式提升

function () {
    console.log(fn) // function fn () {}
    function fn () {}
}
複製程式碼
複製程式碼
  • var和函式重名函式優先,留下函式,函式和函式重名 後面定義的覆蓋前面的-後來居高
console.log(a) // function a() { console.log(a2) }
var a = 10
function a() {
    console.log(a1)
}
function a() {
    console.log(a2)
}
a() // 報錯
console.log(a) // 10
複製程式碼
複製程式碼
  • 不會提升的函式:在作用域內的函式表示式函式不會被提升到作用域的頂部,so ~
function () {
    console.log(fn) // undefined
    var fn = function () {}
}
複製程式碼
複製程式碼

閉包

  • js垃圾回收機制
js 中的 變數 函式 不再使用後,會被自動js垃圾回收機制回收
複製程式碼
複製程式碼
  • 形成閉包條件
條件一: 函式內部巢狀函式
條件二: 內部函式引用外部函式的 變數 引數
使用 return 返回了 此內部函式,上面的 變數 和引數 不會被回收

例如:
function fn(x) {
    var a = 5;
    function bibao() {
        var b = a + x
        console.log(x) // 20
        console.log(a) // 5
        console.log(b) // 25
    }
    return bibao
}
var c = fn(20)
console.log(c()) // 20 5 25
複製程式碼
複製程式碼

第九章 字串方法和陣列

String 字串

String即文字(字串),字串方法都不改原字串;

建立字串的三種辦法: new String(), String(), 直接量,三種方式建立出來可以建立

var str = new String('hello')

var str = String('hello')

var str = 'hello' // 直接量
複製程式碼
複製程式碼

string.length 屬性可以返回字串長度

string[index] 通過下標獲取字串

String方法

  • str.concat( str,str...) 字串拼接
用於把一個或多個字串連線 到一塊,返回拼接好的字串
複製程式碼
複製程式碼
  • str.indexOf(value,index )查詢字串,返回查詢字串首次出現的位置;
方法對大小寫敏感!
value 匹配字元
index 開始檢索的位置, 合法值是 0 到 string.length - 1,預設0
匹配失敗返回-1
複製程式碼
複製程式碼
  • str.charAt(index ) 返回指定索引的字串
var str = 'hello'
console.log(str.charAt(3)) // l
複製程式碼
複製程式碼
  • str.charCodeAt(index )返回指定索引的ASCII編碼
  • str.substring(start,end ) 擷取字串,從start 開始,截止到end前,不包含end
如果沒有end則從num開始整個查詢
如果 start 比 stop 大,那麼該方法在提取子串之前會先交換這兩個引數。str.substring(1,4)
複製程式碼
複製程式碼
  • str.slice(start,end ) 擷取字串,從start 開始,截止到end前,不包含end
  • str.toLocaleUpperCase()/ str.toLocaleLowerCase()
str.toLocaleUpperCase() 把字串轉換為大寫。
str.toLocaleLowerCase() 把字串轉換為小寫。
複製程式碼
複製程式碼
  • str.replace( value/RegExp,new ) 用一些字元替換另一些字元,new可以是字串,也可以是函式
  • str.split(value/RegExp,length-1) 方法用於把一個字串分割成字串陣列, 返回分割後的陣列
  • str.search( value/RegExp )返回 檢索字串首次出現的位置;未找到返回-1
  • str.match( value/RegExp )``查詢指定的值,返回匹配的值。未找到返回null.正則可以找一個或多個表示式

更多字串方法請見developer.mozilla.org/zh-CN/

Array 陣列

建立陣列的三種辦法: new Array(), Array(), [] ,三種方式建立出來都是一樣的

var arr = new Array()

var arr = Array()

var arr = [] // 直接量
複製程式碼
複製程式碼
  • arr.length可以訪問陣列的長度
  • 建立即指定陣列長度Array( length )及 new Array( length ),length是 數字的時候,建立的並不是陣列的項,而是陣列的長度,項的內容為undefined
  • [] 通過陣列索引,訪問值
var arr = [1, 2, 3, 4, 5]
arr[0] // 1
複製程式碼
複製程式碼
  • 修改陣列指定索引下的值
var arr = [1, 2, 3, 4, 5]
arr[0] = 8888
console.log(arr) // [8888, 2, 3, 4, 5]
複製程式碼
複製程式碼
  • 在陣列後面新增項
var arr = [1, 2, 3, 4, 5]
arr.length = 8888
console.log(arr) // [1, 2, 3, 4, 5, 8888]
複製程式碼
複製程式碼
  • arr.indexOf( item ) 查詢項
  • 陣列去重

利用for迴圈給陣列去除重複項

var arr = [1,2,3,4,5,6,5,4,3,2,1];
var arr2 = []
for (let i = 0; i < arr.length; i++) {
    if (arr2.indexOf(arr[i] == -1)) {
        arr2.push(arr[i])
    }
}
console.log(arr2) // [1, 2, 3, 4, 5, 6]
複製程式碼
複製程式碼

Array() 陣列方法

  • arr.unshift( item1,item1,…. ) 向陣列的頭部新增一個或更多元素,並返回(新的長度)。
  • arr.push( item1,item1,…. ) 向陣列的尾部新增一個或更多元素,並返回(新的長度)。
  • arr.shift( ) 刪除陣列的第一個元素(返回刪除物件);。
  • arr.pop( ) 刪除陣列的最後一個元素(返回刪除物件)。
  • arr.splice(index,howmany,item1,…..,itemX) (刪除/新增) 元素,然後(只返回刪除物件)。
index 必需。整數,規定新增/刪除專案的索引,可以使用負數,如果是新增,原有元素會往高位移動。
howmany 必需。要刪除的專案數量。如果設定為 0,則不會刪除專案。
item1, ..., itemX可選。向陣列新增的新專案。
複製程式碼
複製程式碼
  • arr.sort() 排序
預設arr.sort() 以首字元編碼大小排序
陣列length小於10以氣泡排序
氣泡排序下依次比較,
return > 0 調換位置,= 0不調換位置,< 0 不調換位置
陣列length大於10以二分排序
複製程式碼
複製程式碼
  • arr.reverse() 反轉陣列

以上方法不建立新的陣列,而是直接修改原有的陣列,同時索引會變化

以下方法會建立出一個新的陣列, 而不是直接修改原陣列

  • arr.concat() 陣列拼接
該陣列是通過把所有 arrX 引數新增到 arr 中生成的。
如果要進行 concat() 操作的引數是陣列,那麼新增的是陣列中的元素,而不是陣列 ——不修改原陣列
複製程式碼
複製程式碼
  • arr.slice() 擷取
arr.slice(start,end)方法從已有的陣列中返回選定的元素
複製程式碼
複製程式碼
  • arr.join() 拼接成字串
  • Array.isArray( ) 判斷是不是陣列
ECMAscript5 的遍歷陣列方法
以下下方法都能實現遍歷,語法也都一樣,只是返回值不一樣—————————————不修改原陣列
array.xxxx( function(currentValue,index,arr ), thisValue )
引數 描述
currentValue ———————必須。當前元素的值
index ——————————–可選。當期元素的索引值
arr————————————可選。當期元素屬於的陣列物件
thisValue ————————–可選。物件作為該執行回撥時使用,傳遞給函式,用作 "this" 的值。
如果省略了 thisValue ,”this” 的值為 “undefined”

function(currentValue, index,arr) 必須。函式,陣列中的每個元素都會執行這個函式
複製程式碼
複製程式碼
  • forEach()
arr.forEach() 從頭至尾遍歷陣列 ——————————————————————————–無返回值
複製程式碼
複製程式碼
  • map() 返回值陣列
arr.map() 返回一個陣列,包含函式所有返回值—————————————————————-返回陣列
var arr = [1, 2, 3, 4]
var newArr = arr.map(function(x){
    return x * x
})
console.log(newArr) // [1, 4, 9, 16]
複製程式碼
複製程式碼
  • filter() true陣列
arr.filter() 返回值是一個 return 值為true或能轉化為true的值——————————————–返回陣列
var arr = [1, 2, 3, 4]
var newArr = arr.filter(item => {
    return item > 3
})
console.log(newArr) // [4]
複製程式碼
複製程式碼
  • every()
arr.every() 針對所有元素,即都為true 則返回true———————————————————————————–返回值
var  arr = [1,2,3,4];
var newArr = arr.every(item => {return item < 5}); 
console.log(newArr) // true, 因為陣列的每一項都小於5

var newArr = arr.every(item => {return item < 3}); 
console.log(newArr) // false, 因為陣列中的某一項不小於3
複製程式碼
複製程式碼
  • some()
arr.some() 是否存在 即有一個是true則為true———————————————————————————–返回值
var  arr = [1,2,3,4];
var newArr = arr.some(item => {return item % 2 === 0});
console.log(newArr) // true, 因為有偶數存在
複製程式碼
複製程式碼

第十章 物件(JSON ) for/in function[all apply bind]

JSON

  • 建立物件(JSON) 物件是Javascript的基本資料結構,物件是引用型別 建立物件的三種方式 物件直接量,new Oject(), Object.create({})[ ES5 ],create建立需要一個物件引數
// 物件都是一個key(鍵):value( 值 )一一對應

var obj = {} // 直接量
var obj = new Object()
var obj = Object.create()
複製程式碼
複製程式碼
  • 訪問JSON的值

obj.attribute 和 obj[attribute]

var obj = {
    age: 20,
    name: '番茄炒蛋',
    sex: '男'
}
console.log(obj.age) // 20
console.log(obj[age]) // 20
複製程式碼
複製程式碼
  • 修改JSON的屬性值
var obj = {
    name: '番茄炒蛋'
}
obj.name = '只會番茄炒蛋'
複製程式碼
複製程式碼
  • 新增JSON屬性
var obj = {
    name: '番茄炒蛋'
}
obj.age = 20
複製程式碼
複製程式碼
  • 刪除JSON屬性
var obj = {
    name: '番茄炒蛋',
    age: 20
}
delete obj.name 或者 delete obj[name]
複製程式碼
複製程式碼
  • JSON數字屬性
var obj = {
    name: '番茄炒蛋',
    age: 20
}
obj[1] = 'hello'
obj[2] = 'word'
複製程式碼
複製程式碼
  • in 判斷物件是否存在某個屬性
var obj = {
    name: '番茄炒蛋',
    age: 20
}
console.log('age' in obj) // true
複製程式碼
複製程式碼

for in遍歷json

  • for in 遍歷JSON
var obj = {
    name: '番茄炒蛋',
    age: 20
}
for (let attr in obj) { //attr 為屬性,attr不是必須的,可以為任意變數名
    console.log(attr) // 屬性名 name age
    console.log(obj[attr]) // 對應的屬性值 '番茄炒蛋' 20
}
複製程式碼
複製程式碼
  • for in 也可以遍歷陣列
var arr = [1, 2, 3, 4]

for (let attr in arr) { //attr 為屬性,attr不是必須的,可以為任意變數名
    console.log(attr) // 下標
    console.log(obj[attr]) // 對應下標的值 1 2 3 4
}
複製程式碼
複製程式碼

for迴圈不能遍歷JSON

JSON物件仿jQuery 鏈式操作 css html

function $ (option) {
    var t = typeOf option
    if (t == 'function') {
        window.onload = option
    } else if (t.toLowerCase() == 'string') {
        var ele = option.subString(1, option.length)
        el = document.getElementById(ele)
    }
    var obj = {
        css: function (attr, val) {
            el.style[attr] = val
            return obj;
        },
        html: function (val) {
            el.innerHTML = val
            return obj
        }
    }
    return obj
}
$('#box').css('backgroundColor','red').html('hello');
複製程式碼
複製程式碼

JSON.parse() 物件化 / JSON.stringify() 物件字元化

  • JSON.parse() JSON.parse(obj )方法解析一個JSON字串,構造由字串描述的JavaScript值或物件。可以提供可選的reviver函式以在返回之前對所得到的物件執行變換。
var obj = '{
    "name": "只會番茄炒蛋",
    "age": 10,
    "sex": "男"
}'

JSON.parse(obj)
// 解析後的值為: 
obj = {
    name: "只會番茄炒蛋",
    age: 10,
    sex: "男"
}
複製程式碼
複製程式碼
  • JSON.stringify() JSON.stringify( obj )與JSON.parse()進行的是反操作
JSON.stringify({});                     // '{}'
JSON.stringify(true);                   // 'true'
JSON.stringify("foo");                  // '"foo"'
JSON.stringify([1, "false", false]);    // '[1,"false",false]'
JSON.stringify({ x: 5 });               // '{"x":5}'
JSON.stringify({x: 5, y: 6});           // "{"x":5,"y":6}"
複製程式碼
複製程式碼

Function call() applay() bind()方法

  • call()和apply都用於函式呼叫
function fn () {
    console.log(this)
}
fn() // window
fn.call('hello') // String {"hello"}
fn.call(123) // Number {123}
複製程式碼
複製程式碼

區別

call( thisvalue, val1,val2,….)

// thisvalue 是函式內部this的值
// 後面是引數列表
複製程式碼
複製程式碼

apply( thisvalue, [val1,val2,….])

// thisvalue 是函式內部this的值
// 後面是引數陣列,所有引數放陣列裡面
複製程式碼
複製程式碼
  • bind()都用於建立中
1) 適用於匿名函式
var fn = function (a, b) {
    console.log(this, a, b)
}.bind('hello', 1, 2)
fn() // String {"hello"} 1 2

2)有名函式,有些特殊
function fn() {
    console.log(this)
}
fn.bind('hello')() // String {"hello"}

3)自執行函式
(function fn() {
    console.log(this)
}.bind('hello')())  // String {"hello"}

(function fn() {
    console.log(this)
}.bind('hello'))() // String {"hello"}

(function fn() {
    console.log(this)
}).bind('hello')() // String {"hello"}
複製程式碼
複製程式碼

第十一章 定時器 Math函式

定時器

  • setInterval()

setInterval(function(){}, 1000) 多用於動畫

第一個引數是一個函式

第二個引數是事件, 表示1秒(1000毫秒)後呼叫一次, 然後每個1秒呼叫執行一次第一個函式裡面的內容

1) 一般使用
var a = 0;
setInterval(function () {
    a++;
    console.log(a) // 每隔一秒列印a 並且a在自增
}, 1000)

var a = 0;
function fn() {
    a++;
    console.log(a)
}
setInterval(fn, 1000)  // 和上面的寫法資料一樣

2)第一個引數fn 與 fn()的區別, fn()會不等延遲直接呼叫, 後面不在呼叫
var a = 0;
function fn() {
    a++;
    console.log(a)
}
setInterval(fn(), 1000)  // 1 列印1,然後就不在呼叫

3) 帶return值的fn
var a = 0;
function fn() {
    a++;
    console.log(a)
    return function(){console.log('ok')}
}
setInterval(fn(), 1000) // 1 列印1,然後就不在呼叫
複製程式碼
複製程式碼
  • clearInterval() 清除定時器
clearInterval(timerManger) 裡面的引數是定時管理器
var timer = setInterval(function(){}, 1000) // 設定變數timer為定時管理器
clearInterval(timer) // 清除timer定時管理器
複製程式碼
複製程式碼
  • setTimeout() 一次定時器

setTimeout( function(){},1000 )

第一個引數是一個函式

第二引數是時間,表示1秒(1000毫秒)後呼叫一次,然後不再呼叫

var a = 0;
setTimeout(function () {
    a++;
    console.log(a) // 1 只有一次列印
})
複製程式碼
複製程式碼
  • clearTimeout() 清除定時器
clearTimeout(timerManger) 裡面的引數是定時管理器
var timer = clearTimeout(function(){}, 1000) // 設定變數timer為定時管理器
clearTimeout(timer) // 清除timer定時管理器
複製程式碼
複製程式碼

Math 數字函式

Math物件用於執行數學任務 Math物件 無需new,直接呼叫Math方法就行

  • Math.random() 求隨機值 左閉右開區間
// 隨機 0~1之間的數
var rand = Math.random()
console.log(rand) // 0~1之間的數

// 隨機 5~10之間的數
var rand =  Math.random() *(10-5) + 5; 
console.log(rand) // 5~10之間的數

// 封裝隨機x至y之間的數
function random(x, y) {
    var rand = x + Math.random() * (y - x)
    return rand
}
複製程式碼
複製程式碼
  • Math.round()————四捨五入
var num = 12.6
Math.round(num) // 13

var num = 12.3
Math.round(num) // 12
複製程式碼
複製程式碼
  • Math.ceil() ————向上取整 (上舍入)
  • Math.floor()————向下取整 (下舍入)
  • Math.abs()—————求絕對值
  • Math.pow(x,y)———–x的y次冪(x的y次方)
  • Math.sqrt(x) —————返回數的平方根
  • Math.max(x,y,z...)——-求x和y的最大值
  • Math.min(x,y,z...)——-求x和y的最小值

Math方法二

“度”的定義是,“兩條射線從圓心向圓周射出,形成一個夾角和夾角正對的一段弧。當這段弧長正好等於圓周長的360分之一時,兩條射線的夾角的大小為1度。(如圖1) 弧度的定義是:兩條射線從圓心向圓周射出,形成一個夾角和夾角正對的一段弧。當這段弧長正好等於圓的半徑時,兩條射線的夾角大小為1弧度。

角所對的弧長是半徑的幾倍,那麼角的大小就是幾弧度。

它們的關係可用下式表示和計算:

( 弧度 )= 弧長 / 半徑

圓的周長是半徑的 2π倍,所以一個周角(360度)是 2π弧度。

  • 度跟弧度之間的換算
據上所述,一個平角是 π 弧度。
即 180度=π弧度
由此可知:
弧度=π/180度 ( ≈0.017453弧度 )
複製程式碼
複製程式碼
  • Math.sin(弧度) 正弦 對邊比斜邊 一個以弧度表示的角
  • Math.cos(弧度)餘弦 鄰邊比斜邊 是 -1.0 到 1.0 之間的數
  • Math.PI
Math.PI 即π 是圓的周長和它的直徑之比。這個值近似為 3.141592653589793
一弧度 = π/180;將角度乘以(2PI/360) 0.017453293 即可轉換為弧度
複製程式碼
複製程式碼

第十二章 日期物件Date

日期

  • new Date() 本地時間
var d = new Date()
console.log(d) // Mon Sep 16 2019 15:48:31 GMT+0800 (中國標準時間)
複製程式碼
複製程式碼
  • toUTCString() 當前 世界時

toUTCString() 根據世界時,把 Date 物件轉換為字串。

var d = new Date();
var utc =  d.toUTCString()
console.log(ytc) // "Mon, 16 Sep 2019 07:48:31 GMT"
複製程式碼
複製程式碼
  • 獲取具體時間
getFullYear()       // 年
getMonth()          // 月( 0 ~ 11 )
getDate()           // 天( 1 ~ 31 )
getDay()            // 星期( 0 ~ 6 )
getHours()          // 時
getMinutes()        // 分
getSeconds()        // 秒
getMilliseconds()   // 毫秒
getTime()           // 返回 1970 年 1 月 1 日至今的毫秒數
複製程式碼
複製程式碼

日期格式化

var date = new Date()

  • date.toLocaleString() ——————–按照本地時間輸出
  • date.toLocaleDateString() —————本地時間 年 月 日
  • date.toLocaleTimeString() ————–本地時間 時 分 秒
  • date.toTimeString()————————本地 時 分 秒 時區
  • date.UTC() ————————————世界時返回 1970 年 1 月 1 日 到指定日期的毫秒數

更多方法參考www.w3school.com.cn/tags/html_r…

### cookie,sessionStorage,localStorage

1、cookie,sessionStorage,localStorage是存放在客戶端,session物件資料是存放在伺服器上 實際上瀏覽器和伺服器之間僅需傳遞session id即可,伺服器根據session-id找到對應的使用者session物件 session儲存資料更安全一些,一般存放使用者資訊,瀏覽器只適合儲存一般的資料 2、cookie資料始終在同源的http請求中攜帶,在瀏覽器和伺服器來回傳遞,裡面存放著session-id sessionStorage,localStorage僅在本地儲存 3、大小限制區別,cookie資料不超過4kb,localStorage在谷歌瀏覽中2.6MB 4、資料有效期不同,cookie在設定的(伺服器設定)有效期內有效,不管視窗和瀏覽器關閉 sessionStorage僅在當前瀏覽器視窗關閉前有效,關閉即銷燬(臨時儲存) localStorage始終有效

SessionStorage和localStorage區別: 1.sessionStorage用於本地儲存一個會話(session)中的資料,這些資料只有在用一個會話的頁面中才能被訪問(也就是說在第一次通訊過程中) 並且在會話結束後資料也隨之銷燬,不是一個持久的本地儲存,會話級別的儲存 2.localStorage用於持久化的本地儲存,除非主動刪除資料,否則不會過期

### token、cookie、session三者的理解???!!!

1、token就是令牌,比如你授權(登入)一個程式時,他就是個依據,判斷你是否已經授權該軟體(最好的身份認證,安全性好,且是唯一的)
    使用者身份的驗證方式    

2、cookie是寫在客戶端一個txt檔案,裡面包括登入資訊之類的,這樣你下次在登入某個網站,就會自動呼叫cookie自動登入使用者名稱
    伺服器生成,傳送到瀏覽器、瀏覽器儲存,下次請求再次傳送給伺服器(存放著登入資訊)

3、session是一類用來客戶端和伺服器之間儲存狀態的解決方案,會話完成被銷燬(代表的就是伺服器和客戶端的一次會話過程)
    cookie中存放著sessionID,請求會傳送這個id。sesion因為request物件而產生。
複製程式碼
複製程式碼

### 基於Token的身份驗證:(最簡單的token: uid使用者唯一的身份識別 + time當前事件戳 + sign簽名)

  1、使用者通過使用者名稱和密碼傳送請求
  2、伺服器端驗證
  3、伺服器端返回一個帶簽名的token,給客戶端
  4、客戶端儲存token,並且每次用於傳送請求
  5、伺服器驗證token並且返回資料
  每一次請求都需要token
複製程式碼
複製程式碼

### cookie與session區別

  1、cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。
  2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。
  3、session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能考慮到減輕伺服器效能方面,應當使用COOKIE。
  4、單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。
複製程式碼
複製程式碼

### session與token區別

  1、session認證只是把簡單的User的資訊儲存Session裡面,sessionID不可預測,一種認證手段。只存在服務端,不能共享到其他的網站和第三方App
  2、token是oAuth Token,提供的是認證和授權,認證針對使用者,授權是針對App,目的就是讓某APP有權訪問某使用者的的資訊。Token是唯一的,
     token不能轉移到其他的App,也不能轉到其他使用者上。(適用於App)
  3、session的狀態是存在伺服器端的,客戶端只存在session id, Token狀態是儲存在客戶端的
複製程式碼
複製程式碼

### Cookie的弊端有哪些???(優勢:儲存客戶端資料,分擔了伺服器儲存的負擔)

  1、數量和長度的限制。每個特定的域名下最多生成20個cookie(chorme和safari沒有限制)
  2、安全性問題。
複製程式碼

設計模式

一、觀察者模式:juejin.im/post/5a14e9… juejin.im/post/5af05d… 在軟體開發設計中是一個物件(subject),維護一系列依賴他的物件(observer),當任何狀態發生改變自動通知他們。強依賴關係 簡單理解:資料發生改變時,對應的處理函式就會自動執行。一個Subjet,用來維護Observers,為某些event來通知(notify)觀察者

二、釋出-訂閱者 有一個資訊中介,過濾 耦合性低 它定義了一種一對多的關係,可以使多個觀察者物件對一個主題物件進行監聽,當這個主題物件發生改變時,依賴的所有物件都會被通知到。

  • -兩者的區別: 1.觀察者模式中,觀察者知道Subject ,兩者是相關聯的,而發發布訂閱者只有通過資訊代理進行通訊 2.在釋出訂閱模式中,元件式鬆散耦合的。正好和觀察者模式相反。 3.觀察者大部分是同步的,比如事件的觸發。Subject就會呼叫觀察者的方法。而釋出訂閱者大多數是非同步的() 4.觀察者模式需要在單個應用程式地址空間中實現,而釋出訂閱者更像交叉應用模式。

資料結構和演算法

一、兩個棧實現一個佇列,兩個佇列實現一個棧 www.cnblogs.com/MrListening…

二、紅黑樹(解決二叉樹依次插入多個節點時的線型排列) juejin.im/post/5a27c6…

三、最小棧的實現(查詢最小元素,用兩個棧配合棧內元素的下標)juejin.im/post/5a2ff8…

四、十大排序

1.氣泡排序:重複走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把它們交換過來。
  實現過程:1.比較相鄰的元素。如果第一個比第二個大,就交換他們兩個
	    2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數
	    3.針對所有的元素重複以上的步驟,除了最後一個
	    4.重複步驟1-3,直到排序完成。
2.選擇排序:首先在未排序序列中找到最小值,放在排序序列的起始位置,然後,在從剩下未排序元素中繼續尋找最小值,然後放在與排序序列的末尾
  實現過程:

3.插入排序:構建有序序列,對於未排序資料,在已排序序列中衝後向前掃描,找到相應位置並插入
  實現過程:1.從第一個元素開始,該元素可以認為已經被排序
	    2.取出下一個元素,在已排序的元素序列中衝後向前掃描
	    3.如果該元素(以排序)大於新元素,將元素向後移一位
	    4.在取出一個元素,比較之前的,直到找到自己合適的位置

4.桶排序:將資料分佈到有限數量的桶裡,每個桶在分別排序

1.快速排序:快速排序使用分治法把一個串(list)分為兩個子串(sub-lists).具體演算法實現
  實現過程:1.從陣列中挑出一個元素,成為一個基準
	    2.重新排列陣列,所有元素比基準小的擺在基準前面,所有元素比基準大的擺在基準後面(相同的可以擺在一邊)
		這個分割槽退出之後,該基準就處於數列的中間位置。成為分割槽操作。
	    3.遞迴的把小於基準值的子數列和大於基準值元素的子數列排序
演算法實現: function quickSort (arr) {
		if (arr.length <= 1) {return arr}
		var destIndex = Math.floor(arr.length/2)
		var left = [], right = [];
		var dest = arr.splice(destIndex,1)[0];
		for (var i =0;i<arr.length;i++){
			if (arr[i]<dest) {
			left.push(arr[i])
			} else {
			right.push(arr[i]) }
		return quickSort(left).concat([dest],quickSort(right)
			

2.堆排序:利用對這種資料結構所涉及的一種排序演算法,堆積是一個近乎完全二叉樹的結構,並同時滿足堆積的性質:即子節點的鍵值或索引總是小於(或大於)它的父節點。
  實現過程:1.
複製程式碼
複製程式碼

五、陣列去重 juejin.im/post/5aed61…

1.雙重迴圈
2.indexOf
3.陣列排序去重 最快你Olong
複製程式碼
複製程式碼

六、字串

判斷迴文字串:(遞迴的思想)
	1.字串分隔,倒轉,聚合[...obj].reverse().join('')
	2.字串頭部和尾部,逐次向中間檢測 
		實現:function isPalindrome(line) {
			line += '';
			for (var i=0,j=line.length-1;i<j;i++,j--) {
				if (line.chartAt(i) !== line.chartAt(j) {
				return false
			}
			
	3.遞迴
複製程式碼
複製程式碼

七、二分查詢(有序陣列的查詢)

 二分查詢可以解決已排序陣列的查詢問題,即只要陣列中包含T(要查詢的值),那麼通過不斷的縮小包含T的資料範圍,就可以最終要找到的數
 (1) 一開始,資料範圍覆蓋整個陣列。
 (2) 將陣列的中間項與T進行比較,如果T比陣列的中間項小,則到陣列的前半部分繼續查詢,反之,則到陣列的後半部分繼續查詢。
 (3) 就這樣,每次查詢都可以排除一半元素,相當於範圍縮小一半。這樣反覆比較,反覆縮小範圍,最終會在陣列中找到T
程式碼實現:function binarySearch (data, dest, start, end){
		var end = end || data.length-1;
		var start = start || 0;
		var m = Math.floor((start+end)/2);
		if (dest<data[m]){
			return binarySearch(data, dest, 0, m-1)
		} else {
			return binarySearch(data, dest, m+1, end)
		}}
		return false
複製程式碼

重寫原始碼

juejin.im/post/5d6e04… 看下這篇就夠了

結語

感謝您的觀看,如有不足之處,歡迎批評指正。

尚未完結 還會持續跟新

相關文章