JavaScript
JavaScript是腳本語言余耽,編程語言 解釋性語言 單線程的
瀏覽器的內(nèi)核
- 谷歌瀏覽器 Webkit內(nèi)核(v8引擎)Blink
- 火狐瀏覽器 Gecko內(nèi)核
- 歐朋瀏覽器 Presto內(nèi)核
- IE瀏覽器 Trident內(nèi)核
- Safari瀏覽器 Webkit內(nèi)核(發(fā)明者)
導入JavaScript的三種方式
- 行內(nèi)使用
- 內(nèi)聯(lián)方式
- 外部引入
內(nèi)嵌導入和外鏈導入不能合并在一起早直,如果當前是外鏈導入的爬舰,那么在Script腳本塊中編寫的所有代碼都不會被執(zhí)行,js代碼一般放在body的末尾谎柄,要先保證元素的加載成功纲菌,才可以在js中獲取到设哗。
JavaScript的三部分組成
- ECMAScript(ES):規(guī)定了js的一些基礎核心的知識(變量,數(shù)據(jù)類型抠蚣,語法規(guī)范,操作語句等)
- DOM:document object model 文檔對象模型履澳,里面提供了一些屬性和方法嘶窄,可以讓我們操作頁面中的元素
- BOM:browser object model 瀏覽器對象模型,里面提供了一些屬性和方法距贷,可以讓我們操作瀏覽器
JavaScript數(shù)據(jù)類型
基本數(shù)據(jù)類型(值類型)
- number: 數(shù)字
- string: 字符串 => 使用單雙引號包裹起來的值
- boolean: 布爾 => true false
- null: 空對象指針
- undefined: 未定義
引用數(shù)據(jù)類型
- object對象數(shù)據(jù)類型
- {} 普通對象
- [] 數(shù)組
- /^$/ 正則
- function函數(shù)數(shù)據(jù)類型
function fn(){};
js數(shù)據(jù)類型的檢測
- typeof: 檢測數(shù)據(jù)類型的運算符
- instanceof: 檢測某個實例是否屬于這個類
- constructor: 獲取當前實例的構(gòu)造器
- Object.prototype.toString.call: 獲取當前實例的所屬類信息
typeof
使用typeof檢測柄冲,返回的結(jié)果都是一個<u>''字符串''
</u>,字符串中包含的內(nèi)容證明了值是屬于什么類型的忠蝗,結(jié)果有六種现横,number,string,boolean,object,function,undefined
局限性
- typeof null的結(jié)果不是“null“而是“object”:因為null雖然是單獨的一個數(shù)據(jù)類型阁最,但是他原本的意思是空對象指針戒祠,瀏覽器使用typeof檢測的時候就會把它按照對象來檢測
- 使用typeof無法區(qū)分具體的object對象數(shù)據(jù)類型
typeof 12 => "number"
typeof(12) => "number"
var num = 13;
typeof num => "number"
typeof NaN => "number"
typeof 'zzp' => "string"
typeof true => "boolean"
typeof null => "object"
typeof [1,2,3] => "object"
typeof undefined => "undefined"
boolean布爾
Boolean() 方法 =>把其他類型的值轉(zhuǎn)化為布爾類型
- 只有 0,NaN速种,空字符串姜盈,null,undefined ('沒有空格') 這六個數(shù)據(jù)值轉(zhuǎn)換為布爾類型是false配阵,其余的都是true
- 數(shù)字除了0和null馏颂,都會轉(zhuǎn)換為true
- 字符串除了空字符串之外都是true
- 對象也會轉(zhuǎn)換為true
!
的作用
- != 不等于
- 取反:先把值轉(zhuǎn)換為布爾類型,然后再取反
!!
的作用:再取反的基礎上再取反闸餐,相當于沒有做操作饱亮,但是已經(jīng)吧其他類型的值轉(zhuǎn)化為布爾類型了,和Boolean是相同的效果
string字符串
在js中舍沙,單引號和雙引號包起來的都是字符串
常用方法:
- a.toString()
- charAt charCodeAt
- substr substring slice
- toUpperCase toLowerCase
- indexOf lastIndexOf
- split
- replace
- match
number數(shù)字
類型:0 12 -12 12.5 NaN(not a number)
typeof NaN
=> "number"
var num = Number.MAX_VALUE
--- 數(shù)字的最大值
var num = Number.MIN_VILUE
--- 大于0的最小值 5e-324
Infinity
正無窮大
- NaN == NaN => false; NaN和任何其他的值都不相等近上,和任何數(shù)相加都是NaN
- 方法:isNaN 用來檢測這個值是否是非有效數(shù)字,如果
不是有效數(shù)字
檢測的結(jié)果是true
拂铡,反之是有效數(shù)字
則為false
//當我們使用isNaN檢測值的時候壹无,檢測的值不是number類型的贺喝,瀏覽器會默認的把值先轉(zhuǎn)化為number類型处坪,然后再去檢測,如果檢測的對象是引用數(shù)據(jù)類型戒突,需要先使用toSting方法轉(zhuǎn)換為字符串類型涛碑,再把字符串轉(zhuǎn)換為number類型钢拧,最后再檢測
//只有對象類型,NaN,undefined會返回true
isNaN(NaN) => true;
isNaN(undefined) => true;
isNaN() => true;
isNaN({}) => true;
isNaN([]) => false;
isNaN('') => false;
isNaN(0) => false;
isNaN(null) => false;
//數(shù)組對象:空數(shù)組和一個數(shù)組元素都會返回false
isNaN([]) => false;
isNaN([12]) => false;
isNaN([12,13]) => true;
//布爾類型都會轉(zhuǎn)換為false
isNaN(true) => false;
isNaN(false) => false;
//對象類型的都會返回true, null除外
isNaN({}) => true;
isNaN({name:'zzp'}) => true;
- Number() 方法 =>把其他數(shù)據(jù)類型的值轉(zhuǎn)化為number類型的值
//在使用Number轉(zhuǎn)換的時候只要字符串中出現(xiàn)任何一個非有效數(shù)字字符允睹,最后的結(jié)果都是NaN
Number() => 0;
Number([]) => 0;
Number({}) => NaN;
Number('') => 0;
Number(0) => 0;
Number(null)=> 0;
Number(undefined) => NaN;
//字符串類型轉(zhuǎn)換為number為數(shù)字和NaN
Number('12') => 12;
Number('12px') => NaN;
//布爾類型轉(zhuǎn)換為number是0和1
Number(true) => 1;
Number(false) => 0;
//把引用數(shù)據(jù)類型轉(zhuǎn)化為number行您,首先需要先把引用數(shù)據(jù)類型轉(zhuǎn)為字符串(toString),再把字符串轉(zhuǎn)換為number即可
//一般對象和正則轉(zhuǎn)換為數(shù)字都是NaN
Number([]) => []=>'' ''=>0;
Number([12]) => [12]=>'12' '12'=>12;
Number([12,13]) => [12,13]=>"12,13" "12,12"=>NaN;
Number({name:'zzz'}) => NaN;
Number({}) => NaN;
//可以使用toString方法來轉(zhuǎn)換進制
var num = 128;
num.toString(16); => 80
num.toString(8); => 200
num.toString(2); => 10000000
//保留小數(shù)點之后幾位
變量.toFixed(保留的小數(shù)點的位數(shù));
- parseInt() 方法=>也是把其他數(shù)據(jù)類型值轉(zhuǎn)換為number溜宽,和Number方法在處理字符串的時候有所區(qū)別
//=> 從左到右依次查找有效的數(shù)字字符,直到遇見非有效數(shù)字字符為止包括小數(shù)點豺撑,把找到的轉(zhuǎn)換為數(shù)字
Number('12px') => NaN;
parseInt('12px') => 12;
parseInt('12px13') => 12;
parseInt('px13') => NaN;
parseInt('12.5px') => 12;
//=> 也可以用來轉(zhuǎn)換進制數(shù)
parseInt(a,8); 吧a轉(zhuǎn)換為八進制的數(shù)
- parseFloat() 方法=>在parseInt的基礎上可以識別小數(shù)點
parseInt('12.5px') => 12;
parseFloat('12.5px') => 12.5;
null和undefined
null undefined 空字符串 0
- 空字符串和null的區(qū)別 空字符串開辟了內(nèi)存烈疚,消耗了一丟丟的性能
- null和undefined的區(qū)別
- null一般都是暫時沒有,預期中以后會有的聪轿。在js中一般都是手動賦值為null爷肝,后期我們在給其賦值。
- undefined:完全沒有在預料之內(nèi)
對象數(shù)據(jù)類型
每一個對象都是由零到多組
屬性名(key鍵):屬性值(value值)
組成的陆错,或者說是有多組鍵值對組成的灯抛,每一組組鍵值中間用逗號隔開
- 屬性:描述這個對象特點特征的
- 對象的屬性名是字符串或者數(shù)字格式的,存儲的屬性值可以是任何的數(shù)據(jù)類型
- 操作屬性的方法:
對象名.屬性名
(忽略了屬性名的單雙引號)對象名['屬性名']
(不能忽略單雙引號)- 如果操作的屬性名在對象中不存在音瓷,獲取的結(jié)果是undefined
- 一個對象的屬性名是不能重復的(唯一性)对嚼,如果之前存在就是修改屬性值,之前不存在就是設置新的屬性
- 假刪除:讓其屬性賦值為null外莲,但是屬性還在對象中猪半;真刪除:把整個屬性都在對象中暴力移除
delete 對象名.屬性名
基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的區(qū)別
JS是運行在瀏覽器中的(內(nèi)核引擎),瀏覽器會為JS提供賴以生存的環(huán)境(提供給JS代碼執(zhí)行的環(huán)境)=>
全局作用域window(glibal)
基本數(shù)據(jù)類型是按值操作的
:在賦值的時候偷线,直接把值賦給變量 var a = 12;
- 聲明一個變量存儲到棧內(nèi)存變量存儲空間中 =>聲明
- 創(chuàng)建數(shù)值12 存儲到棧內(nèi)存存儲空間中
- 讓變量a和數(shù)值12關聯(lián)起來磨确。=>就是定義也是賦值
引用數(shù)據(jù)類型是按照空間地址(引用地址)來操作的
:var n = {name:'周'}
- 先創(chuàng)建一個變量n,聲明變量存放到棧內(nèi)存變量存儲空間中
- 創(chuàng)建值:由于值比較復雜,不能直接存放到值存儲空間中需要先開辟一個新的存儲空間(堆內(nèi)存)16進制地址声邦,把對象的鍵值對分別存儲到棧內(nèi)存中,函數(shù)存儲的是代碼字符串
- 把空間的地址賦值給了變量 讓變量和堆內(nèi)存中的引用地址進行賦值關聯(lián)
引用數(shù)據(jù)類型中的函數(shù)
:function fn (){ 函數(shù)體 }
- 先聲明一個函數(shù)名乏奥,和聲明變量一樣,先放到棧內(nèi)存變量存儲空間中亥曹,如果函數(shù)名和之前聲明的變量名字一樣的話會沖突
- 創(chuàng)建值:先開辟一個新的存儲空間(堆內(nèi)存)16進制地址邓了,里面存放的是函數(shù)體中的代碼,是用單引號包含的字符串而已
- 把空間的地址賦值給了變量 讓變量和堆內(nèi)存中的引用地址進行賦值關聯(lián)
JavaScript中變量命名規(guī)范
- js中嚴格區(qū)分大小寫
- 遵循國際命名規(guī)則‘駝峰命名法’第一個單詞首字母小寫媳瞪,其他的首字母大寫
- 命名使用英語骗炉,不要使用拼音
- 不能使用關鍵字和保留字
- 可以使用$ _ 數(shù)字 字母,但是不能使用數(shù)字作為第一位
JavaScript變量和常量
變量:值是可以變的
常量:值是不可變的
//=>JavaScript中定義變量的方式蛇受,ES6中定義變量使用let
//變量只能代表一個值
var 變量名; //=> 聲明一個變量
變量名 = 值; //=> 賦值
var 變量名 = 值; //=> 定義了一個變量
初始化
//任何一個具體的數(shù)據(jù)值都是常量句葵,12
//和變量類似,我們設置一個常量兢仰,給其存儲一個值乍丈,但是這個存儲的值不能修改
const 常量名 = 值;//=>定義了一個常量把将,給它存儲值為12
變量提升
- JavaScript中轻专,函數(shù)及變量的聲明都將被提升到函數(shù)的最頂部 變量可以在使用后聲明,也就是變量可以先使用再聲明 函數(shù)優(yōu)先提升
- JavaScript中察蹲,只有聲明的變量會提升请垛,初始化的不會(就是賦值)
變量作用域
變量有局部變量和全局變量:局部變量只能在被聲明的函數(shù)內(nèi)部使用催训,而全局變量在網(wǎng)頁中的所有腳本和函數(shù)均可以使用當變量在函數(shù)內(nèi)沒有被聲明的時候(沒有使用var關鍵字),該變量為全局變量叼屠。 函數(shù)的參數(shù)屬于局部變量瞳腌。變量聲明時如果不使用 var 關鍵字,那么它就是一個全局變量镜雨,即便它在函數(shù)內(nèi)定義
JavaScript輸出操作(output)
三種提示方式
- alert:在瀏覽器中彈出一個提示框(提供確定按鈕,點擊確定彈框消失)當多個alert語句加在一起的時候儿捧,可以重復點擊荚坞,知道最后點完為止。
- 使用alert提示的信息菲盾,提示的內(nèi)容最后都會被轉(zhuǎn)換為<u>
"字符串"
</u>輸出(調(diào)用了tostring這個方)- confirm:在alert基礎上增加了讓用戶選擇性的操作(提供確定和取消按鈕)
- 定義一個變量來接收其返回的值颓影,點擊確定返回true,點擊取消返回false懒鉴。我們可以根據(jù)接收的結(jié)果做不同的處理
- prompt:在comfirm基礎上增加讓用戶輸入的效果(提供一個輸入框诡挂,確定和取消按鈕)
- 用戶點擊取消按鈕,我們得到的結(jié)果是null临谱,如果用戶點擊的是確定按鈕璃俗,我們將會獲取到用戶輸入的內(nèi)容(如果用戶沒有輸入任何的內(nèi)容,獲取到的結(jié)果是空字符串)
var as = parseInt(window.prompt(‘input-------提示語’));
可以提示用戶彈框輸入數(shù)字真實項目中悉默,尤其是需要樣式精美的網(wǎng)站中城豁,我們的提示框一般都是自己封裝插件和組件來實現(xiàn)的(使用原生JS封裝模態(tài)框組件)
控制臺輸出,開發(fā)人員使用
- console.log:在控制臺輸出抄课,優(yōu)勢是不會轉(zhuǎn)換數(shù)據(jù)類型唱星,輸出什么格式的數(shù)據(jù)都可以
- console.dir:比log輸出的更加詳細一些
- console.table:把json數(shù)據(jù)展示成一個表格
還有哪些console輸出方式?
在頁面中輸出
- document.write('輸出內(nèi)容');
- document.write(“html標簽”);
- document.write(變量名);
- document.write(可以輸出多項內(nèi)容 變量+”內(nèi)容“);
當括號中用引號引起是 直接輸出引號里面的內(nèi)容,輸出變量時直接寫變量名即跟磨,當輸出html的時候也用引號括起來间聊。
JavaScript運算符
= 賦值,等號左邊是變量抵拘,右邊是值
== 比較哎榴,如果左右兩邊的值的類型不一樣,瀏覽器會默認轉(zhuǎn)換為一樣的然后去比較
- 兩個等于號比較仑濒,左右兩邊數(shù)據(jù)值的類型不一樣的叹话,會都轉(zhuǎn)換為數(shù)字再比較 null undefined NaN 除外
null==undefind => true;
null===undefined;
null和undefined和其他任意值都不相等- 對象和對象
[]==[] => false;
比較的是空間的地址var a={}; var b=a; a==b;=> true;
- 對象和數(shù)字
[]==0 => true;
({})==NaN => false;
先把對象轉(zhuǎn)換為數(shù)字- 對象和字符串
[]=='' => true;
把兩邊都轉(zhuǎn)化為數(shù)字- 對象和布爾
[]==true => false;
[]==false => true;
![]==false => true;
===: 絕對相等,不僅要求值一樣墩瞳,而且類型也要求完全一樣
算術運算符:+
-
*
/
++
--
%
優(yōu)先級最高
比較運算符:<
>
<=
>=
!=
最終都會轉(zhuǎn)換為數(shù)字來比較
- 任何值和NaN做比較都是false
- 比較兩個字符串的時候驼壶,先把他轉(zhuǎn)換為ascll碼
- 其中的一邊為字符串的時候,先把其轉(zhuǎn)換為數(shù)字再做比較
邏輯操作符:
&&
||
!
優(yōu)先級最低
邏輯與( && ): 同真為真 遇假返假 遇真返后
邏輯或( || ): 同假為假 遇真返真 遇假返后
- &&:(與)當兩邊的表達式同時為真的時候喉酌,整個的運算為真 碰到假的時候就直接返回值
- &&兩邊的表達式热凹,第一個為false的時候直接返回0 為true的時候返回另一邊的值
a=1+1 && 1-1; =>0
兩邊都為false的時候泵喘,則返回前面的值- 也可以當作短路語句 當用到一個值的時候,先判斷是不是為空般妙,空的話在執(zhí)行后面的語句
a && 語句;
- ||:(或)當兩邊的表達式中任意一個為真的時候纪铺,運算為真,同時為假的時候碟渺,結(jié)果為假 碰到真的時候直接返回值
- ||兩邊的表達式鲜锚,第一個為true的時候直接返回1 為false的時候返回另一邊的值
a=1+1 || 1-1; =>2
加法的特殊性
- 使用+的時候,
不是數(shù)字類型的先轉(zhuǎn)化為數(shù)字類型
- 再遇到字符串的時候苫拍,+不是數(shù)學運算芜繁,而是字符串的拼接,只要不遇到字符串就是數(shù)學運算
1+1+'a'+1=2a1
- 字符串拼接是把其他數(shù)據(jù)類型的toString是直接吧值用單雙引號包含起來绒极,只有對象toString的時候是
[object object]
- 任何值和字符串加法運算骏令,都會先轉(zhuǎn)換為字符串,然后進行字符串拼接垄提,
操作符的優(yōu)先級
- 除了加法運算中的字符串和其他類型的值相加的時候榔袋,其他的都會轉(zhuǎn)換為number
- 可以通過用小括號包起來的方式來提高運算的優(yōu)先級
- 算術運算符
=>
比較運算符=>
邏輯操作符=>
=
JavaScript判斷語句
if,else if,else
if(){}else if(){}else{}
- 如果好幾個條件成立了,只把第一個成立的條件執(zhí)行铡俐,后面成立的條件忽略不管
if(A){}
如果條件中只有一個固定值凰兑,先把他轉(zhuǎn)換為布爾類型,判斷中加來決定條件是否成立三元運算符
- 條件高蜂?條件成立執(zhí)行:條件不成立執(zhí)行; ===
if(條件){}else{}
- 條件聪黎?條件成立執(zhí)行:null undefined void 0; 可以使用這些占位
- 當條件成立的時候,如果執(zhí)行多條操作备恤,可以使用()稿饰,每條語句之間用逗號分割
- 在三元運算符中,不能出現(xiàn)break露泊,content喉镰,return
switch case
應用于if else中一個變量在不同值情況下的不同操作
switch
后面小括號中存放的是一個值(一般我們都寫變量,把變量存儲的值拿來用惭笑,有時候也可能是一個計算)case
后面放入的都是值侣姆,目的是驗證switch后面的值和哪一種case后面的值相等,相等的進行對應的處理(也可以是一個計算)default
當其他的值都不成立的時候執(zhí)行- 每一種case結(jié)束的時候沉噩,后面都要加
break
捺宗,結(jié)束當前的判斷,最后一項可以不加break- 不加break時川蒙,不管后面的條件是否成立蚜厉,都會繼續(xù)往下執(zhí)行,直到遇到break為止
- 把符合某幾項值都去做同一件事情畜眨,使用不加break實現(xiàn)
- switch case中的比較使用的是:
===
JavaScript循環(huán)
重復做一件事情
continue昼牛;=> 結(jié)束本輪循環(huán)术瓮,其之后的代碼不會執(zhí)行,直接去執(zhí)行步長贰健,繼續(xù)執(zhí)行下一輪
break胞四;=> 結(jié)束整個循環(huán),其后面的代碼都不會執(zhí)行while循環(huán)
while(條件){循環(huán)語句}
- 當條件成立的時候伶椿,執(zhí)行后面的語句辜伟,直到條件不滿足為止typeof
do...while循環(huán)
保證循環(huán)體至少執(zhí)行一次,先執(zhí)行一遍代碼悬垃,然后判斷條件for循環(huán)
//沒有步長累加的時候游昼,會形成死循環(huán),項目中避免
for(循環(huán)的起始值,循環(huán)的執(zhí)行條件,步長累加){
//=> 循環(huán)體:=重復做的事情都在循環(huán)體中
}
for in循環(huán)
- for...in 語句用于對數(shù)組或者對象的屬性進行循環(huán)操作
- for ... in 循環(huán)中的代碼每執(zhí)行一次尝蠕,就會對數(shù)組的元素或者對象的屬性進行一次操作
//對象中有多少個鍵值對,就循環(huán)多少次(不一定)
//每一次循環(huán)key這個變量存儲的都是當前循環(huán)這組鍵值對的屬性名
//key存儲的額值都是字符串格式的(不管屬性名是否為數(shù)字)
//在for in 循環(huán)遍歷的時候载庭,大部分的瀏覽器先把對象中的鍵值對進行排序:數(shù)字屬性名放在前面由大到下排列看彼,其次把非數(shù)組按照之前的順序排列(小數(shù) 不算)
var obj = {name:'zzp',age:'12',1:'ddd',3:'fds'};
for (var key in obj){}
//obj['key'] 屬性名是key
//obj[key] key變量存儲的值
JavaScript函數(shù)
函數(shù)中有最基本的函數(shù)使用function一個函數(shù)名來定義,也可以把它賦值給一個變量來使用(函數(shù)表達式)囚聚,這樣使用的時候可以不添加函數(shù)名字靖榕,所以他也叫做匿名函數(shù)。
函數(shù)的創(chuàng)建有三種方式
- 使用構(gòu)造函數(shù):
var fun = new Function();
- 使用函數(shù)聲明:
function fun (){}
- 使用匿名函數(shù):
var fun = function(){}
OOP:面向?qū)ο?/p>
- 函數(shù)數(shù)據(jù)類型是按照引用地址來操作的
- 函數(shù):具備一定功能的方法
- 命名規(guī)范是小駝峰
theFirstName
- 函數(shù)方法體中可以訪問外面的變量顽铸,外面的不可以訪問函數(shù)內(nèi)部的變量
- 函數(shù)只創(chuàng)建不執(zhí)行沒有意義:因為在堆內(nèi)存空間中存儲的都是毫無意義的字符串
- 在真實的項目中茁计,我們一般都會把實現(xiàn)一個具體功能的代碼封裝在函數(shù)中:
函數(shù)封裝
(類的繼承·封裝·多態(tài))
- 如果當前這個功能需要在頁面中執(zhí)行多次,不封裝成為函數(shù)谓松,每一次想實現(xiàn)這個功能星压,都需要重新把代碼寫一遍,浪費時間鬼譬;而封裝在一個函數(shù)中娜膘,以后想要實現(xiàn)多次的這個功能,我們就沒有必要在重新寫代碼了优质,只需要把函數(shù)重新執(zhí)行即可竣贪,提高了開發(fā)效率
- 封裝在一個函數(shù)中,頁面中就基本上很難出現(xiàn)重復一樣的代碼了巩螃,減少了頁面中代碼的堆積演怎,提高了代碼的重復利用率:
低耦合高內(nèi)聚
//=> 創(chuàng)建函數(shù)的語法:相當于生產(chǎn)了一臺洗衣機 ===>堆內(nèi)存存儲的都是字符串
//=> 這個叫做函數(shù)的聲明,命名函數(shù)表達式
function 函數(shù)名() {
//=>函數(shù)體:實現(xiàn)某一個功能的js代碼
}
//函數(shù)執(zhí)行調(diào)用:把函數(shù)體中的代碼執(zhí)行=> ===>棧內(nèi)存
// 1. 瀏覽器創(chuàng)建一個供函數(shù)中代碼執(zhí)行的私有環(huán)境(私有作用域)=> 私有作用域中的變量提升
// 2. 把創(chuàng)建的時候空間中存儲的字符串拿過來避乏,然后變?yōu)檎嬲腏S表達式代碼爷耀,然后再執(zhí)行
//=> 執(zhí)行函數(shù):相當于使用洗衣機洗衣服(如果函數(shù)只創(chuàng)建了但是沒有執(zhí)行,函數(shù)就沒有任何意義)
函數(shù)名(); //=> 執(zhí)行這個函數(shù)
函數(shù)名; //=> 輸出函數(shù)本身
//函數(shù)也可以作為方法調(diào)用淑际,如果在對象中定義了方法畏纲,調(diào)用的時候直接使用 對象名.方法名();來調(diào)用
//=> 形參:形式參數(shù)(變量)扇住,函數(shù)的入口
//=> 實參:函數(shù)執(zhí)行傳遞給函數(shù)具體的值
//=> 當我們創(chuàng)建一個函數(shù)想要實現(xiàn)某個功能的時候,發(fā)現(xiàn)一些材料并不清楚盗胀,只有當函數(shù)運行的時候才知道艘蹋,此時我們就需要設定入口,讓用戶執(zhí)行的時候通過入口把值傳給我們
//=> 當我們定義了形參但是執(zhí)行的時候沒有傳遞進去實參票灰,默認參的值是undefined(容錯處理)
//=>
function fn(形參女阀,形參){ };
fn (1,2);
argument實參集合
當我們不知道用戶要傳遞幾個值的時候,此時我們無法設置形參的個數(shù):遇到此類需求屑迂,需要使用函數(shù)內(nèi)置的實參集合:arguments
- arguments只有函數(shù)才有
- 不管執(zhí)行函數(shù)的時候是否傳遞實參浸策,arguments天生就存在,沒有傳遞實參ARG是個空的集合惹盼,傳遞了ARG中包含了所有穿的實參值
- 不管是否設置了形參庸汗,ARG中始終存儲了所有的實參信息
- arguments是一個類數(shù)組集合
- 以數(shù)字作為索引(屬性名)從零開始
- 有一個length屬性,存儲的是當前的幾個的長度
arguments.length
argument['length']
- arguments.callee:存儲的是當前函數(shù)的本身
- arguments.callee.caller:存儲的是當前函數(shù)在哪執(zhí)行的(宿主函數(shù))手报,在全局作用域下執(zhí)行的
返回值return
- 返回值是函數(shù)提供的一個出口:如果我們想在外面使用函數(shù)私有的一些信息蚯舱,那就需要通過return,把這些信息返回出來供外面使用
- 如果函數(shù)中沒有寫return或者return后面啥也沒有掩蛤,默認的返回結(jié)果是undefined
- 在函數(shù)體當中枉昏,遇到return之后,后面的代碼都不執(zhí)行了
棧內(nèi)存
作用域(全局作用域/私有作用域):提供一個供js代碼執(zhí)行的環(huán)境
堆內(nèi)存
所有的引用數(shù)據(jù)類型揍鸟,他們需要存儲的內(nèi)容都在堆內(nèi)存中(相當于一個倉庫兄裂,目的是存儲信息)
- 對象會把鍵值對存儲進來
- 函數(shù)會把代碼當作字符存儲進來
匿名函數(shù)
沒有名字的函數(shù)
- 函數(shù)表達式
- 把一個沒有名字的函數(shù)作為值賦值給一個變量或者一個元素的某個事件
var a = function (){return a};
- 自執(zhí)行函數(shù)
- 創(chuàng)建函數(shù)和執(zhí)行函數(shù)放在一起,創(chuàng)建完成立馬執(zhí)行
;(函數(shù)內(nèi)容)(傳參);
~函數(shù)體(實參);
前面可以是-
+
阳藻!
~
用來控制語法規(guī)范
構(gòu)造函數(shù)
對象名使用大駝峰命名規(guī)則 就是首字母大寫 有new關鍵字
- 構(gòu)造函數(shù)的首字母必須大寫晰奖,用來區(qū)分于普通函數(shù)
- 內(nèi)部使用的this對象,來指向即將要生成的實例對象
- 使用New來生成實例對象
當定的一個函數(shù)的首字母是大寫的時候稚配,這個函數(shù)就是一個構(gòu)造函數(shù)
調(diào)用這個函數(shù)的時候:var ren = new Person(參數(shù),參數(shù));
ren.內(nèi)部方法();
也就是說把這個方法給了變量畅涂,他擁有方法的特性
var Person = function(){};
創(chuàng)建一個構(gòu)造函數(shù)
var person = new Person();
實例化一個對象
閉包
函數(shù)執(zhí)行會形成一個私有的作用域,讓里面的私有變量和外界的互不影響(互不干擾道川,外面的無法直接獲取里面的變量值)午衰,此時我們可以理解為私有作用域吧私有變量保護起來,我們把這種保護機制稱為
閉包
.
get冒萄,set
...
JavaScript中的this
...
JavaScript方法
Math中常用的方法
數(shù)學函數(shù):但是他的數(shù)據(jù)類型是對象數(shù)據(jù)類型
dir(Math);
Math.abs();
取絕對值就是一個數(shù)的正數(shù)an be s
Math.ceil();
向上取整sei you
Math.floor()
向下取整f lor er
Math.round();
四舍五入 當是負數(shù)的時候臊岸,5包含在向下的Math.round(-12.5)=>-12
ruang de
Math.random();
獲取[0,1)之間的隨機小數(shù)包含0
Math.round(Math.random()*10);
獲取[1,10]之間的隨機整數(shù)Math.round(Math.random()*(m-n)+n);
獲取[n,m]之間的隨機整數(shù)Math.max();
獲取一組中的最大值Math.min();
獲取一組中的最小值Math.PI;
獲取圓周率 派Math.pow(10尊流,2)=> 100;
獲取一個值的多少次冪Math.sqrt(100)=> 10;
開平方
string中常用的方法
在JS中使用單雙引號包起來的都是字符串 字符串相當于一個數(shù)組
var str = 'aap'; str.length=3;
在控制臺輸入console.dir(String.prototype);
str.charAt(索引);
返回指定索引位置的字符帅戒,指定的索引不存在的話會返回空字符串,不指定的話返回第一個str[不存在]=> ' '
str.charCodeAt(索引);
在charAt基礎上,把獲取的字符變?yōu)閡nicode編碼值String.fromCharCode(111);
把值按照ASCLL表中的值轉(zhuǎn)換為原有的字符str.substr(n,m);
從索引n開始截取m個字符
- 只傳遞n直接截取到字符串的末尾
- 超出索引能截多少截多少
- 一個參數(shù)也不傳,克隆整個字符串
str.substring(n,m);
從索引n開始截取到m處(不包括m) 只傳一個值則截取到末尾str.slice(n,m);
從索引n開始截取到m處(不包括m) 支持負數(shù)索引str.toUpperCase;
把字母全部大寫str.toLowerCase;
把字母全部小寫str.indexOf('字符')
獲取當前字符在字符串中第一次出現(xiàn)的位置索引
- 如果當前字符在字符串中沒有出現(xiàn)過逻住,結(jié)果是-1钟哥,可以用來驗證當前字符串中是否有這個字符
str.lastIndexOf('字符')
獲取當前字符在字符串中最后一次出現(xiàn)的位置索引str.split()=>全部拆開
按照字符串中的某一個字符把字符串拆分成數(shù)組中的某一項,和數(shù)組中的join相對應 支持正則str.replace('之前的字符',替換的字符')
實現(xiàn)字符的替換 執(zhí)行一次只能替換一次str.trim()
str.trimRight()
str.trimLeft()
去除字符串首尾的空格
Data方法
Data對象用于處理日期與時間 首先需要創(chuàng)建Data對象:
var date = new Date();
var n = date.getFullYear();
返回當前是多少年var n = date.getMonth();
返回當前是幾月var n = date.getDate();
返回當前月的當前一天var n = date.getDay();
返回當前是星期幾var n = date.getHours();
返回當前是幾點(24小時)var n = date.getMinutes();
返回當前是幾分鐘var n = date.getSeconds();
返回當前是幾秒var n = date.getMilliseconds();
返回當前是幾毫秒var n = date.getTime();
返回距1970年1月1日之間的毫秒數(shù):var n = data.getUTCDate();
使用UTC的時候返回的是國際時間var n = data.setUTCDate(12);
設置國際時間的日期為12
var t = d.toLocaleDateString();
=>"2019/2/13"
返回的是年月日luo kan ou er
var t = d.toLocaleString();
=>"2019/2/13 下午2:23:07"
返回的是年月日和時間var t = d.toLocaleTimeString();
=>"下午2:23:07"
返回的是時間var t = d.toString();
=>"Wed Feb 13 2019 14:23:07 GMT+0800 (中國標準時間)"
返回中國標準年月日和時間var t = d.toTimeString();
=>"14:23:07 GMT+0800 (中國標準時間)"
返回中國標準時間var t = d.toUTCString();
=>"Wed, 13 Feb 2019 06:23:07 GMT"
返回的是國際標準時間=>
=>
//返回時間的方法
function date() {
var data = new Date();
var y = data.getFullYear(); //年
var M = data.getMonth(); //月
var d = data.getDate(); //日
var day = data.getDay(); //星期幾
var h = data.getHours(); //時
var m = data.getMinutes(); //分
var s = data.getSeconds(); //秒
var ms = data.getMilliseconds(); //毫秒
//返回日期時間
return y + '年' + M + '月' + d + '日' + ' ' + '星期' + day + ' ' + h + '時' + m + '分' + s + '秒' + ms + '毫秒';
}
var time = date(); //方法調(diào)用
計時器
setInterval(function(){},3000)
間隔指定的毫秒數(shù)不停地執(zhí)行指定的代碼- 把定時器賦值給一個全局對象瞎访,然后可以使用
clearInterval(myVar);
來清除計時器setTimeout(function(){},3000);
指定的時間之后執(zhí)行函數(shù)- 把延時時器賦值給一個全局對象腻贰,然后可以使用
clearTimeout(myVar);
來清除計時器
頁面上的方法
document.documentElement.scrollTop || document.body.scrollTop
-- 滾動條距離頂部的距離scrollBar: flase
-- 隱藏滾動條var 0bj = obj.getBoundingClientRect()
-- 獲取元素相對于視窗的位置集合 小括號
0bj.top:元素上邊到視窗上邊的距離;
0bj.right:元素右邊到視窗左邊的距離;
0bj.bottom:元素下邊到視窗上邊的距離;
0bj.left:元素左邊到視窗左邊的距離;box.offsetTop
-- 盒子距離頂部的距離 沒有小括號
box.offsetLeft -- 盒子距離頂部的距離
box.offsetWidth -- 盒子距離頂部的距離
box.offsetHeight -- 盒子距離頂部的距離obj.classList.add("類名", "類名")
-- 給所選的class添加一個或多個新的class名obj.classList.remove("類名", "類名")
-- 移除一個或者多個類名obj.classList.length
-- 獲取有幾個類名
讓一個元素來回滾動的方法是先設置絕對定位,然后使用
var xxleft = parseInt(xx.style.left);
方法獲得left的值扒秸,通過設置xx.style.left = xxleft + 'px';
來控制移動, 通過計時器的方法執(zhí)行這個動畫播演。
JavaScript對象
頂層對象,在瀏覽器環(huán)境指的是window對象伴奥,在 Node 指的是global對象
對象定義的規(guī)則
- 將左花括號與類名放在同一行
- 冒號與屬性值間有個空格
- 字符串使用雙引號写烤,數(shù)字不需要
- 最后一個屬性值對后面不要添加逗號
- 將右花括號獨立放在一行,并以分號作為結(jié)束符號
一個對象里面有自己的屬性和方法拾徙,對象的方法是對對象屬性的一個定義結(jié)合洲炊,需要的時候調(diào)用就可以
- 如果想要增加一個屬性 =>
對象名.屬性=值;
- 如果要刪除一個屬性 =>
delete 對象名.屬性;
訪問對象屬性的兩種方法:
對象.屬性名;
對象[”屬性名“];
創(chuàng)建對象的方法:方法名: function(){};
使用對象的方法:對象名.方法名();
JavaScript數(shù)組
數(shù)組也是對象數(shù)據(jù)類型的
typeof [] => 'object';
字符串相當于一個數(shù)組
數(shù)組的創(chuàng)建:
var array = new Array();
var array = new Array(1,2,3,4,);
var array = [0,1,2,3,];
數(shù)組中存儲的數(shù)據(jù)可以是任意類型的
創(chuàng)建的新數(shù)組是空數(shù)組,沒有值尼啡,輸出則顯示undefined
創(chuàng)建數(shù)組的時候选浑,雖然指定了他的長度,但是數(shù)組的長度是可變化的
在數(shù)組中添加新的成員玄叠,直接使用一個未使用的索引
arr[12] = 21;
數(shù)組的長度:
數(shù)組名.length
長度會隨著元素的增加而增大,也可以直接改變數(shù)組的長度arr.length=12;
數(shù)組也有屬性名拓提,只不過屬性名是數(shù)字读恃,我們把數(shù)字屬性名稱之為他的索引:數(shù)組是以數(shù)字作為索引,索引從零開始
類數(shù)組:類似于數(shù)組代态,但是不是數(shù)組
- 通過getElementByTagName獲取的元素集合
- 函數(shù)中的實參集合arguments
數(shù)組中的常用方法
方法的意義和作用
方法的形參
方法的返回值
使用此方法之后寺惫,數(shù)組的改變
console.dir(Array.prototype)
:用來輸出數(shù)組中常用的方法arr[arr.length]=xxx;
=> 在數(shù)組的末尾增加一個新的內(nèi)容- push:在數(shù)組的末尾添加一個新的元素
arr.push(12,'zzp',{name:'zzp'},function(){});
- unshift:在數(shù)組的開頭添加新的元素
arr.unshift (12,'zzp',{name:'zzp'},function(){});
- pop:刪除數(shù)組的最后一項
arr.pop();
- shift:刪除數(shù)組的第一項
arr.shift();
刪除之后,后面每一項的索引都要向前進一位- delete arr[索引]:刪除指定的索引對象蹦疑,當前項被刪除之后西雀,其他項的索引不會改變,當前數(shù)組的length也不會改變
- arr.length--:也可以刪除數(shù)組的最后一項
- splice 刪除 Array.splice(開始位置歉摧, 刪除的個數(shù)艇肴,元素)
- 返回的是被刪除的內(nèi)容(以一個新的數(shù)組保存) 原數(shù)組改變
arr.splice(0);
:清空數(shù)組splice();
:一項也不刪除,返回一個新的空數(shù)組arr.splice(n,m);
:從索引n開始刪除m個(m不寫是刪除到數(shù)組的末尾)
- splice 修改
- 返回的是被刪除的內(nèi)容(以一個新的數(shù)組保存) 原數(shù)組改變
arr.splice(n,m,x);
:在原有刪除的基礎上叁温,用x代替刪除的- splice 增加
- 返回的是一個空數(shù)組 原數(shù)組改變
arr.splice(n,0,x);
:在修改的基礎上再悼,我們一項也不刪除,把x插入到索引n的前面arr.splice(0,0,x);
:在數(shù)組的開頭追加新的內(nèi)容arr.splice(arr.length,0,x);
:在數(shù)組的最后追加新的元素arr.splice(0,1);
:刪除數(shù)組的第一項arr.splice(arr.length);
:刪除數(shù)組的最后一位- 數(shù)組的查詢 slice
- arr.slice(n,m):找到從索引n開始到索引m處(不包含m)
- 返回查找到的內(nèi)容以新數(shù)組的方式返回膝但,原來的數(shù)組不變
arr.slice(n);
: 只寫n冲九,從n開始找到末尾arr.slice(0)/slice();
: 數(shù)組克隆,克隆一份和原來的數(shù)組一摸一樣的新數(shù)組跟束,克隆的數(shù)組和原數(shù)組不一樣arr.slice(-n,-m);
: 支持負數(shù)索引莺奸,按照倒數(shù)來選的- 數(shù)組的拼接 concat
- 返回的是拼接之后的新數(shù)組丑孩,原數(shù)組沒有改變
arr.concat([111,222],333,'zzp',{name:'zzp'});
: 拼接的對象可以是任意的類型arr.concat();
:可以實現(xiàn)數(shù)組的克隆- 數(shù)組轉(zhuǎn)化為字符串 toString
- 實現(xiàn)吧數(shù)組轉(zhuǎn)化為字符串(轉(zhuǎn)化后的字符串以逗號分隔每一項)
- 返回的是轉(zhuǎn)換后的字符串,原有的數(shù)組不變
- join:把數(shù)組按照指定的
分隔符
(分隔符是字符串形式)轉(zhuǎn)換為字符串 返回的是一組字符串 原數(shù)組不變arr.join('+');
- split:按照字符串中的某一個字符把字符串拆分成數(shù)組中的某一項 支持正則
- evel:把字符串變?yōu)閖s表達式執(zhí)行
var a = evel(arr.join('+'));
可以實現(xiàn)數(shù)字數(shù)組的求和- reverse:把數(shù)組反過來進行排列 返回的是排列之后的數(shù)組 原數(shù)組也改變
- sort: 實現(xiàn)數(shù)組的排序 返回的是排序之后的新數(shù)組
- 如果沒有傳入?yún)?shù) 可以給10以內(nèi)的數(shù)升序排列 超過10位數(shù)時只識別第一位
arr.sort(function(a,b){return a-b});
: 升序排列arr.sort(function(a,b){return b-a});
: 降序排列- 遍歷數(shù)組的方法
arr.forEack(function(n,m){});
:遍歷數(shù)組中的每一項 n是當前的遍歷值 m是當前值的索引arr.map(function(n,m){returen xxx});
: 返回的值是當前遍歷的這一項修改之后的值- 查找數(shù)組中的某一項是否包含字符串
includes(字符串)
包含的話返回true- 給某個字符串補全幾位
padstart(2, '0')
前面是補全幾位,后面是用什么補全
數(shù)組去重
- 方法一:遍歷數(shù)組中的每一項灭贷,那一項和它后面的項依次比較温学,如果相同了,則把相同的項去掉
- 方法二:利用indexOf來驗證當前數(shù)組中是否包含某一項氧腰,包含把當前項刪除掉
- 方法三: 遍歷數(shù)組中的每一項枫浙,把每一項作為新對象的屬性名和屬性值存儲起來,在每一次向?qū)ο笾写鎯χ肮潘紫瓤匆幌略瓕ο笾惺欠癜@個屬性
二維數(shù)組
二維數(shù)組的本質(zhì)是箩帚,數(shù)組中的元素又是數(shù)組
var ary = [[0,1,2][0,1,2]];
直接給數(shù)組賦值arr[1][1];
第一個代表外圍數(shù)組的索引,第二個代表的是找到第一個索引數(shù)組之后當中的數(shù)組索引- 通過雙for循環(huán)的方法復制黄痪,然后使用循環(huán)遍歷出來
//先定義二維數(shù)組
var arr = new Array();
for(var i=0;i<3;i++){
arr[i] = new Array();
for(var j=0;j<5;j++){
arr[i][j] = i+j;
}
}
//循環(huán)遍歷二維數(shù)組
for(var i=0;i<arr.length;i++){
for(var j=0;j<arr[i].length;j++){
document.write(arr[i][j]);
}
document.write("<br/>");
}
JavaScript算法
冒泡排序
...
遞歸算法
找規(guī)律找出口
快速排序
...
插入排序
...
JavaScript正則
JavaScriptDOM操作
DOM節(jié)點
在HTML中的所有內(nèi)容都是節(jié)點紧帕,節(jié)點是用來描述頁面中每一部分之間關系的 只要能獲取頁面中的一個節(jié)點,那么我就可以通過相關的屬性和方法獲取頁面中的其他節(jié)點
- 元素節(jié)點: HTML標簽
- nodeType:1
- nodeName:大寫的標簽名
- nodeValue:null
- 文本節(jié)點: 文字內(nèi)容 空格換行
- nodeType:3
- nodeName:#text
- nodeValue:文本內(nèi)容
- 注釋節(jié)點: 注釋內(nèi)容
- nodeType:8
- nodeName:#comment
- nodeValue:注釋內(nèi)容
- document文檔節(jié)點:
- nodeType:9
- nodeName:#document
- nodeValue:null
- 使用
dir(document.body.childNodes);
來獲得body下面的所有子節(jié)點
元素id.children
獲取所有的元素子節(jié)點(元素集合) 使用ID時直接可以操作parentNode
獲取當前元素的父節(jié)點(元素對象)previousSibling
nextSibling
獲取當前節(jié)點的上一個哥哥節(jié)點 下一個弟弟節(jié)點previousElementSibling
nextElementSibling
獲取當前節(jié)點的上一個哥哥元素節(jié)點 下一個弟弟元素節(jié)點firstChild
lastChild
當前元素所有子節(jié)點的第一個 當前元素所有子節(jié)點的最后一個firstElementChild
lastElementChild
當前元素所有子節(jié)點的第一個元素節(jié)點 當前元素所有子節(jié)點的最后一個元素節(jié)點- 自定義屬性
(set/get/remove)Attribute
給當前的元素設置/獲取/移除屬性桅打,一般操作的都是自定義屬性- XXX.index = x:把當前操作的元素作為一個普通的對象
DOM的增刪改
document.createElement;
: 在js中動態(tài)創(chuàng)建一個HTML標簽
- 增加
appendChild;
: 把當前創(chuàng)建的新元素添加到容器的末尾- 增加
inserBefore(新元素, 老元素);
: 把新創(chuàng)建的元素增加到老元素之前- 刪除
容器.removeChild(元素);
在當前容器中刪除這個元素- 替換
replaceChild(新元素,老元素);
在當前容器中拿新元素替換老元素- 克隆
元素.cloneNode(false/true);
把原有的元素克隆一份不寫的話默認時false false:只克隆當前元素本身 true:克隆當前元素以及他的后代
var obj = document.createElement('div'); //=> 創(chuàng)建一個div
obj.id = 'obj1'; //=> 添加id
obj.className = 'obj2'; //=> 添加className
document.appendChild(obj); //=> 把它添加到頁面中
document.inserBefore(obj.box); //=> 把新元素obj添加到box之前
//移除一個元素
document.當前容器.removeChild(要刪除的元素)
元素.parentNode.removeChild(元素)
var 元素 = 要克隆的元素.cloneNode();
document.body.appendChild(元素);
獲取html元素
找到的內(nèi)容使用單引號擴起來
- getElementById: 通過指定的id獲得元素 1個
- getElementByName: 通過元素名稱name屬性獲得元素 1組
- getElementByTagName: 通過標簽名稱獲得元素 1組
innerHTML: 獲取和替換HTML元素的內(nèi)容
- object.innerHTML區(qū)分大小寫
- 只是object.innerHTML的時候是元素的內(nèi)容
- object.innerHTML = “新的內(nèi)容” 改變內(nèi)容
innerText: 設置元素的文本顯示
obj.innerText= "haha"
改變HTML樣式
- Object(轉(zhuǎn)換的對象).style.property(要改變的屬性)=new style(新的屬性);
Var mr = document.getElementById(“aa”);
———找到對象
Mr.style.color=“red”;
——改變樣式內(nèi)容的顯示和隱藏display
object.style.display = value;
none(隱藏) block(顯示塊級)控制類名
object.className = newclassname;
-- 設置一個元素的類名
解決選項卡的三種方式
- 閉包
- 自定義屬性
- ES6 let定義
JavaScript事件
事件是可以被js檢測到的行為 事件可以是瀏覽器行為是嗜,也可以是用戶行為
- 通過行內(nèi)綁定的事件只能綁定一個事件
div.onclick = function(event){方法體};
this指向的是dom元素本省div.addEventListener('事件名','function(){},false);
先通過getElement找到元素然后綁定一個事件,也可以綁定多個事件 this指向的是dom元素本省
鼠標事件
- 鼠標單擊事件:
onclick="方法";
- 鼠標雙擊事件:
ondblclick="方法";
- 鼠標按下事件:
onmousedown="方法";
- 鼠標抬起事件:
onmouseup="方法";
- 鼠標移入事件:
onmouseover="方法";
會冒泡挺尾,其后面的元素也會觸發(fā)事件onmouseenter="方法";
- 鼠標移開事件:
onmouseout="方法";
onmouseleave="方法";
- 鼠標點擊右鍵的事件:
oncontextmenu="方法";
鍵盤事件
- 鍵盤按鍵按下事件:
onkeydown="方法";
- 鍵盤按鍵抬起事件:
onkeyup="方法";
- 鍵盤按鍵按下并抬起事件:
onkeypress="方法";
- event.keyCode = 鍵盤按下的時候?qū)哪莻€碼
表單事件
- 光標聚焦事件:
onfocus="方法";
- 光標失焦事件:
onblur="方法";
- 內(nèi)容選中事件:
onselect="方法";
- 內(nèi)容改變事件:
onchange="方法";
- 表單提交時觸發(fā):
onsubmit="方法";
- 表單重置時觸發(fā):
onreset="方法";
- 元素獲取輸入觸發(fā):
oninput="方法";
- 拷貝內(nèi)容時觸發(fā):
oncopy="方法";
- 剪切內(nèi)容時觸發(fā):
oncup="方法";
- 粘貼內(nèi)容時觸發(fā):
onpaste="方法";