文章涉及的內容可能不全面,但量不少,須要慢慢看。我花了很長的時間整理,用心分享心得,但願對你們有所幫助。可是不免會有打字的錯誤或理解的錯誤點,但願發現的能夠郵箱告訴我1163675970@qq.com,我會及時的進行修改,只但願對你有所幫助,謝謝。javascript
本片文章記錄一下當時本身學習JavaScript的過程以及一些知識點和注意事項,從基礎到中高級的內容都有,會以章節的形式慢慢展現出來css
能夠簡單的使一個元素居中(包括水平和垂直居中) 柵格式系統佈局,bootstrap gridhtml
方案一:position(絕對定位法) center的div須要放在最後面 絕對定位法原理將左右兩邊使用absolute定位,由於絕對定位使其脫離文檔流,後面的center會天然流動到他們的上賣弄,而後margin屬性,留出左右兩邊的寬度。就能夠自適應了。java
方案二:float 自身浮動法 center的div須要放到後面 自身浮動法的原理就是對左右使用float:left和float:right,float使左右兩個元素脫離文檔流,中間的正常文檔流中,使用margin指定左右外邊距對其進行一個定位。node
聖盃佈局:原理就是margin負值法。使用聖盃佈局首先須要在center元素外部包含一個div,包含的div須要設置float屬性使其造成一個BFC,而且這個寬度和margin的負值進行匹配css3
方案一:左邊設置浮動,右邊寬度設置100% .left{float:left} .right:{width:100%}es6
方案二:左設置浮動,右用cacl去補寬度計算 .left{float:left} .right:{width:cacl(100vw-200px}算法
方案三:父容器設置display:flex right部分是設置flex:1json
方案四:右邊div套個包裹、並前置、左及包裹 雙浮動bootstrap
行內元素居中(父元素text-align:center)
塊狀元素居中(塊狀元素沒發用text-align)
- 1. 寬度必定:margin:auto
- 2.寬度不定:塊級變行內,而後在父上text-aligin
float
複製代碼
理解: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 設置子元素在父元素中居中,前提是子元素沒有把父元素佔滿,讓子元素水平居中。
transtion transition-property 規定設置過渡效果的 CSS 屬性的名稱。
transition-duration 規定完成過渡效果須要多少秒或毫秒。
transition-timing-function 規定速度效果的速度曲線。
transition-delay 定義過渡效果什麼時候開始。
animation屬性能夠像Flash製做動畫同樣,經過控制關鍵幀來控制動畫的每一步,實現更爲複雜的動畫效果。
ainimation實現動畫效果主要由兩部分組成:
經過相似Flash動畫中的幀來聲明一個動畫;
在animation屬性中調用關鍵幀聲明的動畫。
translate 3D建模效果
圖片中的 alt屬性是在圖片不能正常顯示時出現的文本提示。
圖片中的 title屬性是在鼠標在移動到元素上的文本提示。
<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>
複製代碼
複製代碼
標準盒子模型:寬度=內容的寬度(content)+ border + padding
低版本IE盒子模型:寬度=內容寬度(content+border+padding)
已知寬度,block元素 ,添加添加margin:0 auto屬性。
已知寬度,絕對定位的居中 ,上下左右都爲0,margin:auto
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; /* 方便看效果 */
}
複製代碼
複製代碼
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
}
複製代碼
複製代碼
聖盃佈局/雙飛翼佈局
<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>
複製代碼
複製代碼
display:none 隱藏對應的元素,在文檔佈局中再也不給它分配空間,它各邊的元素會合攏,就當他歷來不存在。
visibility:hidden 隱藏對應的元素,可是在文檔佈局中仍保留原來的空間。
link屬於HTML標籤,而@import是CSS提供的頁面被加載的時,link會同時被加載,而@import引用的CSS會等到頁面被加載完再加載
import只在IE5以上才能識別,而link是HTML標籤,無兼容問題
link方式的樣式的權重 高於@import的權重.
共同點: 改變行內元素的呈現方式,display被置爲block 讓元素脫離普通流,不佔據空間 默認會覆蓋到非定位元素上
不一樣點: absolute的」根元素「是能夠設置的 fixed的」根元素「固定爲瀏覽器窗口。當你滾動網頁,fixed元素與瀏覽器窗口之間的距離是不變的。
Animation和transition大部分屬性是相同的,他們都是隨時間改變元素的屬性值,他們的主要區別是transition須要觸發一個事件才能改變屬性, 而animation不須要觸發任何事件的狀況下才會隨時間改變屬性值,而且transition爲2幀,從from .... to,而animation能夠一幀一幀的。
transition 規定動畫的名字 規定完成過渡效果須要多少秒或毫秒 規定速度效果 定義過渡效果什麼時候開始 animation 指定要綁定到選擇器的關鍵幀的名稱
不一樣級別:總結排序:!important > 行內樣式>ID選擇器 > 類選擇器 > 標籤 > 通配符 > 繼承 > 瀏覽器默認屬性
1.屬性後面加!import 會覆蓋頁面內任何位置定義的元素樣式
2.做爲style屬性寫在元素內的樣式
3.id選擇器
4.類選擇器
5.標籤選擇器
6.通配符選擇器(*)
7.瀏覽器自定義或繼承
**同一級別:後寫的會覆蓋先寫的**
複製代碼
複製代碼
css選擇器的解析原則:選擇器定位DOM元素是從右往左的方向,這樣能夠儘早的過濾掉一些沒必要要的樣式規則和元素
多個圖片集成在一個圖片中的圖
使用雪碧圖能夠減小網絡請求的次數,加快容許的速度
經過background-position,去定位圖片在屏幕的哪一個位置
複製代碼
不少時候,當咱們重複使用某個元素或者某個數據時,內容可能太長或者數據要進行改變,這時就須要定義變量來代替他們。
語法:var
+ 變量名
或者 let
+ 變量名
(var 和 let 聲明的區別見後續章節)
document.body
document.head
document.title
複製代碼
複製代碼
document.getElementById() // 匹配ID名稱…
ele.getElementsByTagName() // 匹配標籤名是…的集合動態方法
document.getElementsByName() // 匹配name是…的集合 動態方法
ele.getElementsByClassName() // 匹配class名稱…的集合 動態方法
ele.querySelector() // 匹配css選擇器的第一個
ele.querySelectorAll() // 匹配css選擇器匹配的全部集合
複製代碼
複製代碼
// 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屬性爲合法節點屬性的時候,能夠修改節點屬性的值
//此時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()調用會報錯
複製代碼
複製代碼
// 此時object 爲節點對象(nodelist)
var object = document.getElementById('box');
// 爲object自定義了方法
object.abc = function(){};
複製代碼
複製代碼
事件 : 是當事人,在特定的時間在特定的地點發生了某事
// 獲取當前符合條件的節點
var object = document.getElementById('box');
// 給當前節點添加一個點擊事件, 配合這對應的處理函數
object.onclick = function(){}
複製代碼
複製代碼
function () {}是一個固定的寫法,在這個例子中,它被稱之爲事件函數。
事件函數也可使用有名函數
var object = document.getElementById('box');
object.onclick = fn;
function fn(){}
複製代碼
複製代碼
onclick —————— 點擊(單擊)事件
onmouseover ———– 鼠標滑入事件(會冒泡)
onmouseout—————鼠標離開事件(會冒泡)
onmouseenter————鼠標滑入事件(不會冒泡)
onmouseleave————鼠標離開事件(不會冒泡)
ondblclick ——————- 雙擊(單擊)事件
複製代碼
複製代碼
更多方法參考www.w3school.com.cn/tags/html_r…
事件函數裏面的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的介紹請看後續章節
優點: 用.和[]的形式沒法操做元素的自定義屬性 getAttribute能夠操做元素的自定義屬性
設置: el.setAttribute(名稱, 值)
包含: el.hasAttribute(名稱)
刪除: el.removeAttribute(名稱)
複製代碼
複製代碼
當咱們須要使用字符串表示屬性的時候,或者此時屬性會變化的時候
obj.style.width = '100px';
//可改成
obj.style['width'] = '100px';
//亦可
var str = 'width';
obj.style[str] = '100px'
複製代碼
複製代碼
七大數據類型 Number String Boolean Null Object Undefined es6新增Symbol
let num = 123
複製代碼
複製代碼
let str = '只會番茄炒蛋'
複製代碼
複製代碼
// true / false
let falg = true
複製代碼
複製代碼
// 函數表達式
let abc = function(){}
// 函數聲明/定義
funticon abc () {}
複製代碼
複製代碼
// (節點對象、自定義對象、array(數組)、json、function、系統對象)
複製代碼
複製代碼
// Symbol是由ES6規範引入的一項新特性,它的功能相似於一種標識惟一性的ID。
複製代碼
複製代碼
判斷語句返回布爾值
== // 判斷值
> // 大於
< // 小於
<= // 小於等於
>= // 大於等於
!= // 不等於
=== // 全等於 除了判斷值,還會判斷數據類型
!== // 不全等
複製代碼
複製代碼
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 (data) {
case 1:
code1 // 執行代碼
break // break 來阻止代碼自動地向下一個 case 運行。
case 2:
code2 //// 執行代碼
break // break 來阻止代碼自動地向下一個 case 運行。
default:
與 case 1 和 case 2 不一樣時執行的代碼
}
複製代碼
複製代碼
break break 語句。它用於跳出 switch() 語句,來阻止代碼自動地向下一個 case 運行
default 關鍵詞來規定匹配不存在時作的事情
for (初始值; 判斷條件; 步幅) {
code // 執行代碼
}
for (let i = 0; i < 5; i++) { // i初始值爲0;i是否小於5;每次循環後i加1
console.log(i) // 0 1 2 3 4
}
複製代碼
複製代碼
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
}
複製代碼
複製代碼
for (let i = 0; i < 5; i++) { // i初始值爲0;i是否小於5;每次循環後i加1
if (i === 3) {
console.log(i) // 3
break // 跳出停止循環, 提高性能
}
}
複製代碼
複製代碼
let a = 10;
let b = a++ // 先把a的值賦值給b, 而後在自增1
console.log(b) // 20
console.log(a) // 21
複製代碼
複製代碼
let a = 10;
let b = ++a // a的值先自增1, 在賦值給b
console.log(b) // 21
console.log(a) // 21
複製代碼
複製代碼
while (條件) {
code // 這裏寫要執行的代碼,條件知足不斷執行
}
// 條件知足纔會執行code代碼
複製代碼
複製代碼
do {
code 1 // code 1會先執行一遍,而後在根據條件決定是否再執行code 1;
} while (條件) {
code // 這裏寫要執行的代碼,條件知足不斷執行
}
複製代碼
複製代碼
加—————[+]
減—————[-]
乘—————[*]
除—————[ / ]
取模/取餘—————[%]
複製代碼
複製代碼
+ 在有字符串的時候,會進行字符串拼接
- * / % 會盡力把不是數字的轉化爲數字
複製代碼
複製代碼
不是數字的數字類型(number類型)
NaN和本身都不相等
isNaN( obj ) 判斷是否爲NaN,是返回true,否返回false;
複製代碼
複製代碼
轉數字
Number() 能夠用於任何數據類型轉換成數值
parseInt()、parseFloat():專門用於把字符串轉換成數值都是忽略前導的空格
1) Number()
能把字符串轉化爲數字。
若是字符串是空的(不包含任何字符),則將其轉換爲0
若是帶非數字的字符串,返回NaN。
undefined,返回NaN。
true和false將分別轉換爲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, )
函數自執行方式,即建立當即調用一次
(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.length 能夠返回實參個數
function fn() {
console.log(arguments) // 返回一個包含實參的類數組
}
fn(20, 10, 5) // 20, 10, 5爲實參
複製代碼
複製代碼
關於什麼是類數組,請看之後的章節
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(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]
}
複製代碼
複製代碼
做用域 腳本的有效範圍,做用範圍。分兩大類:全局(script)和局部(function )
直接定義在script標籤下的變量及函數,他們都做用在一個域,全局做用域,so..
<script>
var a = 123;
alert( window.a ); // 123
function abc(){}
alert( window.abc ); // function abc(){}
</script>
複製代碼
複製代碼
直接定義在script標籤下的變量 稱之爲全局變量,script標籤下的函數,稱之爲全局函數
全局變量及函數 都是window的一個屬性,都能經過window.變量名訪問
任何一個function(){},都會開啓一個局部做用域
定義在function(){} 內部的變量稱之爲 局部變量
做用域鏈 :局部做用域內部能夠訪問父級做用域變量及全局做用域變量,也能夠訪問父級的函數,及全局函數 ( 往上爬)
let a = 10
function fn() {
console.loa(a) // 10
}
複製代碼
複製代碼
局部變量會覆蓋父級(全局)變量,函數亦如此
let a = 10
function fn() {
let a = 20
console.loa(a) // 20
}
複製代碼
複製代碼
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 () {}
}
複製代碼
複製代碼
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
複製代碼
複製代碼
function () {
console.log(fn) // undefined
var fn = function () {}
}
複製代碼
複製代碼
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即文本(字符串),字符串方法都不改原字符串;
建立字符串的三種辦法: new String(), String(), 直接量,三種方式建立出來能夠建立
var str = new String('hello')
var str = String('hello')
var str = 'hello' // 直接量
複製代碼
複製代碼
string.length 屬性能夠返回字符串長度
string[index] 經過下標獲取字符串
用於把一個或多個字符串鏈接 到一塊,返回拼接好的字符串
複製代碼
複製代碼
方法對大小寫敏感!
value 匹配字符
index 開始檢索的位置, 合法值是 0 到 string.length - 1,默認0
匹配失敗返回-1
複製代碼
複製代碼
var str = 'hello'
console.log(str.charAt(3)) // l
複製代碼
複製代碼
若是沒有end則從num開始整個查找
若是 start 比 stop 大,那麼該方法在提取子串以前會先交換這兩個參數。str.substring(1,4)
複製代碼
複製代碼
str.toLocaleUpperCase() 把字符串轉換爲大寫。
str.toLocaleLowerCase() 把字符串轉換爲小寫。
複製代碼
複製代碼
更多字符串方法請見developer.mozilla.org/zh-CN/
建立數組的三種辦法: new Array(), Array(), [] ,三種方式建立出來都是同樣的
var arr = new Array()
var arr = Array()
var arr = [] // 直接量
複製代碼
複製代碼
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]
複製代碼
複製代碼
利用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]
複製代碼
複製代碼
index 必需。整數,規定添加/刪除項目的索引,可使用負數,若是是添加,原有元素會往高位移動。
howmany 必需。要刪除的項目數量。若是設置爲 0,則不會刪除項目。
item1, ..., itemX可選。向數組添加的新項目。
複製代碼
複製代碼
默認arr.sort() 以首字符編碼大小排序
數組length小於10以冒泡排序
冒泡排序下依次比較,
return > 0 調換位置,= 0不調換位置,< 0 不調換位置
數組length大於10以二分排序
複製代碼
複製代碼
以上方法不建立新的數組,而是直接修改原有的數組,同時索引會變化
如下方法會建立出一個新的數組, 而不是直接修改原數組
該數組是經過把全部 arrX 參數添加到 arr 中生成的。
若是要進行 concat() 操做的參數是數組,那麼添加的是數組中的元素,而不是數組 ——不修改原數組
複製代碼
複製代碼
arr.slice(start,end)方法從已有的數組中返回選定的元素
複製代碼
複製代碼
如下下方法都能實現遍歷,語法也都同樣,只是返回值不同—————————————不修改原數組
array.xxxx( function(currentValue,index,arr ), thisValue )
參數 描述
currentValue ———————必須。當前元素的值
index ——————————–可選。當期元素的索引值
arr————————————可選。當期元素屬於的數組對象
thisValue ————————–可選。對象做爲該執行回調時使用,傳遞給函數,用做 "this" 的值。
若是省略了 thisValue ,」this」 的值爲 「undefined」
function(currentValue, index,arr) 必須。函數,數組中的每一個元素都會執行這個函數
複製代碼
複製代碼
arr.forEach() 從頭到尾遍歷數組 ——————————————————————————–無返回值
複製代碼
複製代碼
arr.map() 返回一個數組,包含函數全部返回值—————————————————————-返回數組
var arr = [1, 2, 3, 4]
var newArr = arr.map(function(x){
return x * x
})
console.log(newArr) // [1, 4, 9, 16]
複製代碼
複製代碼
arr.filter() 返回值是一個 return 值爲true或能轉化爲true的值——————————————–返回數組
var arr = [1, 2, 3, 4]
var newArr = arr.filter(item => {
return item > 3
})
console.log(newArr) // [4]
複製代碼
複製代碼
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
複製代碼
複製代碼
arr.some() 是否存在 即有一個是true則爲true———————————————————————————–返回值
var arr = [1,2,3,4];
var newArr = arr.some(item => {return item % 2 === 0});
console.log(newArr) // true, 由於有偶數存在
複製代碼
複製代碼
// 對象都是一個key(鍵):value( 值 )一一對應
var obj = {} // 直接量
var obj = new Object()
var obj = Object.create()
複製代碼
複製代碼
obj.attribute 和 obj[attribute]
var obj = {
age: 20,
name: '番茄炒蛋',
sex: '男'
}
console.log(obj.age) // 20
console.log(obj[age]) // 20
複製代碼
複製代碼
var obj = {
name: '番茄炒蛋'
}
obj.name = '只會番茄炒蛋'
複製代碼
複製代碼
var obj = {
name: '番茄炒蛋'
}
obj.age = 20
複製代碼
複製代碼
var obj = {
name: '番茄炒蛋',
age: 20
}
delete obj.name 或者 delete obj[name]
複製代碼
複製代碼
var obj = {
name: '番茄炒蛋',
age: 20
}
obj[1] = 'hello'
obj[2] = 'word'
複製代碼
複製代碼
var obj = {
name: '番茄炒蛋',
age: 20
}
console.log('age' in obj) // true
複製代碼
複製代碼
var obj = {
name: '番茄炒蛋',
age: 20
}
for (let attr in obj) { //attr 爲屬性,attr不是必須的,能夠爲任意變量名
console.log(attr) // 屬性名 name age
console.log(obj[attr]) // 對應的屬性值 '番茄炒蛋' 20
}
複製代碼
複製代碼
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
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');
複製代碼
複製代碼
var obj = '{ "name": "只會番茄炒蛋", "age": 10, "sex": "男" }'
JSON.parse(obj)
// 解析後的值爲:
obj = {
name: "只會番茄炒蛋",
age: 10,
sex: "男"
}
複製代碼
複製代碼
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 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的值
// 後面是參數數組,全部參數放數組裏面
複製代碼
複製代碼
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"}
複製代碼
複製代碼
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(timerManger) 裏面的參數是定時管理器
var timer = setInterval(function(){}, 1000) // 設置變量timer爲定時管理器
clearInterval(timer) // 清除timer定時管理器
複製代碼
複製代碼
setTimeout( function(){},1000 )
第一個參數是一個函數
第二參數是時間,表示1秒(1000毫秒)後調用一次,而後再也不調用
var a = 0;
setTimeout(function () {
a++;
console.log(a) // 1 只有一次打印
})
複製代碼
複製代碼
clearTimeout(timerManger) 裏面的參數是定時管理器
var timer = clearTimeout(function(){}, 1000) // 設置變量timer爲定時管理器
clearTimeout(timer) // 清除timer定時管理器
複製代碼
複製代碼
Math對象用於執行數學任務 Math對象 無需new,直接調用Math方法就行
// 隨機 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
}
複製代碼
複製代碼
var num = 12.6
Math.round(num) // 13
var num = 12.3
Math.round(num) // 12
複製代碼
複製代碼
「度」的定義是,「兩條射線從圓心向圓周射出,造成一個夾角和夾角正對的一段弧。當這段弧長正好等於圓周長的360分之一時,兩條射線的夾角的大小爲1度。(如圖1) 弧度的定義是:兩條射線從圓心向圓周射出,造成一個夾角和夾角正對的一段弧。當這段弧長正好等於圓的半徑時,兩條射線的夾角大小爲1弧度。
角所對的弧長是半徑的幾倍,那麼角的大小就是幾弧度。
它們的關係可用下式表示和計算:
( 弧度 )= 弧長 / 半徑
圓的周長是半徑的 2π倍,因此一個周角(360度)是 2π弧度。
據上所述,一個平角是 π 弧度。
即 180度=π弧度
由此可知:
弧度=π/180度 ( ≈0.017453弧度 )
複製代碼
複製代碼
Math.PI 即π 是圓的周長和它的直徑之比。這個值近似爲 3.141592653589793
一弧度 = π/180;將角度乘以(2PI/360) 0.017453293 便可轉換爲弧度
複製代碼
複製代碼
var d = new Date()
console.log(d) // Mon Sep 16 2019 15:48:31 GMT+0800 (中國標準時間)
複製代碼
複製代碼
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()
更多方法參考www.w3school.com.cn/tags/html_r…
一、cookie,sessionStorage,localStorage是存放在客戶端,session對象數據是存放在服務器上 實際上瀏覽器和服務器之間僅需傳遞session id便可,服務器根據session-id找到對應的用戶session對象 session存儲數據更安全一些,通常存放用戶信息,瀏覽器只適合存儲通常的數據 二、cookie數據始終在同源的http請求中攜帶,在瀏覽器和服務器來回傳遞,裏面存放着session-id sessionStorage,localStorage僅在本地保存 三、大小限制區別,cookie數據不超過4kb,localStorage在谷歌瀏覽中2.6MB 四、數據有效期不一樣,cookie在設置的(服務器設置)有效期內有效,無論窗口和瀏覽器關閉 sessionStorage僅在當前瀏覽器窗口關閉前有效,關閉即銷燬(臨時存儲) localStorage始終有效
SessionStorage和localStorage區別: 1.sessionStorage用於本地存儲一個會話(session)中的數據,這些數據只有在用一個會話的頁面中才能被訪問(也就是說在第一次通訊過程當中) 而且在會話結束後數據也隨之銷燬,不是一個持久的本地存儲,會話級別的儲存 2.localStorage用於持久化的本地存儲,除非主動刪除數據,不然不會過時
一、token就是令牌,好比你受權(登陸)一個程序時,他就是個依據,判斷你是否已經受權該軟件(最好的身份認證,安全性好,且是惟一的)
用戶身份的驗證方式
二、cookie是寫在客戶端一個txt文件,裏面包括登陸信息之類的,這樣你下次在登陸某個網站,就會自動調用cookie自動登陸用戶名
服務器生成,發送到瀏覽器、瀏覽器保存,下次請求再次發送給服務器(存放着登陸信息)
三、session是一類用來客戶端和服務器之間保存狀態的解決方案,會話完成被銷燬(表明的就是服務器和客戶端的一次會話過程)
cookie中存放着sessionID,請求會發送這個id。sesion由於request對象而產生。
複製代碼
複製代碼
一、用戶經過用戶名和密碼發送請求
二、服務器端驗證
三、服務器端返回一個帶簽名的token,給客戶端
四、客戶端儲存token,而且每次用於發送請求
五、服務器驗證token而且返回數據
每一次請求都須要token
複製代碼
複製代碼
一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。
二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。
三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用你服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。
四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。
複製代碼
複製代碼
一、session認證只是把簡單的User的信息存儲Session裏面,sessionID不可預測,一種認證手段。只存在服務端,不能共享到其餘的網站和第三方App
二、token是oAuth Token,提供的是認證和受權,認證針對用戶,受權是針對App,目的就是讓某APP有權訪問某用戶的的信息。Token是惟一的,
token不能轉移到其餘的App,也不能轉到其餘用戶上。(適用於App)
三、session的狀態是存在服務器端的,客戶端只存在session id, Token狀態是存儲在客戶端的
複製代碼
複製代碼
一、數量和長度的限制。每一個特定的域名下最多生成20個cookie(chorme和safari沒有限制)
二、安全性問題。
複製代碼
1、觀察者模式:juejin.im/post/5a14e9… juejin.im/post/5af05d… 在軟件開發設計中是一個對象(subject),維護一系列依賴他的對象(observer),當任何狀態發生改變自動通知他們。強依賴關係 簡單理解:數據發生改變時,對應的處理函數就會自動執行。一個Subjet,用來維護Observers,爲某些event來通知(notify)觀察者
2、發佈-訂閱者 有一個信息中介,過濾 耦合性低 它定義了一種一對多的關係,可使多個觀察者對象對一個主題對象進行監聽,當這個主題對象發生改變時,依賴的全部對象都會被通知到。
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.
複製代碼
複製代碼
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… 看下這篇就夠了
感謝您的觀看,若有不足之處,歡迎批評指正。