JavaScript基礎(chǔ)知識總結(jié)(一)

JavaScript

? ? ? ? ? - JavaScript兼容于ECMA標(biāo)準(zhǔn),因此也稱為ECMAScript。


調(diào)試命令

?????alert('hello world');

????console.log('文字信息');

????console.warn('警告信息');

????console.error('錯誤信息');

?????document.write('hello world');


*? js中嚴(yán)格區(qū)分大小寫?

變量的命名規(guī)則

????1.變量中可以含有a-Z 0-9 _ $ , 但是不能以數(shù)字開頭

????2.不能使用JS中的關(guān)鍵字和保留字

????3.盡量遵從駝峰命名規(guī)則


JavaScript的數(shù)據(jù)類型 (六種

????基本數(shù)據(jù)類型

????????String

????????Number

????????Boolean

????????Null

????????Undefined

????復(fù)雜數(shù)據(jù)類型

????????????????????????/? Date

????????Object? -? Array

????????????????????????\? function? ...


NaN:表示不是數(shù)字值的特殊值,可以理解為Number的一種特殊類型,只有當(dāng)在js運算中發(fā)生數(shù)據(jù)類型轉(zhuǎn)換時提示,isNaN()方法是特有的對數(shù)據(jù)進(jìn)行判斷的 ,如果是數(shù)字返回false,不是數(shù)字返回true。

null空對象類型, 表示'沒有對象',即該處不應(yīng)該有值

undefined表示缺少值,就是此處應(yīng)該有一個值,但是沒有定義,?例如 var =a;


數(shù)據(jù)類型轉(zhuǎn)換

????將其他的數(shù)據(jù)類型轉(zhuǎn)換為string

????????方法1:

????????調(diào)用被轉(zhuǎn)換數(shù)據(jù)類型的toString()方法? 也就是?.toString()

????????該方法不會影響原變量,它會將轉(zhuǎn)換的結(jié)果返回f

????????注意:null和undefined沒有toString()方法

????????方法2:

????????調(diào)用String()函數(shù),并將被轉(zhuǎn)換的數(shù)據(jù)作為參數(shù)傳遞給函數(shù)


????將其他的數(shù)據(jù)類型轉(zhuǎn)換為number

????????方法1:

????????調(diào)用Number()函數(shù)

????????被轉(zhuǎn)換的內(nèi)容可以轉(zhuǎn)換成數(shù)字,那么就直接返回這個內(nèi)容對應(yīng)的數(shù)字

????????如果被轉(zhuǎn)換內(nèi)容中有非數(shù)字, 那么返回NaN

????????如果內(nèi)容為空或者null或者false,則轉(zhuǎn)換成0

????????undefined轉(zhuǎn)換成NaN

????????方法2:

????????parseInt( )將內(nèi)容轉(zhuǎn)成Number

????????如果被轉(zhuǎn)換內(nèi)容中出現(xiàn)小數(shù),那么轉(zhuǎn)換的時候會轉(zhuǎn)換去掉小數(shù)

????????如果第一個字符是數(shù)字,則繼續(xù)解析,直至字符串解析完畢或者遇到一個非數(shù)字字符為止

????????方法3:

????????parseFloat( )將內(nèi)容轉(zhuǎn)成Number

????????與parseInt一樣,唯一的區(qū)別就是可以保留小數(shù)

????????注意:如果對非string使用parseInt( )和parseFloat( ),會先將其轉(zhuǎn)換為string再操作


????將其他的數(shù)據(jù)類型轉(zhuǎn)換為boolean

????????方法1:

????????調(diào)用Boolean()函數(shù)

????????除了0、NaN其他都是true

????????除了空串其他都是true

????????null和undefined都是false


運算符

????+(加號)

????對非Number類型的值進(jìn)行運算時,會將這些值轉(zhuǎn)換為Number然后再運算

????任何值和NaN運算都得NaN

????任何值和字符串做加法運算,都會先轉(zhuǎn)換為字符串,然后再和字符串做拼串(任何數(shù)據(jù)類型 + 字符串都得字符)

? ? 數(shù)字和undefined運算得NaN

????隱式轉(zhuǎn)換

????????任意的數(shù)據(jù)類型加上空串( 任意數(shù)據(jù)類型 + ''),即可將其轉(zhuǎn)換為String類型

????????????a.如果加號兩邊都是字符串,那么加號的作用是連接

????????????b.如果加號兩邊都是數(shù)值,那么加號的作用是相加

????????????c.如果加號一邊是字符串,那么加號的作用是連接

????-(減號)? *(乘) /(除)

????????任何值做減/乘/除運算時,都會自動轉(zhuǎn)換為Number

????????可以通過為一個值-0? *1? /1 來將其轉(zhuǎn)換為Number

????????????????????例:

????????????????????var str = '123';

????????????????????var num = str - 0;

????????????????????// var num = str * 1;

????????????????????// var num = str / 1;

????????????????????console.log(num ,typeof? num);

????%(取余&取模)

????????兩數(shù)相除取余數(shù)

????()括號

????????改變運算順序的先后順序

????一元運算符

????????+ 正號

????????????不會對數(shù)字產(chǎn)生影響

????????????隱式類型轉(zhuǎn)換:可以對其他數(shù)據(jù)類型使用正號(+),來將其轉(zhuǎn)換為Number

????????- 負(fù)號

????????????可以對數(shù)字進(jìn)行符號的取反

????自增和自減

????????自增

????????????- 通過自增可以讓變量在自身的基礎(chǔ)上增加1

????????????- 對變量自增以后,原變量的值會立即自增1

????????????a++ 的值等于原變量的值(自增前的值)

????????????++a 的值等于新值(自增后的值)

????自減

????????????- 通過自減可以讓變量在自身的基礎(chǔ)上減1

????????????- 無論是a--還是--a,都會立即使原變量的值自減1

????????????a-- 的值等于原變量的值(自減前的值)

????????????--a 的值等于新值(自減后的值)


邏輯運算符 &&(與)? ||(或)? !(非)

????&&(與)

????有假則為假,全真才為真

????||(或)

????有真則為真,全假才為假

????!(非)

????可以用來對一個值進(jìn)行非運算(true變false,false變true)

????如果對非布爾值進(jìn)行運算,先將非布爾值變成布爾值,再運算

????可以為一個任意數(shù)據(jù)類型取反兩次,將其轉(zhuǎn)換為布爾值

?*?undefined ,?null , NaN , " " , 0 ,?false?以上幾個值轉(zhuǎn)換為布爾值都是false


&& ||? ?非布爾值的情況下

????對于非布爾值進(jìn)行與或運算時,會先將其轉(zhuǎn)換為布爾值,然后再運算,并且返回原值

????????&&(與)運算:

? ??????????????如果兩個值都為true,則返回后邊的

????????????????如果兩個值中有false,則返回靠前的false

????????????????如果第一個值為true,則必然返回第二個值

????????????????如果第一個值為false,則直接返回第一個值

????????||(或)運算:

? ??????????????如果第一個值為true,則必然返回第一個值

????????????????如果第一個值為false,則直接返回第二個值


賦值運算符

????=

????可以將符號右邊的值賦給左邊的變量

????+=

????a += 5? 就是? a = a + 5;? (a等于a加上5再賦給自身)


關(guān)系運算符 >(大于)? <(小于)

????通過關(guān)系運算符可以比較兩個值之間的大小關(guān)系,如果關(guān)系成立則返回true,不成立則返回false

????非數(shù)值的情況

????????對于非數(shù)值進(jìn)比較,先將其轉(zhuǎn)換為數(shù)值再進(jìn)行比較

????????任何值和NaN做任何比較都是false

????????如果符號兩側(cè)的值都是字符串,不會將其轉(zhuǎn)換成數(shù)字,而會分別比較字符串的Unicode編碼

????????輸出Unicode編碼 console.log('\u1c00')


相等運算符

????== 用兩個等于號來做相等運算

????????==? (兩個等于號比對值)兩邊值類型不同的時候,要先進(jìn)行類型轉(zhuǎn)換,再比較

????????* 由于undefined衍生自null,所以undefined == null 的時候會返回true

????????* NaN不和任何值相等,包括他本身

????????* 通過isNaN()函數(shù)來判斷一個值是否是NaN

????????*

????===(全等) 判斷兩個值是否全等,不會做類型轉(zhuǎn)換,如果兩個值類型不能,直接返回false


三元運算符

????條件表達(dá)式?語句1:語句2;

????執(zhí)行流程:

????????條件運算符在執(zhí)行時,首先對條件表達(dá)式進(jìn)行求值,

????????如果該值為true,則執(zhí)行語句1,并返回執(zhí)行結(jié)果

????????如果該值為false,則執(zhí)行語句2,并返回執(zhí)行結(jié)果

????????????????????例:

????????????????????var a = 10;

????????????????????var b = 20;

????????????????????a > b ? console.log('a大'):console.log('b大')


?for循環(huán)

for(var i = 0;i < 10; i++){

????console.log(i)

}

????for(①初始化表達(dá)式;②條件表達(dá)式;④更新表達(dá)式){

???????????③執(zhí)行語句...

????}

流程:

????①執(zhí)行初始化表達(dá)式,初始化變量(只會執(zhí)行一次)

????②執(zhí)行條件表達(dá)式,判斷是否執(zhí)行循環(huán)

????如果為true,則執(zhí)行循環(huán)③

????如果為false,終止循環(huán)

????④執(zhí)行更新表達(dá)式,更新表達(dá)式執(zhí)行完畢繼續(xù)重復(fù)②


練習(xí):打印1至100的和

var sum = 0;

for(var i =0;i <= 100;i++){

????????// console.log(i);

????????sum = sum+i;

}

console.log(sum);

練習(xí):打印1至100以內(nèi)奇數(shù)的和

var sum = 0;

for(var i =0;i <= 100;i++){

????????if(i % 2 != 0){

????????????????sum = sum + i;

????????}

}

console.log(sum);


需求,在頁面中輸出如下的圖形

????外循環(huán)控制高度

????for (var i =0; i <5; i++) {

? /*??內(nèi)循環(huán)控制寬度? */

? ??正三角

? ?for(var j = 0;j < i+1; j++){

? ? ????document.write('*? ')

? ?}

? ?倒三角

? ? for(var j =0;j <5-i; j++){

????????document.write('* ')

????}

????document.write('<br>')

}

正三角
倒三角

打印99乘法表

for (var i =1; i <=9; i++) {

????????for(var j =1;j <= i; j++){

????????????????document.write("<span>"+j +'*' +i +'=' + i*j +"</span>")

????????}

document.write('<br>')

}


99乘法表


switch? case?語句

????var n = window.prompt('input');

????????switch (n) {

????????????case '春天':

? ? ? ????????? console.log('春意盎然');

????????????????break;

????????????case '夏天':

? ? ? ????????? console.log('夏日炎炎');

????????????????break;

????????????case '秋天':

? ? ? ????????? console.log('收獲的季節(jié)');

????????????????break;

????????????case '冬天':

? ? ? ????????? console.log('凍死你個龜孫');

????????????????break;

}


break和continue

? ?*不能在if語句中使用break和continue


????????break關(guān)鍵字可以用來退出switch或循環(huán)語句

????????break關(guān)鍵字會立即終止離他最近的循環(huán)語句


????????continue關(guān)鍵字可以用來跳出當(dāng)次循環(huán)(終止本次循環(huán),進(jìn)行下次循環(huán))

????????continue關(guān)鍵字會立即終止離他最近的循環(huán)語句


? ? ? ? *使用return會結(jié)束整個函數(shù)


運算符的優(yōu)先級


對象

?- 只要不是string、number、boolean、null、undefined,其他都是對象

????????基本數(shù)據(jù)類型都是單一的值"hello" 123 true, 值和值之間沒有任何的聯(lián)系


對象的分類

1.內(nèi)建對象

????-由ES標(biāo)準(zhǔn)中定義的對象,在任何的ES的實現(xiàn)中都可以使用

????比如:Math String Number Boolean Function Object ...

2.宿主對象

????-由JS的運行環(huán)境提供的對象,目前來講主要指由瀏覽器提供的對象

????比如:BOM DOM

3.自定義對象

????-由開發(fā)人員自己創(chuàng)建的對象

????創(chuàng)建對象

????var?obj = {};

? ? * 在對象中保存的值稱為屬性

????* 向?qū)ο筇砑訉傩?/p>

????* 語法:

????????????* 對象 . 屬性名 = 屬性值;*/


向obj中添加一個name gender age

????????obj.name ='八戒';

????????obj.gender ='男';

????????obj.age =18;


* 讀取對象中的屬性

* 語法:

*? 對象 . 屬性名

*

*? 如果讀取對象中沒有的屬性,不會報錯,而是會返回undefined?

????????console.log(obj.name);

????????console.log(obj.gender);

????????console.log(obj.age);


* 修改對象的屬性

* 語法:

*? ? 對象 . 屬性名 = 新值*/

????????obj.name ='tom';

????????console.log(obj.name);


* 刪除對象的屬性

* 語法:

*? ? delete? 對象 . 屬性名*/

????????delete? obj.age;

????????console.log(obj ,?obj.age);


屬性名和屬性值

* 屬性名:

*? - 對象的屬性名不強(qiáng)制要求遵守標(biāo)識符的規(guī)范,但盡量按照標(biāo)識符的規(guī)范

*

* 屬性值

*? ? - JS對象的屬性值,可以是任意的數(shù)據(jù)類型

如果需要使用特殊的屬性名,不能采用?.?的方式來操作

需要使用另一種方式

語法:

? ? ? ? ?對象['屬性名] = 屬性值;

? ? ? ? ?obj['123'] = 789;

? ? ? ? ? console.log(obj['123']);

讀取的時候也要使用這種方式


?in運算符

*? ? - 通過in運算符可以檢查一個對象中是否含有指定的屬性

*? ? ? 如果有就返回true 沒有就返回false

* 語法:

*? ? ? "屬性名" in 對象*/

????????console.log('name' in obj);


基本數(shù)據(jù)類型和引用數(shù)據(jù)類型

基本數(shù)據(jù)類型

????JS中的變量都是保存到棧內(nèi)存中的

????基本數(shù)據(jù)類型的值,直接在棧內(nèi)存中存儲

????值與值之間是獨立存在的,修改一個變量不會影響其他的變量

? ? ? 例:? ? ?var a = 10;

? ? ? ? ? ? ? ? ? var b = a;

? ? ? ? ? ? ? ? ? a++;

? ? ? ? ? ? ? ? ? console.log(b);

* 因為a的值和b的值是獨立存在的,所以a++之后并不會影響b的值

引用數(shù)據(jù)類型

對象是保存到堆內(nèi)存中的,每創(chuàng)建一個新的對象,就會在堆內(nèi)存中開辟出一個新的空間,而變量保存的是 對象的內(nèi)存地址(即對象的引用),如果兩個變量保存的是同一個對象的引用,當(dāng)其中一個變量修改屬性時,另一個也會收到影響(因為不是獨立的)

? ? ? 例:? ? ?var obj = new Object();

????????????????obj.name = '孫悟空';

????????????????var obj2 = obj;

????????????????console.log(obj2.name);? //孫悟空

????????????????obj.name = '豬八戒';

????????????????console.log(obj2.name);? //豬八戒


* 當(dāng)我們比較兩個基本數(shù)據(jù)類型時,就是比較值

* 當(dāng)比較兩個引用數(shù)據(jù)類型時,比較的是對象的內(nèi)存地址

* 如果兩個對象是一模一樣的,但是地址不同,就會返回false


?* 棧區(qū)(速度快 性能高 存儲量比較小)

?* 堆區(qū)(空間大 訪問速度慢 性能比較低)


函數(shù)

????- 函數(shù)中可以封裝一些功能(代碼),在需要的時候可以執(zhí)行這些功能(代碼)

????- 函數(shù)中可以保存一些代碼,在需要的時候調(diào)用

????????函數(shù)聲明

????????????格式:

????????????????????function 函數(shù)名 ([形參1,形參2...形參N]){

????????????????????????????????語句...

????????????????????}

????????????function test(num1,num2) {

????????????????????????console.log(num1 + num2);

????????????}

????????????test(1,3);

*?當(dāng)實參個數(shù)多與形參時,多出來的實參不被使用

*?當(dāng)實參的數(shù)量少于形參時,則沒有對應(yīng)實參的形參,形參將是undefined

** 函數(shù)的執(zhí)行結(jié)果可以通過return返回出來,但是需要有個變量來接收

注意:在函數(shù)中,return后的語句都不會執(zhí)行

? ? ? ? ? ? 如果return語句后面不跟任何值,就相當(dāng)于返回一個undefined

????? 函數(shù)表達(dá)式

????????????var fun3 =function () {

????????????????????????console.log(3);

????????????};

????????????fun3();

????fun3();

????????????- 調(diào)用函數(shù)

????????????- 相當(dāng)于使用的是函數(shù)的返回值

????fun3

????????????- 函數(shù)對象

? ? ? ? ? ? - 相當(dāng)于直接使用函數(shù)對象


立即執(zhí)行函數(shù)

????函數(shù)定義完立即被調(diào)用,這種函數(shù)就是立即執(zhí)行函數(shù)

????立即執(zhí)行函數(shù)只會執(zhí)行一次

????????(function () {

????????????????console.log(1);

????????})();

立即執(zhí)行函數(shù)

枚舉對象中的屬性

??語法:????for(var 變量 in 對象){

????????????????}

????for...in語句 對象中有幾個屬性,循環(huán)體就會執(zhí)行幾次

????每次執(zhí)行時,會將對象中的一個屬性的名字賦值給變量

????var obj = {

????????????name:'wlf',

? ????????? age:18,

? ????? ????add:'pek',

? ????????? gender:'男'

????};

????for(var n in obj){

????????????console.log(obj[n]);

????}


作用域

????- 指一個變量的作用范圍

?????????js中有兩種作用域

????????????????1.全局作用域

????????????????- 直接寫在script標(biāo)簽中的都是全局作用域

????????????????- 全局作用域在頁面打開時創(chuàng)建,在頁面關(guān)閉時銷毀

????????????????- 在全局作用域中,有一個全局對象window,可以直接使用

????????????????- 在全局作用域中:

????????????????????創(chuàng)建的變量都會作為window對象的屬性保存

????????????????????創(chuàng)建的函數(shù)都會作為window對象的方法保存

????????????????- 全局作用域中的變量都是全局變量,在頁面的任意的部分都可以訪問的到

????*變量的聲明提前

????? ? ?- 使用var關(guān)鍵字聲明的變量,會在所有的代碼執(zhí)行之前被聲明(但不會賦值)

????*函數(shù)的聲明提前

? ????? ?- 使用函數(shù)聲明形式創(chuàng)建的函數(shù)function函數(shù),它會在所有的代碼執(zhí)行之前就被創(chuàng)建

????? ? ?- 使用函數(shù)表達(dá)式創(chuàng)建的函數(shù),不會被聲明提前,所以不能在聲明前調(diào)用

????????????????2.函數(shù)作用域

????????????????- 調(diào)用函數(shù)時創(chuàng)建函數(shù)作用域,函數(shù)執(zhí)行完函數(shù)作用域銷毀

????????????????- 每調(diào)用一函數(shù)就會創(chuàng)建一個新的函數(shù)作用域,他們之間是相互獨立的

????????????????- 函數(shù)作用域中可以訪問到全局作用域的變量,而全局作用域中無法訪問函數(shù)作用域的變量

????*在函數(shù)中不適用var聲明的變量都會成為全局變量

????* 定義形參就相當(dāng)于在函數(shù)作用域中聲明了變量


數(shù)組對象方法

push()? 向數(shù)組末位添加新元素,該方法會將數(shù)組新的長度作為返回值返回

unshift()? 向數(shù)組首位添加新元素,該方法會將數(shù)組新的長度作為返回值返回

pop()? 該方法可以刪除數(shù)組的最后一個元素,并將被刪除的元素作為返回值返回

shift()? 該方法可以刪除數(shù)組的第一個元素,并將被刪除的元素作為返回值返回

reverse()? 顛倒(翻轉(zhuǎn))數(shù)組中元素的順序

join()? 把所有元素放入字符串,并用指定分隔符進(jìn)行分隔,如果不指定,默認(rèn)是逗號(,)

? ? ? ? ? 并且會把object的類型轉(zhuǎn)換成string

concat() 連接兩個或更多的數(shù)組,并返回結(jié)果

slice() 選取數(shù)組的的一部分,并返回一個新數(shù)組

????????????參數(shù):1從哪個角標(biāo)開始截取,2到哪個角標(biāo)結(jié)束(不包含這個角標(biāo)的元素)

????????????返回值:開始截取的元素和結(jié)束截取的元素的前一個元素

????????????注意點:第二個參數(shù)可選,如果不寫,默認(rèn)截取到元素最后

splice() 從數(shù)組中刪除元素,并返回被刪除的結(jié)果

????????????參數(shù):1開始刪除元素的角標(biāo),2要刪除幾個元素,3把元素刪除之后要替換的元素

sort() 對數(shù)組的元素進(jìn)行排序


forEach()

????????- 需要一個函數(shù)作為參數(shù)

????????- 用forEach遍歷時,數(shù)組中有幾個元素,函數(shù)就會執(zhí)行幾次。每次執(zhí)行時,瀏覽器會將遍歷到的元素以實參的形式傳遞進(jìn)來,我們可以來定義形參來讀取這些內(nèi)容

????????函數(shù)的形參1:當(dāng)前遍歷的元素

????????函數(shù)的形參2:當(dāng)前遍歷元素的索引(可選)

? ? ? ? 函數(shù)的形參3:當(dāng)前遍歷的數(shù)組(可選)


數(shù)組去重

var arr = [1,2,2,2,45,45,7,6,99,99,99,2]

????????for(var i = 0;i<arr.length;i++){

????????????????for(var j = i+1;j<arr.length;j++){

????????????????????????if(arr[i] == arr[j]){

????????????????????????????????arr.splice(j,1) j--;

????????????????????????}

????????????????}

????????}

console.log(arr);

可以去掉字符串 ,?數(shù)組

????????// var arr = ['你好','hello','你好','我','他','的','的','的的'];

????????// var arr = ['1','2','1','3','4','1','2','4'];

? ? ????var arr = [1,1,2,2,3,3,4,123,345,567,7,4,23,5,657,567];

????????//定義一個新的數(shù)組

????????var s = [];? ? ? ??

? ? ????//遍歷數(shù)組

? ????? for(var i = 0;i<arr.length;i++){

????????????????//判斷在s數(shù)組中是否存在,不存在則push到s數(shù)組中

? ? ? ????????? if(s.indexOf(arr[i])== -1){

????????????????????????s.push(arr[i]);

????????????????}

????????}

????????console.log(s);


創(chuàng)建日期對象

var date=new Date();

date.getFullYear();用data調(diào)用獲取時間的方法

????????1.getFullYear() 從Date 對象以四位數(shù)返回年份

????????2.getMonth() 從Date 對象對象返回月份,取值范圍(0~11)

????????3.getDate() 從Date 對象返回一個月中的某一天,取值范圍(1~31)

????????4.getDay() 從Date 對象返回一周中的某一天,取值范圍(0~6)

????????// 星期幾? ? ? 0.周末? 1.周一? 2.周二

????????5.getHours() 返回Date 對象的小時,取值范圍是(0~23)

????????6.getMinutes() 返回Date 對象的分鐘,取值范圍是(0~59)

????????7.getSeconds() 返回Date 對象的秒數(shù),取值范圍是(0~59)

????????8.getTime() 返回從1970年1月1日至今的毫秒數(shù)? 稱為:時間戳

????????9.valueOf() 返回Date 對象的原始值 時間戳


string對象方法

????????在底層,字符串是以字符串?dāng)?shù)組的形式保存的

length 獲取字符串的長度

charAt() 返回對應(yīng)的索引的元素

charCodeAt() 返回指定字符串的Unicode編碼

concat() 用來鏈接兩個或多個字符串

indexOf() 找到指定內(nèi)容的索引(默認(rèn)從前往后查找。如果沒有找到指定內(nèi)容,則返回-1)

slice() 選取數(shù)組的的一部分,并返回一個新數(shù)組

? ? ? ? ? ?參數(shù):1從哪個角標(biāo)開始截取,2到哪個角標(biāo)結(jié)束(不包含這個角標(biāo)的元素)

? ? ? ? ? ?返回值:開始截取的元素和結(jié)束截取的元素的前一個元素

? ? ? ? ? ?注意點:第二個參數(shù)可選,如果不寫,默認(rèn)截取到元素最后

substring() 同slice()

? ? ? ? ? ?不同的是參數(shù)不可以傳遞負(fù)值

split() 把字符串分割成字符串?dāng)?shù)組

? ? ? ? ? 參數(shù)是字符串里面的任意一個元素,傳入?yún)?shù)之后,把元素之前的部分和之后的部分分成兩個字符串,形成一個字符串?dāng)?shù)組

? ? ? ? ? 如果參數(shù)傳一個空串,會將每個字符都拆分為數(shù)組中的一個元素

toLocaleUpperCase() 將字符串轉(zhuǎn)化為大寫并返回


正則表達(dá)式

????????語法:

????????var 變量 = new RegExp('正則表達(dá)式','匹配模式');

????????常用字面量來創(chuàng)建

????????var 變量 = /正則表達(dá)式/匹配模式;

????????????????參數(shù)2:

????????????????????????i : 忽略大小寫

? ? ? ????????????????? g : 全局匹配模式


手機(jī)號:<input type="text" id="pho" onblur="isPhone(this.value);"/>

郵箱:? ? <input type="text"? onblur="isEmail(this.value);"/>

//驗證手機(jī)號是否合法

????function isPhone(phone){

????????????var pho = document.getElementById('pho');

? ????????? var reg =/^[1][3,5,8][0-9]{9}$/;

? ????????? var? falg = phone.search(reg);

? ????????????????? if(phone ==''){

????????????????????????????console.log('手機(jī)號不能空');

? ? ? ????????????????????? pho.style.border='1px solid red'

? ????????????????? }else {

????????????????????????????// console.log('不是空的,進(jìn)入');

? ? ? ????????????????????? if (falg == -1){

????????????????????????????????????????console.log("手機(jī)號不正確");

? ? ? ? ? ????????????????????????????? pho.style.border='1px solid yellow'

? ? ? ? ? ????????????????????????????? this.focus();

? ? ? ????????????????????? }else {

????????????????????????????????????????console.log('登錄手機(jī)號成功');

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? pho.style.border='1px solid green'

? ? ? ????????????????????? }

????????????????}

}


//驗證郵箱是否合法

/* ==================================================================

任意字母下劃線? ? .任意字母下劃線? ?@? ?任意字母數(shù)字? ? .任意字母(2-5位)? ? .任意字母(2-5位)

? ? ? ? ? ?\w{3,}? ? ? ? ? ? (\.\w+)*? ? ? ? ? ? ? ? @? ? ? ?[A-z0-9]+? ? ? ? ? ? ? (\.[A-z]{2,5}){1,2}

===================================================================*/

????function isEmail(email){

????????????var reg =/^\w{3,}(\.\w+)*@[A-z0-9]+(\.[A-z]{2,5}){1,2}$/;

????????????var? falg = email.search(reg);

? ?????????????????? if(email ==''){

????????????????????????????console.log('郵箱不能為空')

????????????????????}else {

????????????????????????????if (falg == -1){

????????????????????????????????????console.log("郵箱不正確");

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? this.focus();

? ? ????????????????????????? }else {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? console.log('登錄郵箱成功');

? ? ? ???????????????????????? }

????????????????????}

?????}


//去掉首尾空格

var str ='? xx xxx x? ';

var str = str.replace(/^\s*|\s*$/g,'');

console.log('|'+str+'|');


DOM

????????- document object model 文檔對象模型

????????- document(文檔)

????????文檔表示的就是整個html網(wǎng)頁文檔

????????- object(對象)

????????對象表示將網(wǎng)頁中的每一個部分都轉(zhuǎn)換為一個對象

????????- model(模型)

???????使用模型來表示對象之間的關(guān)系,這樣方便我們獲取對象

[dom操作方法]

????getElementById()

????????????通過id屬性獲取一個元素節(jié)點對象

????getElementsByClassName()

????????????通過類名獲取一組元素節(jié)點對象

????getElementsByTagName()

????????????參數(shù):是標(biāo)簽的名稱

????????????通過標(biāo)簽名獲取一組元素節(jié)點對象

????childNodes

????????表示當(dāng)前節(jié)點的所有子節(jié)點

????????注意:根據(jù)DOM標(biāo)準(zhǔn),標(biāo)簽間的換行也會當(dāng)成文本節(jié)點

????????而在ie8以下 則不會

????children

????????獲取當(dāng)前元素的所有子元素(標(biāo)簽)

????firstChild

????????表示當(dāng)前節(jié)點的第一個子節(jié)點(包括空白文本節(jié)點)

????lastChild

????????表示當(dāng)前節(jié)點的最后一個子節(jié)點

????parentNode

????????獲取當(dāng)前節(jié)點的父節(jié)點

????querySelector() / querySelectorAll()

????????可以根據(jù)css選擇器查詢元素節(jié)點

????????獲取兄弟標(biāo)簽

????nextElementSibling? ? =>ie9以下不兼容

????????nextSibling? ? =>ie9以下兼容

????????兼容寫法nextElementSibling || nextSibling;

????appendChild()

????????向一個父節(jié)點中添加一個新的子節(jié)點。永遠(yuǎn)添加到后面

????????語法:父元素.appendChild(子節(jié)點)

????createElement()

????????創(chuàng)建元素節(jié)點(創(chuàng)建標(biāo)簽)

????????參數(shù):要創(chuàng)建的標(biāo)簽名稱

? ??createTextNode()

? ? ? ? 創(chuàng)建文本節(jié)點

????removeChild()

????????刪除指定標(biāo)簽

????replaceChild()

????????替換子節(jié)點

????????參數(shù):1新的節(jié)點,2被替換的節(jié)點

????cloneNode()

????????克隆/復(fù)制節(jié)點

????????參數(shù):為true的時候會克隆該元素和里面的子元素,為false的時候只會克隆該元素

????setAttribute()

????????可以給標(biāo)簽設(shè)置屬性

????????參數(shù)1:屬性的名稱,參數(shù)2:屬性的值


JS獲取元素的樣式

????1.currentStyle

????????只有IE支持,所以不推薦使用

????2.getComputedStyle()

????????這個方法是window的方法,可以直接使用

????????需要兩個參數(shù)

????????1.要獲取樣式的元素

????????2.可以傳遞一個為元素,一般都傳null

????????返回值:一個對象

????????該方法不支持IE8及以下

????????????????寫一個兼容的方法

????????????????????????//obj 要獲取樣式的元素

????????????????????????//name 要獲取的樣式名

????????????function getStyle(obj,name){

????????????????????if(window.getComputedStyle){

????????????????????????????return getComputedStyle(obj,null)[name];

????????????????????}else {

????????????????????????????return obj.currentStyle[name];

????????????????????}

????????????}

????????????注意點:通過currentStyle和getComputedStyle()獲取到的樣式只能讀取,不能修改。


getBoundingClientRect()

? ? ? ? -獲取元素幾乎所有信息

clientWidth

clientHeight

????????-可以獲取元素的寬度和高度

????????-獲取的值包括 content + padding

offsetWidth

offsetHeight

????????-獲取元素的寬度和高度

????????-獲取的值包括 content + padding + border

offsetLeft

offsetTop

????????-距離第一個有定位的祖先元素左邊和上邊的距離

????????注意:祖先元素必須要有定位,如果沒有,則最終以body為準(zhǔn).

offsetParent

????????-找到最近的帶有定位的祖先元素,如果祖先元素沒有定位,默認(rèn)是body

scrollWidth

scrollHeight

????????-可以獲取元素整個滾動區(qū)域的寬度和高度

scrollTop

scrollLeft

????????-獲取的是滾動條已經(jīng)滾動過的距離

scrollHeight - scrollTop == clientHeight ,說明滾動條已經(jīng)到底。[下圖實例]

scrollHeight - scrollTop == clientHeight


event事件對象

? ??事件句柄:

????onmousemove

????????????- 鼠標(biāo)在元素中移動時被觸發(fā)

????onmousedown

????????????- 鼠標(biāo)按下事件

????onmousemove

????????????- 鼠標(biāo)拖拽移動事件

????onmouseup

????????????- 鼠標(biāo)抬起事件

????onmousewheel

????????????- 鼠標(biāo)滾輪滾動事件,會在滾輪滾動時觸發(fā)(火狐不支持該屬性)

? ? ? ? ? ? ? 用event.wheelDelta來獲取滾動方向

????DOMMouseScroll

? ? ? ? ? ? - 鼠標(biāo)滾輪滾動事件(只支持火狐)

? ? ? ? ? ? ? 用event.detail獲取滾動方向

? ??鼠標(biāo) / 鍵盤屬性

????event = event || window.event;? (兼容寫法:前面是標(biāo)準(zhǔn)瀏覽器,后面是ie6,7,8)

????????clientX

????????clientY

????????????- 獲取鼠標(biāo)指針在可見窗口的水平和垂直坐標(biāo)

????????pageX

????????pageY

????????????- 代表鼠標(biāo)在當(dāng)前文檔區(qū)域(整個網(wǎng)頁,包括滾動條下面)的坐標(biāo)

? ? ? ? ? ? ?注意:在ie8中不支持


事件冒泡(Bubble)

????????- 當(dāng)一個元素上的事件被觸發(fā)的時候,比如說鼠標(biāo)點擊了一個按鈕,同樣的事件將會在那個元素的所有祖先元素中被觸發(fā)。這一過程被稱為事件冒泡;這個事件從原始元素開始一直冒泡到DOM樹的最上層。

? ? ? ? -?比如

如果三個div都有點擊事件,如果觸發(fā).one的,那么其他兩個也會跟著觸發(fā)


阻止冒泡

????????- 阻止事件(主要是事件冒泡,因為IE不支持時間捕獲)

* w3c的方法是event.stopPropagation(),IE則是使用event.cancelBubble = true

jquery用stopPropagation(),而js中直接用cancelBubble


事件委托(事件代理)

????????- 事件委托就是利用事件冒泡,只指定一個事件處理程序,就可以管理某一類型的所有事件

????????比如:ul下有1000個li,要給每一個li添加點擊事件,我們不需要去遍歷li,只需要給ul添加點擊事件就可以。


默認(rèn)行為

????????- 就是指本身就有一些特性,比如點擊a標(biāo)簽?zāi)J(rèn)就會跳轉(zhuǎn)

取消默認(rèn)事件

function preventDefault(event) {

????????if (event.preventDefault) {

????????????????event.preventDefault();

????????} else {

????????????????event.returnValue = false;

????????}

}


給對象綁定事件

????1:onclick

? ? ? ?btn.onclick = function(){};

? ? ? ?- 不能綁定多個,后面的會覆蓋掉前面的。

????2.addEventListener()

? ? ? ?btn.addEventListener('click',function(){},false)

? ? ? - 參數(shù)

????????????????1)事件的字符串,不用寫on

????????????????2)回調(diào)函數(shù),當(dāng)事件觸發(fā)時,該函數(shù)被調(diào)用

????????????????3)是否在捕獲階段觸發(fā)事件,需要一個布爾值,一般傳false,如果在事件捕獲階段就觸發(fā)事件,可以把第三個參數(shù)寫成true。

????????????????* 如果說事件冒泡是從a到li到ul到div,那么事件捕獲就是div到ul到li到a;

? ? ? ?- 可以同時為一個元素的相同事件綁定多個響應(yīng)函數(shù)。

? ? ? ? - 這個方法中的this是綁定事件的對象

????3.attachEvent()

? ? ? ?btn.attachEvent('onclick',function(){})

????????* IE8支持

????- 參數(shù)

????????????1)事件的字符串,需寫on

????????????2)回調(diào)函數(shù),當(dāng)事件觸發(fā)時,該函數(shù)被調(diào)用

????- 可以同時為一個元素的相同事件綁定多個響應(yīng)函數(shù),但是執(zhí)行順序是后綁定先執(zhí)行。

? ? - 這個方法中的this是window

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • --- 學(xué)習(xí)目標(biāo): - 掌握編程的基本思維 - 掌握編程的基本語法 typora-copy-images-to: ...
    YFBigHeart閱讀 1,125評論 0 2
  • 1、新的聲明方式 以前我們在聲明時只有一種方法,就是使用var來進(jìn)行聲明,ES6對聲明的進(jìn)行了擴(kuò)展,現(xiàn)在可以有三種...
    令武閱讀 1,090評論 0 7
  • 【古言】不若拈花自己戴(3) 槐花 自從鄒道醫(yī)說俞母的病會傳染后,俞家的后院就愈發(fā)冷清了,仆人們沒事都不愿意踏足這...
    十里紅塵閱讀 609評論 0 0
  • 什么是 TCP 粘包問題以及為什么會產(chǎn)生 TCP 粘包,本文不加討論。本文使用 golang 的 bufio.Sc...
    51reboot閱讀 2,398評論 0 1
  • 最近在看一本書,刻意練習(xí),想要在任何領(lǐng)域有所成就必須得刻意練習(xí),而不是簡單的可以用一萬小時定律來計算,或者來源于天...
    55a50d532804閱讀 236評論 0 3

友情鏈接更多精彩內(nèi)容