答案:30pxjavascript
在文檔流中,父元素的高度默認是由子元素撐開的,可是咱們把子元素設置爲浮動後,子元素徹底脫離文檔流,此時子元素沒法撐起父元素的高度,致使父元素高度坍塌。css
給父元素設置高度 缺點:只適用於父元素高度固定的狀況下。html
給父元素也設置浮動樣式(如float: left
) 缺點:給父元素設置浮動樣式後,父元素的父元素也會產生高度坍塌問題。vue
給父元素設置overflow: hidden;
或overflow: auto
缺點:設置hidden會致使超出部分直接被隱藏,且不佔據文檔流位置,而設置auto的話超出部分會生成一個滾動條,影響視覺效果。java
增長塊級元素並設置clear: both
屬性 缺點:增長無心義的標籤node
<style>
.container {
background: lawngreen;
}
.box1 {
background: red;
height: 100px;
width: 300px;
float: left;
}
.box2 {
float: left;
background: rebeccapurple;
height: 200px;
width: 300px;
}
.clear {
clear: both;
}
</style>
<div class="container">
<div class="box1"></div>
<div class="box2"></div>
<div class="clear"></div>
</div>
複製代碼
使用僞元素after 推薦使用這種方法jquery
<style>
.container {
background: lawngreen;
}
.clear {
zoom: 1;
}
.clear:after {
clear: both;
content: '';
display: block;
visibility: hidden;
height: 0;
}
.box1 {
background: red;
height: 100px;
width: 300px;
float: left;
}
.box2 {
float: left;
background: rebeccapurple;
height: 200px;
width: 300px;
}
</style>
<div class="container clear">
<div class="box1"></div>
<div class="box2"></div>
</div>
複製代碼
僞類和僞元素的根本區別在於:它們是否創造了新的元素(抽象)。從咱們模仿其意義的角度來看,若是須要添加新元素加以標識的,就是僞元素,反之,若是隻須要在既有元素上添加類別的,就是僞類。css3
CSS 僞類用於向某些選擇器添加特殊的效果。git
CSS 僞元素用於將特殊的效果添加到某些選擇器。github
這是爲何咱們常常把CSS放在<head></head>
標籤之間,而把JS放在body的最底部的緣由。
設置左右設置float: left
和float: right
,中間使用margin-left
和margin-right
缺點:三個元素沒有按照常規順序排列,中間center的元素必定要放在最後
<style>
.container {
background: #fff;
}
.left {
background: red;
float: left;
width: 200px;
height: 100px;
}
.right {
background: blue;
float: right;
width: 300px;
height: 200px;
}
.center {
background: rebeccapurple;
height: 200px;
margin-right: 300x;
margin-left: 200px;
}
</style>
<div class="container">
<div class="left"></div>
<div class="right"></div>
<div class="center"></div>
</div>
複製代碼
兩側使用絕對定位,中間使用margin-left
,和margin-right
缺點:top的值須要根據頁面上的其它內容肯定
<style>
.container {
background: #fff;
}
.left {
background: red;
width: 200px;
height: 100px;
position: absolute;
top: 0;
left: 0;
}
.center {
background: rebeccapurple;
height: 200px;
margin-left: 200px;
margin-right: 300px;
}
.right {
background: blue;
width: 300px;
height: 200px;
position: absolute;
top: 0;
right: 0;
}
</style>
<div class="container">
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</div>
複製代碼
父元素使用兩端對齊方式display: flex
,中間寬度設置爲width: 100%
<style>
.container {
background: #fff;
display: flex;
}
.left {
background: red;
width: 200px;
height: 100px;
}
.center {
background: rebeccapurple;
height: 200px;
width: 100%;
}
.right {
background: blue;
width: 300px;
height: 200px;
}
</style>
<div class="container">
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</div>
複製代碼
margin負值法:左右兩欄均左浮動,左右兩欄採用負的margin值。
<style>
html,
body {
padding: 0;
margin: 0;
}
.container {
background: #fff;
float: left;
width: 100%;
}
.left {
background: red;
width: 200px;
height: 100px;
float: left;
margin-left: -100%;
}
.center {
background: rebeccapurple;
height: 200px;
margin-left: 200px;
margin-right: 300px;
}
.right {
background: blue;
width: 300px;
height: 200px;
float: left;
margin-left: -300px;
}
</style>
<div class="container">
<div class="center"></div>
</div>
<div class="left"></div>
<div class="right"></div>
複製代碼
ps: px絕對度量單位,就是像素,是屏幕能顯示出的最小的一個點
rem的特色
em的特色:
內聯樣式1000 -- id100 -- 類、僞類、屬性選擇器10 -- 類型選擇器、僞元素選擇器1 經過相加計算大的優先級高,值相等的話後聲明的優先級高。
絕對定位與負邊距實現 缺點:須要知道div的高度和寬度
<style>
.center {
position: relative;
background-color: rebeccapurple;
height: 200px;
width: 200px;
}
.box .content {
position: absolute;
left: 50%;
top: 50%;
width: 20px;
height: 40px;
margin-left: -10px;
margin-top: -20px;
background-color: aqua;
}
</style>
<div class="box center">
<div class="content"></div>
</div>
複製代碼
絕對定位與margin
<style>
.center {
position: relative;
background-color: rebeccapurple;
height: 200px;
width: 200px;
}
.box .content {
position: absolute;
width: 20px;
height: 40px;
background-color: aqua;
margin: auto;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
</style>
<div class="box center">
<div class="content"></div>
</div>
複製代碼
使用CSS3的transform屬性
<style>
.center {
position: relative;
background-color: rebeccapurple;
height: 200px;
width: 200px;
}
.box .content {
position: absolute;
width: 20px;
height: 40px;
background-color: aqua;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
</style>
<div class="box center">
<div class="content"></div>
</div>
複製代碼
使用flex佈局
<style>
.center {
background: rebeccapurple;
height: 200px;
width: 200px;
}
.box {
display: flex;
justify-content: center;
align-items: Center;
}
.content {
background-color: aqua;
width: 20px;
height: 40px;
}
</style>
<div class="box center">
<div class="content"></div>
</div>
複製代碼
使用table-cell 缺點:只支持行內元素inline或inline-block,可將塊級元素設爲inline-block
<style>
.center {
background: rebeccapurple;
height: 200px;
width: 200px;
}
.box {
display: table-cell;
vertical-align: middle;
text-align: center;
}
.content {
background-color: aqua;
width: 20px;
height: 40px;
display: inline-block;
}
</style>
<div class="box center">
<div class="content"></div>
</div>
複製代碼
display:flex和margin:auto
<style>
.center {
background: rebeccapurple;
height: 200px;
width: 200px;
}
.box {
display: flex;
text-align: center;
}
.content {
background-color: aqua;
width: 20px;
height: 40px;
margin: auto;
}
</style>
<div class="box center">
<div class="content"></div>
</div>
複製代碼
border-radius 、box-shadow、border-image、text-shadow、word-wrap、transform、@media、flex
<div class="space">
<a href="##">
惆悵</a><a href="##">
淡定</a><a href="##">
熱血</a>
</div>
或者是:
<div class="space">
<a href="##">惆悵</a
><a href="##">淡定</a
><a href="##">熱血</a>
</div>
或者是藉助HTML註釋:
<div class="space">
<a href="##">惆悵</a><!--
--><a href="##">淡定</a><!--
--><a href="##">熱血</a>
</div>
複製代碼
.space a {
display: inline-block;
margin-right: -3px;
}
複製代碼
<div class="space">
<a href="##">惆悵
<a href="##">淡定
<a href="##">熱血</a>
</div>
注意,爲了向下兼容IE6/IE7等瀏覽器,最後一個列表的標籤的結束(閉合)標籤不能丟。
複製代碼
font-size: 0
.space {
font-size: 0;
-webkit-text-size-adjust:none; //兼容部分瀏覽器
}
複製代碼
單行文本省略
.ellipsis-line {
width: 400px;
overflow: hidden;
text-overflow: ellipsis; //文本溢出顯示省略號
white-space: nowrap; //文本不會換行
}
複製代碼
多行文本省略
.multi-line {
border: 1px solid #f70505;
width: 400px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
複製代碼
利用定位和僞類元素
p{
position: relative;
width:400px;
line-height: 20px;
max-height: 60px;
overflow: hidden;
}
p::after{
content: "...";
position: absolute;
bottom: 0;
right: 0;
padding-left: 40px;
background: -webkit-linear-gradient(left, transparent, #fff 55%);
background: -o-linear-gradient(right, transparent, #fff 55%);
background: -moz-linear-gradient(right, transparent, #fff 55%);
background: linear-gradient(to right, transparent, #fff 55%);
}
複製代碼
{ display: none; /* 不佔據空間,沒法點擊 */ }
{ visibility: hidden; /* 佔據空間,沒法點擊 */ }
{ position: absolute; top: -999em; /* 不佔據空間,沒法點擊 */ }
{ position: relative; top: -999em; /* 佔據空間,沒法點擊 */ }
{ position: absolute; visibility: hidden; /* 不佔據空間,沒法點擊 */ }
{ height: 0; overflow: hidden; /* 不佔據空間,沒法點擊 */ }
{ opacity: 0; filter:Alpha(opacity=0); /* 佔據空間,能夠點擊 */ }
{ position: absolute; opacity: 0; filter:Alpha(opacity=0); /* 不佔據空間,能夠點擊 */ }
複製代碼
漸進加強(progressive enhancement):針對低版本瀏覽器進行構建頁面,保證最基本的功能,而後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗。(從被全部瀏覽器支持的基本功能開始,逐步地添加那些只有新式瀏覽器才支持的功能,向頁面添加無害於基礎瀏覽器的額外樣式和功能。當瀏覽器支持時,它們會自動地呈現出來併發揮做用。)
.transition{
-webkit-transition: all .5s;
-moz-transition: all .5s;
-o-transition: all .5s;
transition: all .5s;
}
複製代碼
優雅降級(graceful degradation):一開始就構建完整的功能,而後再針對低版本瀏覽器進行兼容。(Web站點在全部新式瀏覽器中都能正常工做,若是用戶使用的是老式瀏覽器,則代碼會檢查以確認它們是否能正常工做。因爲IE獨特的盒模型佈局問題,針對不一樣版本的IE的hack實踐過優雅降級了,爲那些沒法支持功能的瀏覽器增長候選方案,使之在舊式瀏覽器上以某種形式降級體驗卻不至於徹底失效。)
.transition{
   transition: all .5s;
   -o-transition: all .5s;
 -moz-transition: all .5s;
-webkit-transition: all .5s;
}
複製代碼
<style>
.box {
width: 200px;
height: 300px;
}
img {
width: 100%;
height: auto;
max-width: 100%;
max-height: 100%;
}
</style>
<div class="box">
<img src="./test.jpg" />
</div>
複製代碼
a) 儘量多的利用硬件能力,使用3D開啓GPU加速translate3d
b) 使用transform的translate替代margin或position中的top、right、bottom和left,同時使用transform中的scaleX或者scaleY來替代width和height
.box {
background-color: blue;
width: 100%;
height: 0;
padding-bottom: 50%;
}
複製代碼
content-box(W3C 標準盒模型)
屬性width,height只包含內容content,不包含border和padding。
佈局所佔寬度Width: Width = width + padding-left + padding-right + border-left + border-right
佈局所佔高度Height: Height = height + padding-top + padding-bottom + border-top + border-bottom
border-box(IE 盒模型)
屬性width,height包含border和padding,指的是content+padding+border
佈局所佔寬度Width: Width = width(包含padding-left + padding-right + border-left + border-right)
佈局所佔高度Height: Height = height(包含padding-top + padding-bottom + border-top + border-bottom)
link
標籤引入的 CSS 被同時加載;@import
引入的 CSS 將在頁面加載完畢後被加載。@import
是 CSS2.1 纔有的語法,故只可在 IE5+ 才能識別;link
標籤做爲 HTML 元素,不存在兼容性問題。link
標籤來改變樣式;因爲 DOM 方法是基於文檔的,沒法使用@import
的方式插入樣式。@import
是 CSS 提供的語法規則,只有導入樣式表的做用;link
是HTML提供的標籤,不只能夠加載 CSS 文件,還能夠定義 RSS、rel 鏈接屬性等。CSS預處理器定義了一種新的語言,其基本思想是,用一種專門的編程語言,爲CSS增長了一些編程的特性,將CSS做爲目標生成文件,而後開發者就只要使用這種語言進行編碼工做。通俗的說,CSS預處理器用一種專門的編程語言,進行Web頁面樣式設計,而後再編譯成正常的CSS文件
因爲不一樣的瀏覽器對CSS的支持及解析結果不同,還因爲CSS中的優先級的關係。咱們就能夠根據這個來針對不一樣的瀏覽器來寫不一樣的CSS。 a) 條件註釋法 只在IE下生效
<!--[if IE]>
這段文字只在IE瀏覽器顯示
<![endif]-->
複製代碼
b) 類內屬性前綴法
line-height: normal; // line-height=font-size*1.2 (默認爲1.2)
line-height:inherit;   // 繼承父元素
line-height:24px;     // 經過像素px或者em等單位賦值
line-height:150%;   // line-height=font-size*1.5
line-height:1.5;    // line-height=font-size*1.5
line-height:1.5em;    // line-height=font-size*1.5
複製代碼
width=device-width
指定了佈局視口=理想視口,而且禁止縮放。因此添上width=device-width
的viewport meta
後頁面變大了(一開始頁面內容小得看不清),其實是佈局視口變小了。
<nav>、<article>、<header>、<section>、<footer>、<video>、<canvas>、draggable拖放、Input 類型color、date、datetime、datetime-local、email、month、number、range、search、tel、time、url、week
DOCTYPE是docunment type(文檔定義)的簡寫,用來講明web設計中所用的html或xhtml的類型,指出瀏覽器或者其餘閱讀程序按照什麼樣的規則
XHTML是XML重寫了HTML的規範,比HTML更加嚴格,表現以下:
一、XHTML中全部的標記都必須有一個相應的結束標籤;
二、XHTML全部標籤的元素和屬性的名字都必須使用小寫;
三、全部的XML標記都必須合理嵌套;
四、全部的**屬性都必須用引號「」**括起來;
五、把全部<和&特殊符號用編碼表示;
六、給全部屬性附一個值;
七、不要在註釋內容中使用「--」;
八、圖片必須使用說明文字。
語義化HTML:用最恰當的HTML元素標記的內容。
語義化是指用合理HTML標記以及其特有的屬性去格式化文檔內容。通俗地講,語義化就是對數據和信息進行處理,使得機器能夠理解.
<title></title>:簡短、描述性、惟一(提高搜索引擎排名)
<hn></hn>:h1~h6分級標題
<header></header>:頁眉一般包括網站標誌、主導航、全站連接以及搜索框。
<nav></nav>:標記導航,僅對文檔中重要的連接羣使用。
<main></main>:頁面主要內容,一個頁面只能使用一次。若是是web應用,則包圍其主要功能。
<article></article>:包含像報紙同樣的內容= =||是這麼理解的,表示文檔、頁面、應用或一個獨立的容器
<section></section>:具備類似主題的一組內容,好比網站的主頁能夠分紅介紹、新聞條目、聯繫信息等條塊。
<footer></footer>:頁腳,只有當父級是body時,纔是整個頁面的頁腳。
<aside></aside>:指定附註欄,包括引述、側欄、指向文章的一組連接、廣告、友情連接、相關產品列表等。
<small></small>:指定細則,輸入免責聲明、註解、署名、版權。
<strong></strong>:表示內容重要性。
<em></em>:標記內容着重點(大量用於提高段落文本語義)。
<time></time>:標記時間。datetime屬性遵循特定格式,若是忽略此屬性,文本內容必須是合法的日期或者時間格式。
<address></address>:做者、相關人士或組織的聯繫信息(電子郵件地址、指向聯繫信息頁的連接)。
<code></code>:標記代碼。包含示例代碼或者文件名 (< < > >)
複製代碼
網頁渲染機制
解析 HTML 標籤, 構建 DOM 樹
解析 CSS 標籤, 構建 CSSOM 樹
把 DOM 和 CSSOM 組合成 渲染樹 (render tree)
在渲染樹的基礎上進行佈局, 計算每一個節點的幾何結構
把每一個節點繪製到屏幕上 (painting)
複製代碼
加載方式
css 異步加載(不阻塞)
img 異步加載(不阻塞)
js 同步加載(阻塞)
複製代碼
放置順序
css 放置於<head>標籤中
緣由:要是頁面在無CSS渲染下先加載HTML的話將會面目全非,樣式先行的話在加載HTML內容時能夠同時渲染樣式
js 放置於</body>標籤以前、body標籤中html內容的後面
緣由:爲了提升頁面渲染的速度效率。瀏覽器在加載<script>元素內部的JS代碼將被從上至下依次解釋,解釋器對<script>元素內部全部代碼求值完畢以前,會阻塞其餘資源的加載,頁面的其他內容都不會被瀏覽器加載顯示,若是放置在前面其餘位置,會對頁面內容的加載速度產生影響。
複製代碼
迴流必將引發重繪,重繪不必定會引發迴流。迴流比重繪的代價要更高。
迴流: 當Render Tree
中部分或所有元素的尺寸、結構、或某些屬性發生改變時,瀏覽器從新渲染部分或所有文檔的過程稱爲迴流。
會致使迴流的操做:
DOM
元素CSS
僞類(例如::hover
)一些經常使用且會致使迴流的屬性和方法:
clientWidth
、clientHeight
、clientTop
、clientLeft
offsetWidth
、offsetHeight
、offsetTop
、offsetLeft
scrollWidth
、scrollHeight
、scrollTop
、scrollLeft
scrollIntoView()
、scrollIntoViewIfNeeded()
getComputedStyle()
getBoundingClientRect()
scrollTo()
重繪: 當頁面中元素樣式的改變並不影響它在文檔流中的位置時(例如:color
、background-color
、visibility
等),瀏覽器會將新樣式賦予給元素並從新繪製它,這個過程稱爲重繪。
數字(number)、字符串(string)、布爾值(boolean)、undefined、null、對象(Object)、Symbol (ES6)
event.stopPropagation()
event.preventDefault()
event.stopImmediatePropagation
event.target
對象來獲取JavaScript中每一個對象都有一個私有屬性(稱之爲 __proto__
),它指向它的原型對象(prototype
)。該 prototype
對象又具備一個本身的 __proto__
,層層向上直到一個對象的原型爲 null。根據定義,null 沒有原型,並做爲這個原型鏈中的最後一個環節。
閉包就是可以讀取其餘函數內部變量的函數。在javascript中,只有函數內部的子函數才能讀取局部變量,因此閉包能夠理解成**「定義在一個函數內部的函數「 **。在本質上,閉包是將函數內部和函數外部鏈接起來的橋樑
function fn () {
var n = 1
return function bar () {
console.log(n++)
}
}
複製代碼
let 、const、 => 、 import、 export、 export defualt
includes、**表示乘方
`padStart、padEnd、Object.values(obj)返回對應的value數組、Object.entries(obj)返回的是有每一對鍵值對數組組成的數組、Object.getOwnPropertyDescriptors(obj)獲取屬性信息
toString()、valueOf()、toLocaleString()、join()、push()、pop()、shift()、unshift()、reverse()、sort()、concat()、slice()、indexOf()、lastIndexOf()、reduce()、map()、forEach()、filter() Array方法詳細介紹
concat()、charAt()、slice()、substr()、substring()、split()、trim()、toLowerCase()、toUpperCase()、match()、search() String方法詳細介紹
1. JSON.parse方法
const newObj = JSON.parse(JSON.stringify(oldObj));
2. 構造一個深克隆函數
function deepClone (obj) {
if (typeof obj !== "object" && typeof obj !== "function") {
return obj;
}
if (typeof obj === "function") {
return eval(obj.toString()); // 有問題
}
if (obj.constructor === Date) {
return new Date(obj.getTime());
}
if (obj.constructor === RegExp) {
return new RegExp(obj);
}
var o = Array.isArray(obj) ? [] : {};
for (i in obj) {
if (obj.hasOwnProperty(i)) {
o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
}
}
return o;
}
複製代碼
==
用於比較判斷二者相等 ==
在比較的時候能夠轉自動換數據類型
===
用嚴格比較判斷二者嚴格相等===
嚴格比較,不會進行自動轉換
0.1的二進制格式是:0.0001100011....。這是一個二進制無限循環小數,但計算機內存有限,咱們不能用儲存全部的小數位數。那麼在精度與內存間如何取捨呢?
答案是:在某個精度點直接捨棄。固然,代價就是,0.1在計算機內部根本就不是精確的0.1,而是一個有舍入偏差的0.1。當代碼被編譯或解釋後,0.1已經被四捨五入成一個與之很接近的計算機內部數字,以致於計算還沒開始,一個很小的舍入錯誤就已經產生了。這也就是 0.1 + 0.2 不等於0.3 的緣由。
MVC
MVP
MVVM
Controller: 負責監聽View的用戶事件,獲得數據後Controller作一些處理,而後渲染View。
Presenter: 比起Controller,Presenter會調用View層提供的接口去渲染Model。這樣作有幾點好處:面向接口編程、更好的解耦、方便作單元測試
ViewModel: 比起MVP中View須要本身提供API,MVVM在VM中構建一組狀態數據(state data),做爲View狀態的抽象。而後經過雙向數據綁定(data binding)使VM中的狀態數據(state data)與View中的顯示狀態(screen state)保持一致。這樣,VM中的展現邏輯只須要修改對應的狀態數據,就能夠控制View的狀態,從而避免在View上開發大量的接口。
複製代碼
a) 減小HTTP請求
b) 使用精靈圖和CSS Sprites(CSS精靈)
c) 使用CDN
d) 將樣式表放在頭部,將腳本放在底部
e) 使用緩存
f) 資源合併壓縮
g) 減小DNS查找
h) 使用懶加載、預加載
setTimeout(表達式,延時時間)在執行時,是在載入後延遲指定時間後,去執行一次表達式,記住,次數是一次 而setInterval(表達式,交互時間),它從載入後,每隔指定的時間就執行一次表達式 ,直到 clearInterval() 被調用或窗口被關閉
JavaScript 是單線程執行的,也就是沒法同時執行多段代碼, 若是代碼中設定了一個 setTimeout
,那麼瀏覽器便會在合適的時間,將代碼插入任務隊列,若是這個時間設爲 0
,就表明當即插入隊列,但不是當即執行。
聲明函數具備函數提高效果,能夠在聲明函數的代碼前執行函數
console.log(add2(1,1)); //輸出2
function add2(a,b){ //函數聲明
return a+b;
}
console.log(add1(1,1)); //報錯:add1 is not a function
var add1 = function(a,b){
return a+b;
}
複製代碼
var會變量提高(預解析),let不會變量提高(變量提高:函數及變量的聲明都將被提高到函數的最頂部。 )
if(true){
// TDZ開始
tmp = 'abc' //報錯
let tmp; //TDZ結束
}
複製代碼
函數做用域是產生閉包的緣由
在Javascript函數體內,標識符arguments具備特殊含義。它是調用對象的一個特殊屬性,用來引用Arguments對象。 Arugments對象就像數組 ,其中arguments[0]表示第一個參數。 arguments.length長度
XSS定義的主語是「腳本」,是一種跨站執行的腳本,也就是javascript腳本,指的是在網站上注入咱們的javascript腳本,執行非法操做。
CSRF定義的主語是」請求「,是一種跨站的僞造的請求,指的是跨站僞造用戶的請求,模擬用戶的操做。
XSS: 經過客戶端腳本語言(最多見如:JavaScript) 在一個論壇發帖中發佈一段惡意的JavaScript代碼就是腳本注入,若是這個代碼內容有請求外部服務器,那麼就叫作XSS!
CSRF:又稱XSRF,冒充用戶發起請求(在用戶不知情的狀況下),完成一些違背用戶意願的請求(如惡意發帖,刪帖,改密碼,發郵件等)。
防護XSS攻擊能夠經過如下兩方面操做:
CSRF攻擊的防護能夠經過如下兩方面操做:
"number","string","boolean","object","function","undefined"
複製代碼
new共經歷了四個過程。
var fn = function () { };
var fnObj = new fn();
複製代碼
建立一個空對象
var obj = new object()
複製代碼
設置原型鏈
obj._proto = fn.prototype;
複製代碼
讓fn的this指向obj,並執行fn函數體
var result = fn.call(obj);
複製代碼
判斷fn的返回值類型,若是是值類型,返回obj。若是是引用類型,就返回這個引用類型的對象。
if (typeof(result) == "object"){
fnObj = result;
} else {
fnObj = obj;
}
return fnObj
複製代碼
var arr = new Array("123", "ash")
- arr instanceof Array
- Array.isArray(arr)
- arr.constructor //查看輸出是否爲function Array(){ [native code] }
- Object.prototype.toString.call(arr) === '[object Array]'
複製代碼
__proto__
和prototype
的區別__proto__
(隱式原型)與prototype
(顯式原型) ,__proto__
指向prototype
默認綁定:
a) 全局環境中,this默認綁定到window console.log(this === window);//true
b) 函數獨立調用時,this默認綁定到window
function foo(){
console.log(this === window);
}
foo(); //true
複製代碼
c) 被嵌套的函數獨立調用時,this默認綁定到window
//雖然test()函數被嵌套在obj.foo()函數中,但test()函數是獨立調用,而不是方法調用。因此this默認綁定到window
var a = 0;
var obj = {
a: 2,
foo: function () {
function test () {
console.log(this.a);
}
test();
}
}
obj.foo(); // 0
複製代碼
隱式綁定
a) 通常地,被直接對象所包含的函數調用時,也稱爲方法調用,this隱式綁定到該直接對象
function foo () {
console.log(this.a);
};
var obj1 = {
a: 1,
foo: foo,
obj2: {
a: 2,
foo: foo
}
}
//foo()函數的直接對象是obj1,this隱式綁定到obj1
obj1.foo(); // 1
//foo()函數的直接對象是obj2,this隱式綁定到obj2
obj1.obj2.foo();// 2
複製代碼
隱式丟失
a) 隱式丟失是指被隱式綁定的函數丟失綁定對象,從而默認綁定到window。這種狀況容易出錯卻又常見
var a = 0;
function foo(){
console.log(this.a);
};
var obj = {
a : 2,
foo:foo
}
//把obj.foo賦予別名bar,形成了隱式丟失,由於只是把foo()函數賦給了bar,而bar與obj對象則毫無關係
var bar = obj.foo;
bar(); // 0
複製代碼
顯式綁定
a) 經過call()、apply()、bind()方法把對象綁定到this上,叫作顯式綁定。對於被調用的函數來講,叫作間接調用
var a = 0;
function foo(){
console.log(this.a);
}
var obj = {
a:2
};
foo(); // 0
foo.call(obj); // 2
複製代碼
new綁定
若是函數或者方法調用以前帶有關鍵字new,它就構成構造函數調用。對於this綁定來講,稱爲new綁定
function fn(){
this.a = 2;
}
var test = new fn();
console.log(test); // {a:2}
複製代碼
a) 原型鏈繼承
核心: 將父類的實例做爲子類的原型
function Cat(){
}
Cat.prototype = new Animal(); //父類Animal實例
Cat.prototype.name = 'cat';
Cat.prototype.constructor = Cat;
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.eat('fish'));
console.log(cat.sleep());
console.log(cat instanceof Animal); //true
console.log(cat instanceof Cat); //true
複製代碼
b) 構造繼承
核心:使用父類的構造函數來加強子類實例,等因而複製父類的實例屬性給子類(沒用到原型)
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true
複製代碼
c) 實例繼承
核心:爲父類實例添加新特性,做爲子類實例返回
function Cat(name){
var instance = new Animal();
instance.name = name || 'Tom';
return instance;
}
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // false
複製代碼
d) 拷貝繼承(支持多繼承)
function Cat(name){
var animal = new Animal();
for(var p in animal){
Cat.prototype[p] = animal[p];
}
Cat.prototype.name = name || 'Tom';
}
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // false
console.log(cat instanceof Cat); // true
複製代碼
e) 組合繼承
核心:經過調用父類構造,繼承父類的屬性並保留傳參的優勢,而後經過將父類實例做爲子類原型,實現函數複用
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
Cat.prototype = new Animal();
// 組合繼承也是須要修復構造函數指向的。
Cat.prototype.constructor = Cat;
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); // true
複製代碼
f)寄生組合繼承
核心:經過寄生方式,砍掉父類的實例屬性,這樣,在調用兩次父類的構造的時候,就不會初始化兩次實例方法/屬性,避免的組合繼承的缺點
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
(function(){
// 建立一個沒有實例方法的類
var Super = function(){};
Super.prototype = Animal.prototype;
//將實例做爲子類的原型
Cat.prototype = new Super();
})();
Cat.prototype.constructor = Cat; // 須要修復下構造函數
// Test Code
var cat = new Cat();
console.log(cat.name);
console.log(cat.sleep());
console.log(cat instanceof Animal); // true
console.log(cat instanceof Cat); //true
複製代碼
JS獲取的是DOM元素。 jQuery返回的是jQuery對象, jQuery對象比js對象多了一些包裝方法,好比.htm() .attr() .css() 等等
經過Object建立對象
var person = new Object();
person.name = "hebiwen";
person.getName = function() {
console.log(this.name);
};
複製代碼
經過字面量建立
var person = {
name: "hebiwen",
getName: function() {
console.log(this.name);
}
}
複製代碼
工場模式(沒法識別對象類型,即沒法經過instanceof
和constructor
來識別對象類型)
function createPerson(name) {
var o = new Object();
o.name = name;
o.getNmae = function() {
console.log(this.name);
};
return o;
}
var person = createPerson("hebiwen");
複製代碼
構造函數
function Person(name) {
this.name = name;
this.getName = function() {
console.log(this.name);
}
}
var person = new Person("person");
複製代碼
構造函數的問題:
每一個方法都要在每一個實例上從新建立一次,尤爲是函數,這樣每一個Person
的實例都包含了一個不一樣的sayName
的函數實例。
注意1 構造函數沒有return
語句。要建立Person
的新實例,必須採用new
操做符,new
操做符大致上完成了一下4件事情:
Person
建立的新對象,記爲person);this.name=name;this.say.....
);注意2 構造函數也是函數,若是不經過new
操做符調用,則做用環境爲全局(瀏覽器中爲windows
,node環境中爲global
)
原型模式
function Person() {}
Person.prototype.name = "hebiwen";
Person.prototype.getName = function() {
console.log(this.name);
}
var person = new Person();
複製代碼
瀏覽器支持:IE9+,這樣全部的Person
實例共享name
屬性及sayName
函數
注意1
hasOwnProperty()
來肯定,若是是在原型中,則返回false
。in
操做符,例如console.log("name" in person)//true
來判斷,不管是在原型仍是實例中,都返回true
,經過for-in
循環時,實例及原型中均會被枚舉。注意2 在定義原型時,若是用字面量代替爲prototype
屬性定義,則原型的constructor
屬性不會指向Person
。由於經過字面量定義,徹底重寫了默認的prototype
對象。可是此時instanceof
仍是可以返回正確的結果。
function Person(){};
Person.prototype={
name : "hebiwen",
sayName : function(){
console.log(this.name);
}
};
var person = new Person();
console.log(person instanceof Person);//true
console.log(person.constructor == Person);//false
console.log(person.constructor == Object);//true
複製代碼
注意3 在重定義原型前,不能建立對象實例,不然會形成實例的原型指向錯誤
構造函數與原型組合
function Person(name) {
this.name = name;
this.friends = ["Bob","Harry"];//引用類型爲實例屬性
}
Person.prototype.getName = function() {
console.log(this.name);
}
複製代碼
動態原型
function Person(name) {
this.name = name;
this.friends = ["Bob","Harry"];//引用類型爲實例屬性
if(typeof this.sayName != "function"){
Person.prototype.sayName = function(){
console.log(this.name);
};
}
}
複製代碼
寄生構造模式
function Person(name) {
var o = new Object();
o.name = name;
o.getName = function() {
console.log(this.name);
}
return o;
}
var person = new Person("hebiwen");
複製代碼
穩妥構造函數模式
function Person(name) {
var o = new Object();
var _name = name;
o.getName = function() {
console.log(_name);
}
return o;
}
var person = Person("hebiwen");
複製代碼
JSONP
利用script標籤支持跨域的屬性,用script標籤拿到包裹了數據的方法(至關因而返回了一段js代碼),在請求中包含callback,服務端注入參數後返回這個回調函數,而後script標籤拿到返回的js代碼跨域直接運行回調,須要先後端的配合。
複製代碼
CORS
請求頭中的Content-Type請求頭的值是下列之一:
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
複製代碼
服務端代理
由於服務器間的數據交互沒有跨域限制,因此咱們能夠經過一箇中間代理服務器來請求目標服務器的數據,也就是開發服務器發送請求到代理服務器,代理服務器再請求目標服務器,將數據返回給開發服務器
複製代碼
不支持,由於script不支持post請求
img link iframe 等元素均可以發送跨域請求
Mounting:組件掛載,已插入真實DOM
組件即將被渲染到頁面以前觸發,此時能夠進行開啓定時器、向服務器發送請求等操做
組件渲染
組件已經被渲染到頁面中後觸發:此時頁面中有了真正的DOM的元素,能夠進行DOM相關的操做
Updating:組件更新,正在被從新渲染
在組件接收到一個新的 prop (更新後)時被調用。這個方法在初始化render時不會被調用。
返回一個布爾值。在組件接收到新的props或者state時被調用。在初始化時或者使用forceUpdate時不被調用。 能夠在你確認不須要更新組件時使用。
在組件接收到新的props或者state但尚未render時被調用。在初始化時不會被調用
在組件完成更新後當即調用。在初始化時不會被調用。
Unmounting:組件移除,已移出真實DOM
組件被銷燬時觸發。這裏咱們能夠進行一些清理操做,例如清理定時器,取消Redux的訂閱事件等等。
數據劫持: vue.js 則是採用數據劫持結合發佈者-訂閱者模式的方式,經過Object.defineProperty()
來劫持各個屬性的setter
,getter
,在數據變更時發佈消息給訂閱者,觸發相應的監聽回調。 Object.defineProperty()
方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 並返回這個對象。
發佈者-訂閱者模式: 通常經過sub, pub的方式實現數據和視圖的綁定監聽,更新數據方式一般作法是 vm.set('property', value)
,
<div>
<input type="text" id="text1" />
<span id="text2"></span>
</div>
<script>
//視圖控制器
var obj = {}
Object.defineProperty(obj, 'text', {
set: function(newValue) {
document.getElementById('text1').value = newValue
document.getElementById('text2').innerHTML = newValue
}
})
document.addEventListener('keyup', function(e) {
obj.text = e.target.value
})
</script>
複製代碼
問題1: 爲何要三次握手?
答:三次握手的目的是創建可靠的通訊信道,說到通信,簡單來講就是數據的發送與接收,而三次握手最主要的目的就是雙方確認本身與對方的發送與接收機能正常。
問題2:爲何要發送特定的數據包,隨便發不行嗎?
答:三次握手的另一個目的就是確認雙方都支持TCP,告知對方用TCP傳輸。
問題3:上圖中的SYN和ACK是什麼?
答:SYN是標誌位,SYN=1表示請求鏈接;
問題1: 爲何要四次揮手?
答:根本緣由是,一方發送FIN只表示本身發完了全部要發的數據,但還容許對方繼續把沒發完的數據發過來。
問題2:爲何雙方要發送這樣的數據包?
答:和握手的狀況相似,只是爲了讓對方知曉本身理解了對方的意圖。
瀏覽器緩存的優勢有:
1.減小了冗餘的數據傳輸,節省了網費
2.減小了服務器的負擔,大大提高了網站的性能
3.加快了客戶端加載網頁的速度
1.強緩存:不會向服務器發送請求,直接從緩存中讀取資源,在chrome控制檯的network選項中能夠看到該請求返回200的狀態碼;
2.協商緩存:向服務器發送請求,服務器會根據這個請求的request header的一些參數來判斷是否命中協商緩存,若是命中,則返回304狀態碼並帶上新的response header通知瀏覽器從緩存中讀取資源;
**已存在緩存數據時,僅基於強制緩存,請求數據的流程以下 **
已存在緩存數據時,僅基於對比緩存,請求數據的流程以下
HTTP2.0的新特性
序號 | 方法 | 描述 |
---|---|---|
1 | GET | 請求指定的頁面信息,並返回實體主體。 |
2 | HEAD | 相似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭 |
3 | POST | 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會致使新的資源的創建和/或已有資源的修改。 |
4 | PUT | 從客戶端向服務器傳送的數據取代指定的文檔的內容。 |
5 | DELETE | 請求服務器刪除指定的頁面。 |
6 | CONNECT | HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器。 |
7 | OPTIONS | 容許客戶端查看服務器的性能。 |
8 | TRACE | 回顯服務器收到的請求,主要用於測試或診斷。 |
cookie和session的區別(cookie和session都是用來跟蹤瀏覽器用戶身份的會話方式。 )
a) 保持狀態 :cookie保存在瀏覽器端,session保存在服務器端
b) 存儲內容:cookie只能保存字符串類型,以文本的方式;session經過相似與Hashtable的數據結構來保存,能支持任何類型的對象(session中可含有多個對象)
c) 存儲的大小:cookie:單個cookie保存的數據不能超過4kb;session大小沒有限制。
d) 安全性:cookie:針對cookie所存在的攻擊:Cookie欺騙,Cookie截獲;session的安全性大於cookie。
WebStorage
HTML5的WebStorage提供了兩種API:localStorage(本地存儲)和sessionStorage(會話存儲)
a) 生命週期:localStorage:localStorage的生命週期是永久的,關閉頁面或瀏覽器以後localStorage中的數據也不會消失。localStorage除非主動刪除數據,不然數據永遠不會消失。
b) 存儲大小:localStorage和sessionStorage的存儲數據大小通常都是:5MB
c) 存儲位置:localStorage和sessionStorage都保存在客戶端,不與服務器進行交互通訊。
d) 存儲內容類型:localStorage和sessionStorage只能存儲字符串類型,對於複雜的對象可使用ECMAScript提供的JSON對象的stringify和parse來處理
e) 應用場景:localStoragese:經常使用於長期登陸(+判斷用戶是否已登陸),適合長期保存在本地的數據。sessionStorage:敏感帳號一次性登陸;
最大特色就是,服務器能夠主動向客戶端推送信息,客戶端也能夠主動向服務器發送信息 ,HTTP 協議作不到服務器主動向客戶端推送信息。
(1)創建在 TCP 協議之上,服務器端的實現比較容易。
(2)與 HTTP 協議有着良好的兼容性。默認端口也是80和443,而且握手階段採用 HTTP 協議,所以握手時不容易屏蔽,能經過各類 HTTP 代理服務器。
(3)數據格式比較輕量,性能開銷小,通訊高效。
(4)能夠發送文本,也能夠發送二進制數據。
(5)沒有同源限制,客戶端能夠與任意服務器通訊。
(6)協議標識符是ws
(若是加密,則爲wss
),服務器網址就是 URL。
先暫存一下工做空間改動:git stash
新建一個分支,而且換到這個新分支
git branch fix_bug
//新建分支
git checkout fix_bug
//切換分支
這時候就能夠安心的在這個fix_bug分支改bug了,改完以後
git add .
git commit -m "fix a bug"
切換到master主分支
git checkout master
從fix_bug合併到master分支
git merge fix_bug
提交代碼
git push
而後從暫存區恢復代碼
git stash pop
原子性(Atomicity)
原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾,所以事務的操做若是成功就必需要徹底應用到數據庫,若是操做失敗則不能對數據庫有任何影響。
一致性(Consistency)
一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態,也就是說一個事務執行以前和執行以後都必須處於一致性狀態。
隔離性(Isolation)
隔離性是當多個用戶併發訪問數據庫時,好比操做同一張表時,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。
持久性(Durability)
持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做。