一些JS基礎

在函數(shù)中不定義return就會調(diào)用默認的隱形return优训,就是return undifind!!!

字符串部分:

es6用反引號表示多行字符串,就是1左邊那個案件。

用?`你好, ${name}, 你今年${age}歲了!`代替+號拼接的字符串?'你好, '?+ name +?', 你今年'?+ age +?'歲了!'


打點調(diào)用:

toUpperCase()把一個字符串全部變?yōu)榇髮?/p>

toLowerCase()把一個字符串全部變?yōu)樾?/p>

indexOf()會搜索指定字符串出現(xiàn)的位置

substring()返回指定索引區(qū)間的子串

數(shù)組部分:

slice()就是對應String的substring()版本,它截取Array的部分元素,然后返回一個新的Array

push()向Array的末尾添加若干元素搞旭,pop()則把Array的最后一個元素刪除掉

如果要往Array的頭部添加若干元素,使用unshift()方法菇绵,shift()方法則把Array的第一個元素刪掉

sort()可以對當前Array進行排序肄渗,它會直接修改當前Array的元素位置,直接調(diào)用時咬最,按照默認順序排序

reverse()把整個Array的元素給掉個個翎嫡,也就是反轉(zhuǎn)

splice()方法是修改Array的“萬能方法”,splice(a,b,c,d)從索引a開始刪除b個元素然后添加c,d元素

concat()方法把當前的Array和另一個Array連接起來永乌,并返回一個新的Array

join()方法是一個非常實用的方法惑申,它把當前Array的每個元素都用指定的字符串連接起來,然后返回連接后的字符串

對象部分:

正則:

^?? ?以翅雏。圈驼。。開頭

$?? ?以望几。绩脆。。結(jié)尾

\w?? ?匹配字母或數(shù)字

\d? ? 匹配數(shù)字

.? ? 可以匹配任意字符

\s? ? 匹配一個空格

*匹配任意個字符(包括0個)

+? ? 表示至少一個字符

橄抹?? ? 表示0或1個字符

{n,m}? ? 表示n到m個字符 ? ? ?

[0-9a-zA-Z\_]可以匹配一個數(shù)字靴迫、字母或者下劃線

^(\d{3})-(\d{3,8})$分別定義了兩個組在RegExp對象上用exec()方法提取出子串

加個?就可以讓\d+采用非貪婪匹配

當我們指定g標志后,每次運行exec()楼誓,正則表達式本身會更新lastIndex屬性矢劲,表示上次匹配到的最后索引

指定i標志,表示忽略大小寫慌随,m標志,表示執(zhí)行多行匹配。

JSON:

如果只想輸出指定屬性阁猜,就用數(shù)組:JSON.stringify(xiaoming, ['name', 'skills'], ' ');

解析json就JSON.parse()

面向?qū)ο螅?/p>

把要給a對象的原型指向B丸逸,看上去a就像從b繼承的,a就擁有自己的屬性和B的方法剃袍。

關于原型:

arr ---->?Array.prototype ----> Object.prototype ---->?null

對于一個數(shù)組的原型鏈來說黄刚,數(shù)組的方法都定義在了array.prototype上,所以arr可以直接調(diào)用這些方法而不用聲明

使用構造函數(shù)去新建對象:

function?Student(name) {

this.name = name;

this.hello =?function?() {

alert('Hello, '?+?this.name +?'!');

}

}

然后直接var obj = new Student("..."),這樣的話民效,每一個用此構造函數(shù)聲明的對象都會具有hello這個函數(shù)憔维。

function(){}():函數(shù)定義+()會自動執(zhí)行一次;

關于遍歷:

遍歷中最常用的就是for循環(huán)畏邢;for(定義;判斷;判斷變量改變){執(zhí)行條件}业扒;但是這個也是最不好用的遍歷方法,應為這個方法效率較低舒萎,會占用大量運存程储;

一般來說對于對象,最好時用for臂寝。章鲤。。in來遍歷咆贬,便利完了之后輸出的是某鍵值對的值败徊,格式是字符串。

for(var a in obj){alert (a)};這里的a是臨時的一個變量掏缎,每次循環(huán)都會把對應的鍵值以string的格式保存在a中皱蹦,a每次只保存一個string,循環(huán)結(jié)束后保留最后一個鍵值御毅;如果只想找到對象自身的屬性根欧,而不是通過原型繼承過來的就obj.hasOwnProperty(a);這個為true就是自己有的;如果用這個來遍歷數(shù)組那得到的是a就是數(shù)組的每個索引值端蛆;

while和do ? while就是滿足條件運行凤粗,不然就結(jié)束,不過dowhile是先執(zhí)行一次在判斷今豆;

關于map和set結(jié)構(類型)

map是es6里新定義的一組鍵值對的結(jié)構:var m=new Map()/new Map([['6666',1],['jame',2]);如此從map中取鍵值對就很塊:m.get('jame')得到的就是2嫌拣;初始化一個map需要一個空或者一個二維數(shù)組;有以下方法:

var?m =?new?Map();?// 空Map

m.set('Adam',?67);?// 添加新的key-value

m.has('Adam');?// 是否存在key 'Adam': true

m.get('Adam');?// 67

m.delete('Adam');?// 刪除key 'Adam'

m.get('Adam');?// undefined

因為一個鍵名只能對應一個鍵值呆躲,所以多次存儲鍵值會覆蓋异逐;

對于set而言其實是跟map一樣的,不過map不存儲value插掂,只是一組key的集合灰瞻,由于key是不可重復的腥例,所以set中沒有重復的元素,初始化一個set需要空或者一個數(shù)組酝润,重復元素會被自動剔除燎竖;?s.add(4)通過add可以添加元素

對于map和set而言都不具備下標,即索引要销,所以是不能用for進行循環(huán)遍歷的构回,為此es6引入了新的iterable類型,數(shù)組疏咐,mapset都是這個類型纤掸,是可以通過for ? of遍歷?

而for ? of的用法和for in是一樣的,區(qū)別在于for in會遍歷額外添加的屬性浑塞,而for of只會遍歷集合本身的屬性

或者直接使用forEach()是es5引入的借跪;用foreach接收一個函數(shù),每一次遍歷就會回掉該函數(shù)

例如

var?a = ['A',?'B',?'C'];

var?s =?new?Set(['A',?'B',?'C']);

var?m =?new?Map([[1,?'x'], [2,?'y'], [3,?'z']]);

a.forEach(function?(element, index, array) {

// element: 指向當前元素的值

// index: 指向當前索引

// array: 指向Array對象本身

alert(element);

});

s.forEach(function?(element, sameElement, set) {

alert(element);

});

m.forEach(function?(value, key, map) {

alert(value);

});

對于函數(shù):對于函數(shù)而言有一個只在函數(shù)內(nèi)部有用的關鍵字:arguments缩举,永遠指向當前函數(shù)的傳入所有參數(shù)垦梆;rest參數(shù)是只能夠?qū)懺谧詈蟮男螀ⅲ瑢懽?..rest,實際的傳參多于形參的部分會被填充成數(shù)組存在rest下仅孩。

變量作用域:

在函數(shù)內(nèi)部定義托猩,就只作用于內(nèi)部,外部無法調(diào)用辽慕,如果定義在使用之后京腥,會自動提升變量的聲明,但是不會提升變量的賦值溅蛉,全局定義的變量會綁定到window上公浪,最好是定義一個全局變量,然后把所有的變量和函數(shù)定義到這個全局變量之中船侧,就不會出現(xiàn)文件的沖突了欠气。使用let在局部作用域中聲明變量;用const來聲明一個常量镜撩。

方法:

方法就是綁定到對象上的函數(shù):

var?xiaoming = {

name:?'小明',

birth:?1990,

age:?function?() {

var?y =?new?Date().getFullYear();

return?y -?this.birth;

}

};

xiaoming.age;?// function xiaoming.age()

xiaoming.age();?// 今年調(diào)用是25,明年調(diào)用就變成26了

this是指向調(diào)用時的對象预柒;最好在使用的時候現(xiàn)在函數(shù)內(nèi)部定義var that = this;先用that捕獲到this指向的函數(shù),然后用that袁梗。調(diào)用宜鸯,定義其他函數(shù);

或者是使用apply()這是函數(shù)本身的方法:age.apply(a,b)意思是this指向A遮怜,傳入?yún)?shù)為B淋袖。

可以用作計數(shù):

var?count =?0;

var?oldParseInt = parseInt;?// 保存原函數(shù)

window.parseInt =?function?() {

count +=?1;

return?oldParseInt.apply(null, arguments);?// 調(diào)用原函數(shù)

};

// 測試:

parseInt('10');

parseInt('20');

parseInt('30');

count;?// 3

關于一些方法:

map():

遍歷數(shù)組;就是把一個函數(shù)作用在每一個元素上并生成一個新的數(shù)組

function?pow(x) {

return?x * x;

}

var?arr = [1,2,3,4,5,6,7,8,9];

arr.map(pow);?// [1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce():

把一個函數(shù)輪流作用在每個元素上并返回一個值:

[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)

filter():

和map()差不多锯梁,但是是依次作用于數(shù)組之后返回一個布爾值即碗,根據(jù)布爾值決定是否保留該元素焰情;true就保留,false就不保留剥懒;

var?arr = [1,?2,?4,?5,?6,?9,?10,?15];

var?r = arr.filter(function?(x) {

return?x %?2?!==?0;

});

r;?// [1, 5, 9, 15]

在filter里接受的回掉函數(shù)可以有多個參數(shù)額烙样,通常是某個元素,位置蕊肥,數(shù)字本身,也就是(element,index,self)

所以去重的話;r = arr.filter(function (element, index, self) {

????return self.indexOf(element) === index;

});

就可以了

sort();

對于sort蛤肌,是一種快速地數(shù)組排序方法壁却,arr.sort()但是排序的默認依據(jù)是ASCII碼,如果需要使用自定的規(guī)則:

var?arr = [10,?20,?1,?2];

arr.sort(function?(x, y) {

if?(x < y) {

return?-1;

}

if?(x > y) {

return?1;

}

return?0;

});?// [1, 2, 10, 20]

而且sort方法是直接對數(shù)組的修改裸准,他返回的結(jié)果是當前的數(shù)組展东。

閉包:

不立即調(diào)用該函數(shù),在后面按需調(diào)用:

function?lazy_sum(arr) {

var?sum =?function?() {

return?arr.reduce(function?(x, y) {

return?x + y;

});

}

return?sum;

}

在調(diào)用的時候返回的是求和函數(shù)

箭頭函數(shù)

x=>x*x ? ? ? ? ? ?相當于 function(x){return x*x}

如果有多個參數(shù)需要定義的時候就為

(x, y) => x * x + y * y

如果有多條執(zhí)行語句的時候就?

x => {

if?(x >?0) {

return?x * x;

}

else?{

return?- x * x;

}

}

如果需要返回一個對象的時候就外加()

x => ({ foo: x })

重點在于炒俱,箭頭函數(shù)內(nèi)部的this指向是詞法作用域盐肃,即誰調(diào)用,就指向誰权悟,所以使用箭頭函數(shù)的時候就不用var _this=this;這種提前鎖定this指向的寫法

ES6

es6新引進了一種數(shù)據(jù)類型砸王,就是generator;

定義如下:

function* foo(x) {

yield?x +?1;

yield?x +?2;

return?x +?3;

}

在執(zhí)行的時候峦阁,可以返回多個值谦铃,但是如果直接調(diào)用的話是不會返回所需要的值的,他只是創(chuàng)建了一個generator對象榔昔,并沒有去執(zhí)行驹闰,調(diào)用而言一種是不斷的調(diào)用該對象的next()方法:next()方法可以帶一個參數(shù),該參數(shù)就會被當作上一個yield表達式的返回值

var a = foo(5)

a.next();? ? 返回的是{value:6,done:false;}

a.next();? ? 返回的是{value:7,done:false;}

a.next();? ? 返回的是{value:8,done:true;}

在返回的對象中撒会,value代表的是運行一次之后的值嘹朗,done代表的是這個generator是否完全執(zhí)行完。

第二種調(diào)用方式就是:直接用for...of 調(diào)用诵肛,這樣不用我們自己判斷done的值屹培;這種用法不會返回最后自己定義的return的返回值,只會執(zhí)行yield的操作并返回值曾掂。

for?(var?x of foo(5)) {

console.log(x);?// 依次輸出6惫谤,7

}

瀏覽器對象

window?表示當前瀏覽器的窗口,這個對象有innerWidth和innerHeight屬性珠洗,可以獲取瀏覽器的可視區(qū)域的寬高溜歪,兼容至ie8。

還有outerWidth和outerHeight獲取整個瀏覽器的窗口寬高许蓖。

navigator表示瀏覽器的信息蝴猪,最常用的屬性:appName瀏覽器名稱调衰,appVersion瀏覽器版本,language瀏覽器設置的語言自阱,platform操作系統(tǒng)類型嚎莉,userAgent瀏覽器設定的User-Agent字符串。

/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent) ??true?:?false;判斷是否是移動端

screen表示屏幕的信息沛豌,常用的屬性:width屏幕寬度,height屏幕高度,colorDepth顏色位數(shù)

location表示當前頁面的url信息趋箩。location.href可以獲取到完整的url。

加載一個新頁面就location.assign()加派,重新加載調(diào)用location.reload()

document表示當前頁面叫确,是整個dom樹的根節(jié)點。document對象有個cookie屬性芍锦,可以獲取到到當前頁面的cookie竹勉,因此服務器再設置cookie的時候必須使用httpOnly這個選項設定cookie不能被js所讀取

history表存了瀏覽器的歷史紀錄,js可以調(diào)用history的back()和forward()功能就相當于是用戶點擊了瀏覽器的后退/前進按鈕娄琉。由于ajax調(diào)用的話次乓,最好是不要使用到history這個東西。

可以使用parentElement.insertBefore(newElement, referenceElement);孽水,子節(jié)點會插入到referenceElement之前票腰。

表單

md5 提交的時候:

要想不改變用戶的輸入,可以利用<input type="hidden">實現(xiàn):

<!-- HTML --><form?id="login-form"?method="post"?onsubmit="return checkForm()">

<input?type="text"?id="username"?name="username">

<input?type="password"?id="input-password">

<input?type="hidden"?id="md5-password"?name="password">

<button?type="submit">Submit</button></form>

<script>function?checkForm() {

var?input_pwd = document.getElementById('input-password');

var?md5_pwd = document.getElementById('md5-password');

// 把用戶輸入的明文變?yōu)镸D5:

md5_pwd.value = toMD5(input_pwd.value);

// 繼續(xù)下一步:

return?true;

}

</script>

用return:true來確定繼續(xù)提交匈棘,如果不符合規(guī)定就return false丧慈。

操作文件:

當一個表單包含<input type="file">時,表單的enctype必須指定為multipart/form-data主卫,method必須指定為post逃默,瀏覽器才能正確編碼并以multipart/form-data格式發(fā)送表單的數(shù)據(jù)。

對于文件格式的處理簇搅,只能靠判斷后綴名來處理:

varf = document.getElementById('test-file-upload');

var?filename = f.value;?// 'C:\fakepath\test.png'if?(!filename || !(filename.endsWith('.jpg') || filename.endsWith('.png') || filename.endsWith('.gif'))) {

alert('Can only upload image file.');

return?false;

}

h5的file api提供了file 和file reader完域,下面的代碼演示讀取用戶選取圖片并預覽。

var

fileInput = document.getElementById('test-image-file'),

info = document.getElementById('test-file-info'),

preview = document.getElementById('test-image-preview');

// 監(jiān)聽change事件:

fileInput.addEventListener('change',?function?() {

// 清除背景圖片:

preview.style.backgroundImage =?'';

// 檢查文件是否選擇:

if?(!fileInput.value) {

info.innerHTML =?'沒有選擇文件';

return;

}

// 獲取File引用:

var?file = fileInput.files[0];

// 獲取File信息:

info.innerHTML =?'文件: '?+ file.name +?'<br>'?+

'大小: '?+ file.size +?'<br>'?+

'修改: '?+ file.lastModifiedDate;

if?(file.type !==?'image/jpeg'?&& file.type !==?'image/png'?&& file.type !==?'image/gif') {

alert('不是有效的圖片文件!');

return;

}

// 讀取文件:

var?reader =?new?FileReader();

reader.onload =?function(e) {

var

data = e.target.result;?// 'data:image/jpeg;base64,/9j/4AAQSk...(base64編碼)...'

preview.style.backgroundImage =?'url('?+ data +?')';

};

// 以DataURL的形式讀取文件:

reader.readAsDataURL(file);

});

ajax:

異步請求

function Ajax(type, url, data, success, failed){

// 創(chuàng)建ajax對象

var request = new XMLHttpRequest(); // 新建XMLHttpRequest對象

// 連接服務器open

if(type == 'GET'){

if(data){

xhr.open('GET', url + '?' + data, true);

} else {

xhr.open('GET', url + '?t=' + random, true);

}

// 發(fā)送請求

xhr.send();

} else if(type == 'POST'){

xhr.open('POST', url, true);

// 如果需要像 html 表單那樣 POST 數(shù)據(jù)瘩将,請使用 setRequestHeader() 來添加 http 頭吟税。

xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

xhr.send(data);

}

// 處理返回數(shù)據(jù)

request.onreadystatechange = function () { // 狀態(tài)發(fā)生變化時,函數(shù)被回調(diào)

????if (request.readyState === 4) { // 成功完成

????????// 判斷響應結(jié)果:

????????if (request.status === 200) {

????????????// 成功姿现,通過responseText拿到響應的文本:

????????????return success(request.responseText);

????????} else {

????????????// 失敗肠仪,根據(jù)響應碼判斷失敗原因:

????????????return fail(request.status);

????????}

????} else {

????????// HTTP請求還在繼續(xù)...

????}

}

原生的看看就行了,用的不多备典;

判斷數(shù)據(jù)類型:

console.log([].constructor == Array);

console.log({}.constructor == Object);

console.log("string".constructor == String);

console.log((123).constructor == Number);

console.log(true.constructor == Boolean);

或者使用instanceof

(a instanceof Array) ? //a是否Array的實例异旧?true or false

(a.constructor == Array) ?// a實例所對應的構造函數(shù)是否為Array? true or false

以上只能判斷當前頁面內(nèi)部定義的東西,如果跨頁面調(diào)用怎會出錯

function isArray(o) {

? ? returnObject.prototype.toString.call(o) === ‘[object Array]‘;

}

所以判斷數(shù)組最好是用這個Array.isArray(“提佣。吮蛹。荤崇。”)

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潮针,一起剝皮案震驚了整個濱河市术荤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌每篷,老刑警劉巖瓣戚,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異焦读,居然都是意外死亡带兜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門吨灭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刑巧,你說我怎么就攤上這事喧兄。” “怎么了啊楚?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵吠冤,是天一觀的道長。 經(jīng)常有香客問我恭理,道長拯辙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任颜价,我火速辦了婚禮涯保,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘周伦。我一直安慰自己夕春,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布专挪。 她就那樣靜靜地躺著及志,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寨腔。 梳的紋絲不亂的頭發(fā)上速侈,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音迫卢,去河邊找鬼倚搬。 笑死,一個胖子當著我的面吹牛靖避,可吹牛的內(nèi)容都是我干的潭枣。 我是一名探鬼主播比默,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盆犁!你這毒婦竟也來了命咐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤谐岁,失蹤者是張志新(化名)和其女友劉穎醋奠,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伊佃,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡窜司,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了航揉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片塞祈。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖帅涂,靈堂內(nèi)的尸體忽然破棺而出议薪,到底是詐尸還是另有隱情,我是刑警寧澤媳友,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布斯议,位于F島的核電站,受9級特大地震影響醇锚,放射性物質(zhì)發(fā)生泄漏哼御。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一焊唬、第九天 我趴在偏房一處隱蔽的房頂上張望恋昼。 院中可真熱鬧,春花似錦赶促、人聲如沸焰雕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矩屁。三九已至,卻和暖如春爵赵,著一層夾襖步出監(jiān)牢的瞬間吝秕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工空幻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烁峭,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像约郁,于是被迫代替她去往敵國和親缩挑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容