本片文章記錄一下當時本身學習JavaScript的過程以及一些知識點和注意事項,從基礎到中高級的內容都有,會以章節的形式慢慢展現出來javascript
不少時候,當咱們重複使用某個元素或者某個數據時,內容可能太長或者數據要進行改變,這時就須要定義變量來代替他們。php
語法:var
+ 變量名
或者 let
+ 變量名
(var 和 let 聲明的區別見後續章節)css
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屬性爲合法節點屬性的時候,能夠修改節點屬性的值html
//此時object 爲節點對象(node)
var object = document.getElementById('box')
// 修改節點對象object的id屬性, id屬性爲節點對象的合法屬性
var object.id = 'box';
複製代碼
// 此時abc就表明此函數,函數不會自動運行,須要調用運行。
function abc(){
console.log(我是有名字的函數)
}
複製代碼
帶名字的函數,需函數名加小括號運行,如abc();前端
function (){}
複製代碼
匿名函數,不進行賦值會報錯java
// 匿名函數
var a = function(){}
a() //此時用變量名加()來調用
//匿名函數
var b = function abc(){}
b() //此時用變量名加()來調用; 若是abc()調用會報錯
複製代碼
// 此時object 爲節點對象(nodelist)
var object = document.getElementById('box');
// 爲object自定義了方法
object.abc = function(){};
複製代碼
事件 : 是當事人,在特定的時間在特定的地點發生了某事node
// 獲取當前符合條件的節點
var object = document.getElementById('box');
// 給當前節點添加一個點擊事件, 配合這對應的處理函數
object.onclick = function(){}
複製代碼
function () {}是一個固定的寫法,在這個例子中,它被稱之爲事件函數。git
事件函數也可使用有名函數es6
var object = document.getElementById('box');
object.onclick = fn;
function fn(){}
複製代碼
onclick —————— 點擊(單擊)事件
onmouseover ———– 鼠標滑入事件(會冒泡)
onmouseout—————鼠標離開事件(會冒泡)
onmouseenter————鼠標滑入事件(不會冒泡)
onmouseleave————鼠標離開事件(不會冒泡)
ondblclick ——————- 雙擊(單擊)事件
複製代碼
更多方法參考www.w3school.com.cn/tags/html_r…github
事件函數裏面的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 = 20;
let b = a++ // 先把a的值賦值給b, 而後在自增1
console.log(b) // 20
console.log(a) // 21
複製代碼
let a = 20;
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運算符。具備相同優先級的運算符按從左至右的順序求值
函數自執行方式,即建立當即調用一次
(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…
requestAnimationFrame()
固然最原始的你還可使用window.setTimout()或者window.setInterval()經過不斷更新元素的狀態位置等來實現動畫,前提是畫面的更新頻率要達到每秒60次才能讓肉眼看到流暢的動畫效果。 如今又多了一種實現動畫的方案,那就是window.requestAnimationFrame()方法。
var num = 0;
function fn() {
num++;
document.title = num;
requestAnimationFrame(fn) //在內部根據用戶瀏覽器(電腦性能)狀況,重複調用 fn
}
fn() // 頁面不斷變化,數字自增
複製代碼
var num = 0;
var timer;
function fn() {
num++;
document.title = num;
timer = requestAnimationFrame(fn) //在內部根據用戶瀏覽器(電腦性能)狀況,重複調用 fn
if (num == 250) {
cancelAnimationFrame( timer ); // 清除中止運動
}
}
fn() // 頁面不斷變化,數字自增
複製代碼
把 requestAnimationFrame(fn) 賦值給 timer,timer 就是定時管理器
// RequestAnimationFrame的兼容
window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || function (fn){
setTimeout(fn,1000/60)
}
// cancelAnimationFrame 兼容
window.cancelAnimationFrame = window.cancelAnimationFrame || window.mozCanceltAnimationFrame ||
window.webkitCancelAnimationFrame || window.msCancelAnimationFrame || clearTimeout;
複製代碼
<style>
#elem-container{
position: absolute;
left: 100px;
top: 200px;
height: 100px;
}
</style>
<div id="elem-container">dummy</div>
<script>
let ele = document.getElementById("elem-container");
let theCSSprop = window.getComputedStyle(ele,null)['left']
console.log(theCSSprop) // 100px
move(ele, 'left', 20, -6) // 調用move函數, 指定傳遞實參 目標標籤/更改的屬性/目標值/步長
function move(ele, attr, target, speed) { // 指定接受形參 目標標籤/更改的屬性/目標值/步長
target = parseFloat(target) // 轉化爲number
var initCss = parseFloat(getStyle(ele, attr)) // 獲取初始樣式值
var timer; // 動畫管理器
(function requ() {
initCss += speed
timer = requestAnimationFrame(requ) // 調用reque函數
if (Math.abs(target-init) <= Math.abs(speed)) { // 用絕對值判斷是否到達目標值
initCss = target
cancelAnimationFrame(timer); // 刪除requestAnimationFrame動畫
}
ele.style[attr] = initCss + 'px';//設置樣式
})()
}
//定義獲取樣式函數
function getStyle(ele, attr) {
// 處理好兼容
return window.getComputedStyle ? window.getComputedStyle(obj)[attr] : obj.currentStyle[attr];
}
</script>
複製代碼
<style>
#elem-container{
position: absolute;
left: 100px;
top: 200px;
height: 100px;
}
</style>
<div id="elem-container">dummy</div>
<script>
let ele = document.getElementById("elem-container");
let theCSSprop = window.getComputedStyle(ele,null)['left']
console.log(theCSSprop) // 100px
move(ele, 'left', '800px', 1000) // 調用move函數, 指定傳遞實參 目標標籤/更改的屬性/目標值/時間
function move(ele, attr, target, target_t) { // 指定接受形參 目標標籤/更改的屬性/目標值/時間
target = parseFloat(target) // 轉化爲number
var initCss = parseFloat(getStyle(ele, attr)) // 獲取初始樣式值
var initTime = new Date() // 獲取開始時間
var styleValue;
(function requ() {
var cur_t = new Date() - initTime // 獲取動畫時長
var prop = cur_t / target_t
if (prop >= 1) { // 動畫執行時長與動畫預設總時間比值大於等於1時
prop = 1
} else {
window.requestAnimationFram(requ)
}
styleValue = (target - initCss) * prop // 根據時間比例獲取運動路程比例
ele.style[attr] = initCss + styleValue + 'px'; // 設置樣式
})()
}
//定義獲取樣式函數
function getStyle(ele, attr) {
// 處理好兼容
return window.getComputedStyle ? window.getComputedStyle(obj)[attr] : obj.currentStyle[attr];
}
</script>
複製代碼
加速度
例:假如兩輛汽車開始靜止,均勻地加速後,達到10m/s的速度,A車花了10s,而B車只用了5s。它們的速度都從0變爲10m/s,速度改變了10m/s。因此它們的速度變化量是同樣的。可是很明顯,B車變化得更快一些。咱們用加速度來描述這個現象:B車的加速度(a=Δv/Δt,其中的Δv是速度變化量)>A車的加速度。 顯然,當速度變化量同樣的時候,花時間較少的B車,加速度更大。也就是說B車的啓動性能相對A車好一些。所以,加速度是表示物體速度變化快慢的物理量。
S是距離,Vf終速度,t是加速的時間。Vf=at,a是加速度,替換可得這是勻加速運動距離的一般表達式
move(Obox, 'left', '800px', 1500); // 調用move函數,指定傳遞實參
fucntion move(obj,attr,target,tar_t) { // 指定接受形參
target = parseFloat(target); // 轉化爲number
var init = parseFloat( getStyle(obj,attr)); // 獲取初始樣式值
var init_time = new Date(); // 獲取開始時間
var sty_v;
var a = 2 * (target-init) / Math.pow(tar_t,8); // 獲取加速度
(function requ() {
var cur_t = new Date()- init_time; // 獲取動畫時長
if( cur_t >= tar_t ){//動畫執行時長與動畫預設總時間比值大於等於1時,
cur_t = tar_t;
} else {
window.requestAnimationFrame(rQAF);
}
sty_v = a * Math.pow(cur_t,8) / 2;//根據時間比例獲取運動路程比例
obj.style[attr] = init+ sty_v + 'px';//設置樣式
})()
}
//定義獲取樣式函數
function getStyle(ele, attr) {
// 處理好兼容
return window.getComputedStyle ? window.getComputedStyle(obj)[attr] : obj.currentStyle[attr];
}
複製代碼
move(obox, {
width: '200px',
height: '200px',
left: '800px',
opacity: 1
}, 2000, function(){console.log('已經達到目標值')}) // 調用move函數,指定傳遞實參
function move(obj,json,targ_t,callback){ //指定接受形參
var target = {} // 目標值
init ={}, // 初始值
styleV; // 樣式
for (var attr in json) {
target[attr] = parseFloat(json[attr]) // 將目標值轉爲number類型
init[attr] = parseFloat( getStyle(obj,attr) ) // 獲取初始樣式值並轉化爲number類型
}
var init_t = new Date(); // 獲取開始時間
(function rQAF(){
var cur_t = new Date()-init_t; // 獲取當前時間與開始時間的差值--動畫執行時長
if( cur_t>=targ_t){ // 判斷動畫執行時長是否大於預設目標
cur_t=targ_t; // 讓動畫執行時長等於預設目標
} else {
window.requestAnimationFrame(rQAF); // 調用rQAF函數一次
}
for (var attr in json) {
var a = 2 * (target[attr] - init[attr]) / Math.pow(targ_t,2); // 獲取對象屬性的加速度
styleV = a * Math.pow(cur_t,2) / 2; // 根據動畫時長設置樣式
if(attr == 'opacity'){
obj.style[attr] = init[attr] + styleV;//設置樣式
obj.style.filter = 'alpha(opacity = ' + styleV * 100 + ')'; // opacity兼容
} else {
obj.style[attr] = init[attr] + styleV + 'px';//設置樣式
}
}
// 根據動畫時長是否等於了預設目標,true執行回調函數,並綁定this
cur_t == targ_t ? callback && callback.call(obj) : '';
})()
}
//定義獲取樣式函數
function getStyle(ele, attr) {
// 處理好兼容
return window.getComputedStyle ? window.getComputedStyle(obj)[attr] : obj.currentStyle[attr];
}
複製代碼
原生的動畫運動大體就以上這幾種, 若是本身能力強的話建議本身搞一個庫出來, 沒有這個時間或者懶得弄的話, github上一堆成熟的庫供你使用。
DOM(Document Object Model) 文檔樹對象模型
Ele.childNodes ————————–子節點集合
元素.childNodes : 只讀 屬性 子節點列表集合
標準下: 包含了文本和元素類型的節點,也會包含非法嵌套的子節點
非標準下:只包含元素類型的節點,ie7如下不會包含非法嵌套子節點
childNodes 只包含一級子節點,不包含後輩孫級
ele.children————————– 獲取第一級子元素
nodeType : 只讀 屬性 當前元素的節點類型 共12種
元素節點
屬性節點: wrap.attributes[0].nodeType
文本節點
nodeName 節點名稱
元素節點屬性
ele.tagName 元素標籤名稱
有關屬性節點操做:
獲取 : obj.getAttributeNode() 方法獲取指定的屬性節點。
建立 : document.createAttribute(name) 建立擁有指定名稱的屬性節點,並返回新的 Attr 對象。
添加 : obj.setAttributeNode() 方法向元素中添加指定的屬性節點。
複製代碼
ele.firstChild : 只讀 屬性
標準下:firstChild會包含文本類型的節點
非標準下:只包含元素節點
ele.firstElementChild : 只讀 屬性 標準下獲取第一個元素類型的子節點
非標準下:無
複製代碼
兼容性同上
複製代碼
兼容性同上
複製代碼
兼容性同上
複製代碼
元素類型子節點數量,等同於 children.length
複製代碼
innerHTML += 添加元素的問題,本來子元素沒有了,不是本來的元素了
複製代碼
插入子元素 ,在指定的子元素前面插入
複製代碼
插入插入子元素,在指定的子元素前面插入
例子:留言板插入內容
複製代碼
刪除DOM元素
複製代碼
換元素
複製代碼
文檔及其內容的視覺屬性,包括佈局框定位、視區寬度和元素滾動
window.innerWidth window窗口的內部寬度,
不包括用戶界面元素,好比窗框
window.innerHeight內部高度
複製代碼
document.documentElement.clientWidth==>瀏覽器窗口可視寬度
document.documentElement.clientHeight==>瀏覽器窗口可視高度
====》 可獲取文檔沒有內容時候高度
沒有定義W3C的標準,則 IE爲:
document.documentElement.clientWidth ==> 0
document.documentElement.clientHeight ==> 0
複製代碼
clientWidth對象的——————–width + padding
clientHeight 對象的——————height + padding
==> 不包含子元素(一致)
複製代碼
offsetHeight:對象height + padding + border
offsetWidth: 對象width + padding + border
==> 不包含子元素(一致)
複製代碼
scrollWidth對象的width + padding
scrollHeight應該等用於scrollTop + clientHeight
若是元素沒有隱藏的部分,則相關的值應該等用於clientWidth和clientHeight
scrollHeight對象的height + padding
==> 包含子元素內容,子元素定位,overflow:hidden`(一致)
複製代碼
獲取元素最近的定位父級 若是沒有定位父級 則參考body( 元素必須是定位元素)
複製代碼
offsetLeft:獲取對象相對於offsetParent(left)位置
offsetTop:獲取對象相對於offsetParent(top)位置
複製代碼
可讀可寫,有內容溢出元素纔有效果
ele.scrollTop 元素Y軸滾動的距離
ele.scrollLeft 元素X軸滾動的距離
設置時不能給px 單位,不然會出錯!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
document.getElementsByTagName("body")[0].scrollTop = 100;
複製代碼
網頁被捲去的高: document.body.scrollTop
網頁被捲去的左: document.body.scrollLeft
IE, firfox:document.documentElement.scrollTop ! ! ! ! ! ! ! ! ! ! ! ! ! !
複製代碼
getBoundingClientRect():獲得矩形元素的界線,返回的是一個對象,
包含 top, left, right, bottom四個屬性值,大小都是相對於瀏覽器窗口top,left 的距離。
返回內容相似於:
{ top: 143, right: 1196, bottom: 164, left: 889}
複製代碼
ele.scrollIntoView() 讓元素滾動到可視區域(HTML5標準),參數 true 與瀏覽器對齊,false元素在窗口居中顯示
複製代碼
相對於window,爲鼠標相對於瀏覽器窗口的偏移
event.clientX 鼠標在文檔的水平座標
event.clientY 鼠標在文檔的垂直座標
複製代碼
瀏覽器對象模型 (BOM) 使 JavaScript 有能力與瀏覽器「對話」。
Window 對象 它表示瀏覽器窗口。
全部 JavaScript 全局對象、函數以及變量均自動成爲 window 對象的成員。
全局變量是 window 對象的屬性。
全局函數是 window 對象的方法。
HTML DOM 的 document 也是 window 對象的屬性之一
window.document.getElementById("header");
複製代碼
Location 對象屬性:
對象屬性 描述
window.location.href 設置或返回完整的 URL。
window.location.search 設置或返回 url?,?+後面的內容。
window.location. hash 設置或返回 url#後面的內容
window.location.port 設置或返回當前 URL 的端口號。
window.location.hostname 設置或返回當前 URL 的主機名。
window.location.host 設置或返回主機名和當前 URL 的端口號
window.location.pathname 設置或返回當前 URL 的路徑部分
window.location.protocol 設置或返回當前 URL 的協議
複製代碼
History 對象包含用戶(在瀏覽器窗口中)訪問過的 URL。
屬性
length 返回瀏覽器歷史列表中的 URL 數量。
方法
back() 加載 history 列表中的前一個 URL。
forward() 加載 history 列表中的下一個 URL。
go() 加載 history 列表中的某個具體頁面。
下面一行代碼執行的操做與單擊兩次後退按鈕執行的操做同樣:
history.go(-2)
複製代碼
window.`navigator.userAgent` 瀏覽器信息
複製代碼
window.open(url,target)
open(地址默認是空白頁面,打開方式默認新窗口) 打開一個新窗口
window.open('http://www.baidu.com', '_self');
var opener = window.open();//返回值 返回的新開頁面的window對象
opener.document.body.style.background = 'red';
window.close()
opener.close();//能夠經過關閉用window.open方法打開的窗口
複製代碼
document.onclick = function(){
window.scrollTo(0,500);
}
複製代碼
scrollBy(xnum,ynum) 指定的像素值來滾動內容。不帶px
xnum 必需。把文檔向右滾動的像素數 。
ynum 必需。把文檔向下滾動的像素數。
document.onclick = function(){
window.scrollTo(0,500);
}
複製代碼
alert( 內容 )``警告框常常用於彈出警告信息,無返回值
複製代碼
confirm(「文本」)``確認框用於使用戶能夠驗證或者接受某些信息。
若是用戶點擊確認,那麼返回值爲 true。若是用戶點擊取消,那麼返回值爲 false。
複製代碼
prompt(「提示」,」默認值」)提示框常常用於提示用戶在進入頁面前輸入某個值。
若是用戶點擊確認,那麼返回輸入的值。若是用戶點擊取消,那麼返回值爲 null。
function disp_prompt(){
var name=prompt("請輸入您的名字","Bill")
if (name!=null && name!=""){
document.write("你好!" + name + " 今天過得怎麼樣?")
}
}
複製代碼
Event對象 用來獲取事件的詳細信息:鼠標位置、鍵盤按鍵
兼容
標準下 : 事件對象是經過事件函數的第一個參數
傳入 若是一個函數是被事件調用的那麼,這個函數定義的第一個參數就是事件對象
ie: event是一個內置全局對象
var obj.onclick = function (ev) {
var ev = ev || window.event;
}
Event對象的兼容:ev = ev || window.event;
Event對象下的獲取鼠標位置:e.clientX || e.clientY
複製代碼
事件冒泡指子元素觸發事件的時候,會 冒泡(觸發)父級的相同的事件
阻止冒泡:
非標準:ev.stopPopagation();
非標準:ev.cancelBubble = true;
複製代碼
是否捕獲
false冒泡
true捕獲
先捕獲後冒泡
有捕獲
事件名稱沒有on
事件執行的順序是正序
this觸發該事件的對象
複製代碼
沒有捕獲
事件名稱有on
事件函數執行的順序:標準ie-》正序 非標準ie-》倒序
this指向window
複製代碼
右鍵菜單 : oncontextmenu
解決:文字選中再的問題
標準:解決辦法 return false (阻止默認事件)
非標準ie:全局捕獲
onselectstart = "return false"` 處理文字選中
ondragstart = "return false" 處理圖片拖動
複製代碼
標準下阻止默認事件,能夠拖拽圖片啦
Ie/chrome: onmousewheel
event.wheelDelta
上:120
下:-120
firefox : DOMMouseScroll 必須用addEventListener()添加
fire: event.detail
上:-3
下:3
滾輪屬性:event.wheelDelta \ event.detail
複製代碼
兼容
obj.onmousewheel = handle; // 兼容ie chrome
obj.addEventListener ? obj.addEventListener('DOMMouseScroll', handle,boolean) : false; // 兼容firefox
// 滾動函數event對象處理
function handle(e){
e = e || window.event;
e.wheel = e.wheelDelta ? e.wheelDelta : -e.detail * 40;
}
複製代碼
阻止默認事件:
標準:event.preventDefault()
非標準:event.returnValue = false;
return false阻止的是 obj.on事件名稱=fn 所觸發的默認行爲
addEventListener綁定的事件須要經過event下面的event.preventDefault();
detachEvent綁定的事件須要經過event下面的event.returnValue = false;
鼠標滾輪與自定義滾動條結合
複製代碼
function addEvent(obj, type, fn, boolean){
boolean = boolean || false; // 處理捕獲冒泡
obj[type + fn.name] = handle;//添加方法
obj.addEventListener ? obj.addEventListener(type, obj[type+fn.name], boolean) :
obj.attachEvent('on'+type,obj[type+fn.name]);
// 滾輪事件
if(type == 'mousewheel'){
// obj['on'+type]= handle; // chrome 及ie
//兼容火狐
obj.addEventListener ? obj.addEventListener('DOMMouseScroll', obj[type+fn.name], boolean) : '';
}
// 處理event對象
function handle(e){
e = e|| window.event;
e.wheel = e.wheelDelta?e.wheelDelta:e.detail*(-40); // 處理滾輪方向
fn.call(obj,e);
e.preventDefault ? e.preventDefault() : e.returnValue = false;
}
}
function removeEvent(obj,type,fn,boolean){
boolean = boolean || false; // 處理捕獲冒泡
obj.removeEventListener ? obj.removeEventListener(type, obj[type+fn.name], boolean) :
obj.detachEvent('on'+type,obj[type+fn.name]);
// 滾輪事件
if (type == 'mousewheel') {
//兼容火狐
obj.removeEventListener ? obj.removeEventListener('DOMMouseScroll', obj[type+fn.name], boolean) : '';
}
}
複製代碼
焦點事件
obj.focus() 給指定的元素設置焦點
複製代碼
標準:e.target 指向事件觸發對象
非標準:e.srcElement 指向事件觸發對象
文檔的onreadystatechange 事件
當文檔的readyState 屬性發生變化的時候觸發
readyState 屬性返回當前文檔的狀態(載入中……)。
該屬性返回如下值:
uninitialized - 還未開始載入
loading - 載入中
interactive - 已加載,文檔與用戶能夠開始交互
complete - 載入完成
複製代碼
不是全部元素都可以接收鍵盤事件,可以響應用戶輸入的元素,可以接收焦點的元素就可以接收鍵盤事件,document可以響應
keydown:用戶在鍵盤上按下某按鍵是發生。一直按着某按鍵則會不斷觸發(opera瀏覽器除外)。
keypress:用戶按下一個按鍵,併產生一個字符時發生(也就是無論相似shift、alt、ctrl之類的鍵,
就是說用戶按了一個能在屏幕上輸出字符的按鍵keypress事件纔會觸發)。一直按着某按鍵則會不斷觸發。
keyup:用戶釋放某一個按鍵是觸發。
event.keyCode : 數字類型 鍵盤按鍵的值 鍵值
ctrlKey,shiftKey,altKey 布爾值
當一個事件發生的時候,若是ctrl || shift || alt 是按下的狀態,返回true,不然返回false
複製代碼
第十八章 RegExp
正則表達式是描述字符模式的對象。
正則表達式用於對字符串模式匹配及檢索替換,是對字符串執行模式匹配的強大工具。
而String和RegExp都定義了使用正則表達式進行強大的模式匹配和文本檢索與替換的函數。
正則表達式主要用來驗證客戶端的輸入數據。能夠節約大量的服務器端的系統資源,而且提供更好的用戶體驗。
複製代碼
語法:Reg = /pattern/modifiers;
var Reg = /box/gi;
複製代碼
語法 Reg = new RegExp( pattern , modifiers ); // pattern, modifiers此時是字符串
var Reg = new RegExp(「box」, 」gi」);
何種方法建立都是同樣的
pattern 模式 模板,要匹配的內容
modifiers 修飾符
複製代碼
方法 描述
match(Reg) 返回RegExp匹配的包含所有字符串的數組或null
search(Reg) 返回RegExp匹配字符串首次出現的位置
replace(Reg,newStr) 用newStr替換RegExp匹配結果,並返回新字符串
split(Reg) 返回字符串按指定RegExp拆分的數組
例子:
var str = 'hello';
var Reg = /e/i;
str.match(Reg);
複製代碼
方法 描述
exec() 在字符串中執行匹配搜索,返回首次匹配結果數組,
test() 在字符串中測試模式匹配,返回true或false
例子:
var pattern = new RegExp(「box」,」gi」);
pattern.test(str);
pattern.exec(str);
複製代碼
注意區別正則方法和字符串方法使用避免混淆
正則方法:pattern.test(str); 方法的主體是正則表達式
字符串方法:str.match(pattern);方法的主體是字符串
複製代碼
修飾符用於執行區分大小寫和全局匹配:
例子:
var patt = /pattern/i; //忽略大小寫匹配
var patt = /pattern/g; //全局匹配
var patt = /pattern/m; //執行多行匹配
複製代碼
xxx ———————————匹配xxx字符
var Reg = /abc/;
x|y|z —————————-匹配x或y或z字符
var Reg = /abc|bac|cba/;
複製代碼
[abc]———————————–匹配abc之中的任何一個字符
非
[^abc]———————————匹配非a非b非c字符的
到
[0-9] ———————————匹配0至9之間的數字
[a-z] ———————————匹配小寫a至小寫z的字符
[A-Z] ———————————匹配大寫A至大寫Z的字符
[\u4e00-\u9fa5]———匹配中文
還能夠組合
var Reg = /hello [0-9a-zA-z]/;
複製代碼
. —————————————–匹配單個字符,除了換行和行結束符
\w—————————————匹配單詞字符,數字,_(下劃線)
\W—————————————匹配非(單詞字符和_(下劃線))
\d —————————————匹配數字
\D —————————————匹配非數字
\s —————————————匹配空白字符(空格)
\S —————————————匹配非空格字符
\b —————————————匹配單詞邊界 ( 除了 (字)字母 數字_ 都算單詞邊界)
\B —————————————匹配非單詞邊界
\n —————————————匹配換行符
特殊的轉譯字符. \ /
1.var reg = /\./;//匹配.
2.var reg = /\\/;//匹配\
3.var reg = /\//;//匹配/
複製代碼
n?———————————匹配0個或一個n的字符串
n*———————————匹配0個或多個字符串(任意個)
n+———————————匹配至少一個n字符串
n{X}——————————匹配包含X個n的序列的字符串
n{X,Y}————————–匹配包含至少X或至多Y個n的序列的字符串
n{x,}—————————-匹配至少X個n的序列字符串
^n———————————匹配以n開頭的字符串
n$———————————匹配以n結尾的字符串
複製代碼
貪婪: 儘量多的匹配
惰性: 儘量少的匹配
前提條件都是要匹配到內容
—— 貪 婪 —— —— 惰 性 ——
+ +?
? ??
* *?
{n} {n}?
{n,m} {n,m}?
{n,} {n,}?
複製代碼
子組:使用()小括號,指定一個子表達式後,稱之爲分組
捕獲型
非捕獲型
複製代碼
1.var str = 'abcdefg';
2.var reg = /(abc)d/;//匹配abcd
3.var val = reg.exec( str);
4.console.log( val ); //["abcd", "abc", index: 0, input: "abcdefg"]
索引0 爲匹配的結果
索引1 爲第一個子表達式 匹配結果
index :首次匹配成功的索引值,
input: 匹配目標
—— 字符 —— 引用
(pattern) 匹配pattern並捕獲結果,自動設置組號,是從1開始的正整數 \num
引用是值的引用,匹配結果的引用不是匹配形式引用
複製代碼
(?:pattern)
(?=pattern) 零寬度正向預言
1.Windows (?=2000) //匹配windows且後面跟2000
匹配 「Windows2000」 中的 「Windows」
不匹配 「Windows3.1」 中的 「Windows」。
(?!pattern) 零寬度負向預言
1. Windows (?!2000)//匹配windows且後面非2000
匹配 「Windows3.1」 中的 「Windows」
不匹配 「Windows2000」 中的 「Windows」。
複製代碼
說實話正則我搞的很頭大, 通常都是用到什麼網上去搜, 本身寫還要去看筆記...
cookie : 存儲數據,當用戶訪問了某個網站(網頁)的時候,咱們就能夠經過cookie來向訪問者電腦上存儲數據
1.不一樣的瀏覽器存放的cookie位置不同,也是不能通用的
2.cookie的存儲是以域名形式進行區分的
3.cookie的數據能夠設置名字的
4.一個域名下存放的cookie的個數是有限制的,不一樣的瀏覽器存放的個數不同
5.每一個cookie存放的內容大小也是有限制的,不一樣的瀏覽器存放大小不同
複製代碼
要在服務器環境下咱們經過document.cookie來獲取當前網站下的cookie的時候,
獲得的字符串形式的值,他包含了當前網站下全部的cookie。他會把全部的cookie經過一個分號+空格的形式串聯起來
console.log( document.cookie );
複製代碼
document.cookie = '數據名=值';
複製代碼
cookie默認是臨時存儲的,當瀏覽器關閉進程的時候自動銷燬,
若是咱們想長時間存放一個cookie。須要在設置這個cookie的時候同時給他設置一個過時的時間
過時時間必須是一個日期對象轉換成的字符串(時間戳.toGMTString())
document.cookie = ‘數據名=值; expires=過時時間’;
例如:
var oDate = new Date();
oDate.setDate( oDate.getDate() + 5);
oDate.toGMTString();//轉換爲日期字符串
document.cookie='age=20; expires='+oDate;
複製代碼
// 設置cookie封裝
function setCookie(obj, time) {
for (key in obj) {
var d = new Date();
d.setDate( d.getDate() + time );
document.cookie = key + '=' + obj[key] +'; expires = ' + d.toUTCString();
}
}
setCookie({
name:'hello',
sex:'man',
love:'逛街',
}, 5)
// 獲取cookie封裝
function getCookie() {
var cookie = document.cookie;
var result = {};
for(key in arguments){
var val = '\\b'+arguments[key]+'=(\\w*)+';
var reg =new RegExp(val,'i');
val = reg.exec(cookie);
result[arguments[key]] = val? decodeURI(val[1]):null;
}
return result;
}
getCookie('age', 'name')
// 移除Cookie
function removeCookie() {
for(key in arguments){
var json ={};
json[arguments[key]]=null;
setCookie(json,-1);
}
}
removeCookie('name');
複製代碼
AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。
功能:在不刷新頁面的狀況下,實現與後臺的數據交互
AJAX 不是新的編程語言,而是一種使用現有標準的新方法。
Ajax技術核心是XMLHttpRequest對象(簡稱XHR)
1 運行在服務器
2 不能跨域
複製代碼
建立 new XMLHttpRequest()
ie 6如下版本new ActiveXObject('Msxml2.XMLHttp.3.0') 或 new ActiveXObject('Msxml2.XMLHTTP.6.0')
例如:
new XMLHttpRequest() || new ActiveXObject('Msxml2.XMLHTTP.3.0')||new ActiveXObject('Msxml2.XMLHTTP.6.0');
複製代碼
指定和服務器端交互的HTTP方法,URL地址,即其餘請求信息;
Method: http請求方法,通常使用」GET「,」POST「.
url: 請求的服務器的地址;
asynch: 是否採用異步方法,true爲異步,false爲同步;
後邊兩個能夠不指定,username和password分別表示用戶名和密碼,提供http認證機制須要的用戶名和密碼。
// GET
GET請求是最多見的請求類型,最經常使用於向服務器查詢某些信息。
必要時,能夠將查詢字符串參數追加到URL的末尾,以便提交給服務器。
xhr.open('get', 'demo.php?rand=' + Math.random() + '&name=Koo', true);
注意: 特殊字符(eg:&等),傳參產生的問題可使用encodeURIComponent()進行編碼處理,中文字符的返回及傳參,
能夠將頁面保存和設置爲utf-8格式便可。或者使用提交url通用方法。
// POST
POST請求能夠包含很是多的數據,咱們在使用表單提交的時候,不少就是使用的POST傳輸方式。
xhr.open(‘post’, ‘demo.php’, true);
而發送POST請求的數據,不會跟在URL的尾巴上,而是經過send()方法向服務器提交數據。
xhr.send(‘name=Lee&age=100’);
通常來講,向服務器發送POST請求因爲解析機制的緣由,須要進行特別的處理。
由於POST請求和Web表單提交是不一樣的,須要使用XHR來模仿表單提交。
例如:
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
複製代碼
設置HTTP請求中的指定頭部header的值爲value.
此方法需在open方法之後調用,通常在post方式中使用。
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
複製代碼
向服務器發出請求,若是採用異步方式,該方法會當即返回。
content能夠指定爲null表示不發送數據,其內容能夠是DOM對象,輸入流或字符串。
複製代碼
中止當前http請求。對應的XMLHttpRequest對象會復位到未初始化的狀態。
複製代碼
請求狀態改變的事件觸發器(readyState變化時會調用這個屬性上註冊的javascript函數)。
複製代碼
表示XMLHttpRequest對象的狀態:
0:未初始化。對象已建立,未調用open;
1:open方法成功調用,但Send方法未調用;
2:send方法已經調用,還沒有開始接受數據;
3:正在接受數據。Http響應頭信息已經接受,但還沒有接收完成;
4:完成,即響應數據接受完成。
複製代碼
responseText 服務器響應的文本內容
responseXML 服務器響應的XML內容對應的DOM對象
複製代碼
服務器返回的http狀態碼。
200表示「成功」,
404表示「未找到」,
500表示「服務器內部錯誤」等。
經過xhr.getResponseHeader(「Content-Type」);能夠獲取單個響應頭信息
getAllResponseHeaders();獲取整個響應頭信息
console.log(xhr.getAllResponseHeaders())
複製代碼
function ajax(obj) {
var type = obj.type || 'GET' // 請求類型
url = obj.url // url處理
asyn = obj.asyn !== true // 異步處理
data = '' // 預設寫入數據
dataType = obj.dataType || 'json' // 數據類型
success = obj.success, // 回調函數
error = obj.error; // 錯誤處理函數
for(key in obj.data){ // 數據處理
data += key+'='+obj.data[key]+'&';
}
data = encodeURI(data);
var xhr=new XMLHttpRequest();
if(window.XMLHttpRequest){ // 處理兼容
xhr = new XMLHttpRequest();
} else {
try{
xhr = new ActiveXObject('Msxml2.XMLHTTP.6.0');
} catch(e) {
xhr = new ActiveXObject('Msxml2.XMLHTTP.3.0');
}
}
//若是是GET請求方式,設置數據
if(type.toUpperCase() == 'GET'){
var date = new Date().getTime();//添加一個時間用來處理,GET方式緩存的問題
url = url+'?'+data+date;
data = null;
} else if (dataType.toUpperCase() == 'XML') {
data =null;
}
xhr.open(type,url,asny); // 請求架設
xhr.setRequestHeader('content-Type','application/x-www-form-urlencoded'); // 設置請求頭信息
xhr.send(data); // 發送數據
xhr.onreadystatechange= function(){ // 監聽請求
// readyState 爲XMLHttpRequest對象的狀態
// status 爲服務器返回的http狀態碼
if(xhr.readyState== 4 && xhr.status==200){
var response;
if(dataType === 'json' || dataType === 'text'){
if(dataType === 'json'){
// 解析json數據
response = JSON.parse(xhr.responseText);
} else {
// 普通數據
response = xhr.responseText;
}
} else {
response = xhr.responseXML;
}
success&&success(response);
} else {
error && error(xhr.status);
}
}
}
複製代碼
iframe 跨域 // 用的超級少了
json 跨域
jsonp,你們已經知道json是什麼了,那麼p是什麼?p是填充的意思,json的填充
jsonp返回的數據形式是 callback({age:30,name:'二狗'})
而不是{age:30,name:'二狗'}是用括號包裹,前面的名稱就是‘填充’,也就是jsonp的p.
爲何前面有一段字母呢?由於script接受的數據若是是一個json沒辦法保存,
而調用一個函數,{}數據做爲實參傳遞,這樣就能夠拿到json中的數據
複製代碼
jsonp前端代碼看起來像這樣
<script>
function callback(data){ // 定義接收數據的處理函數
console.log( data);
}
</script>
//我須要後臺返回一個callback({數據})這樣的一個值,實質就是調用上面的函數
<script src='./8-1jsonp.php?jsonp=callback'></script>
複製代碼
在 ECMAScript 中,全部對象並不是同等建立的。
通常來講,能夠建立並使用的對象有三種:本地對象、內置對象和宿主對象 、自定義對象。
本地對象包括:
1.Object
2.Function
3.Array
4.String
5.Boolean
6.Number
7.Date
8.RegExp
9.Error
10.EvalError
11.RangeError
12.ReferenceError
13.SyntaxError
14.TypeError
15.URIError
內置對象:
1.ECMA-262 只定義了兩個內置對象,即 Global(window) 和 Math (它們也是本地對象,根據定義,每一個內置對象都是本地對象)。
宿主對象:
1.全部非本地對象都是宿主對象(host object),即由 ECMAScript 實現的宿主環境提供的對象。
2.全部 BOM 和 DOM 對象都是宿主對象。
複製代碼
var obj = {
show: function () {
console.log(this)
},
name: {
getName: function () {
console.log(this)
}
}
}
obj.show(); // 指向obj
obj.name.getname(); // 指向name
複製代碼
constructor
對建立對象的函數的引用(指針)。對於 Object 對象,該指針指向原始的 Object() 函數。
複製代碼
1) hasOwnProperty(property)
obj.hasOwnProperty(name)來判斷一個屬性是不是自有屬性,自身屬性仍是繼承原型屬性。必須用字符串指定該屬性。返回true 或 false
2) isPrototypeOf(object)
obj.isPrototypeOf( obj.prototype ) 判斷該對象的原型是否爲xxxxx。 返回true 或 false
3) propertyIsEnumerable()
obj.propertyIsEnumerable(‘name’) 判斷對象給定的屬性是否可枚舉,便是否可用 for...in 語句遍歷到,返回true 或 false
4)getter,setter: 返回property的值得方法,值:function(){}或 undefined 默認是undefined
5)__defineGetter__(),__defineSetter__() 定義setter getter 函數
在對象定義後給對象添加getter或setter方法要經過兩個特殊的方法__defineGetter__和__defineSetter__。
這兩個函數要求第一個是getter或setter的名稱,以string給出,第二個參數是做爲getter或setter的函數。
6)__lookupGetter__,__lookupSetter__ 返回getter setter所定義的函數
語法:obj.lookupGetter(sprop)
複製代碼
定義對象屬性
O ——————————–爲已有對象
Prop —————————爲屬性
descriptor —————–爲屬性描述符
descriptors —————-多個屬性描述符?
在以前的JavaScript中對象字段是對象屬性,是一個鍵值對,而在ECMAScript5中引入property,property有幾個特徵
Object.defineProperty 及Object.defineProperties 定義默認爲:
value:值,默認是undefined
writable:是否可寫,默認是false,
enumerable:是否能夠被枚舉(for in),默認false
configurable:是否能夠被刪除,默認false
複製代碼
獲取對象的自有的指定的屬性描述符
複製代碼
獲取全部的可枚舉的屬性名,非繼承,返回數組
複製代碼
獲取全部自有的屬性名,非繼承
複製代碼
Object.create(O,descriptors)這個方法用於建立一個對象,並把其prototype屬性賦值爲第一個參數,
同時能夠設置多個descriptors ,第二個參數爲可選,
複製代碼
Object.preventExtensions(O) 阻止對象拓展,即:不能增長新的屬性,可是屬性的值仍然能夠更改,也能夠把屬性刪除,
Object.isExtensible(O)用於判斷對象是否可拓展
複製代碼
Object.seal(O)方法用於把對象密封,也就是讓對象既不能夠拓展也不能夠刪除屬性
(把每一個屬性的configurable設爲false),單數屬性值仍然能夠修改,Object.isSealed()因爲判斷對象是否被密封
複製代碼
終極神器,徹底凍結對象,在seal的基礎上,屬性值也不能夠修改(每一個屬性的wirtable也被設爲false)
複製代碼
說實話這章節的內容不少東西我在開發中根本用不到,極少數能用一下的...除非用到了我纔會看看筆記
原始值類型(值類型): Boolean Number String
原始值.包裝 = "包裝對象"
包裝對象: 字面量定義的原始類型的對象, 臨時建立了一個對象, 這個對象就叫作包裝對象,包裝對象使用完就丟棄了
1) 字面量建立的對象, 原理是js在內部隱式調用對應的構造函數生成的對象,
若是是有js機制隱式調用了構造函數建立的原始類型對象, 那麼建立完成後,會把對象丟棄了
2) 若是認爲顯示的調用構造函數生成原始類型的對象, 那麼不會把對象丟棄了(能夠進行屬性的寫入和讀取)
var arr = '123' typeof(arr === String)
var str = new String('123') typeof(str === Object)
console.log(arr == str) 使用對象實際上使用對象的值, 因此相等
console.log(arr === str) 嚴格模式是不全等的, 不僅僅判斷值相同,還要判斷類型相同
複製代碼
繼承: 子類繼承父類
1) 子類能夠繼承父類的全部
2) 子類擴展不能影響父類
類繼承的缺點: 不能在子類實例化時傳參數
私有屬性繼承: 父類.call(this, 參數)
複製代碼