javascript 高級(jí)程序設(shè)計(jì)
在HTML中使用javascript
1劲阎、<script> 元素
(1) async 可選 應(yīng)該立即下載腳本,但不影響頁面的其他操作(只對(duì)外部腳本有效)
(2) charset 可選 通過src屬性指定代碼的字符集
(3) defer 可選 腳本可以延遲到文檔完全別解析和顯示之后執(zhí)行(只對(duì)外部腳本有效)
(4) language 廢棄
(5) src 可選 包含執(zhí)行代碼的外部文件
(6) type 可選 編寫代碼使用的腳本語言的內(nèi)容類型
引入方式
(1)直接在頁面中嵌入 只需為<script>指定type屬性
(2)使用外部文件 src 屬性必須指出 外部文件可以是與包含頁面位于同一個(gè)服務(wù)器文件极阅,也可以是其他任何域中的文件 優(yōu)點(diǎn):可維護(hù) 可緩存 適應(yīng)未來
執(zhí)行順序
從上到下依次被解析
1.1敢靡、標(biāo)簽位置
body 最下面 </body>前面
1.2颠通、延遲腳本 最佳方案:頁面底部
1.3麻削、異步腳本 不要在加載期間修改dom
基本概念
語法
數(shù)據(jù)類型
流程控制語句
函數(shù)
1、 語法
1.1 區(qū)分大小寫
1.2 標(biāo)識(shí)符 變量 函數(shù) 屬性的名字 函數(shù)的參數(shù) 不能把關(guān)鍵字岩齿、保留字、true苞俘、false纯衍、null 用作標(biāo)識(shí)符
第一個(gè)字符必須是一個(gè)字母、下劃線(_)苗胀、或美元符號(hào)($)
其他字符可是字母 下劃線 美元符號(hào) 數(shù)字
最佳 ** 駝峰大小寫 **
1.3 注釋
單行注釋
/* /
多行注釋
/
*
*
*/
1.4 嚴(yán)格模式
use strict
1.5 語句
以分號(hào)結(jié)尾
2、關(guān)鍵字和保留字
關(guān)鍵字 表示控制語句的開始和結(jié)束或用于執(zhí)行特定的操作
保留字 導(dǎo)致“Identifier Expected” 錯(cuò)誤
3瓦堵、變量
松散類型
定義變量 var a (變量名) 未初始化 undefined ==>var 定義一個(gè)變量在函數(shù)退出后就會(huì)被銷毀
var a = 1 ,b = true , c = "hello world";
4基协、數(shù)據(jù)類型
5種基本數(shù)據(jù)類型 undefined null boolean number string
1復(fù)雜數(shù)據(jù)類型 object
typeof 操作符來檢測(cè)
object 這個(gè)值可能是對(duì)象或者null
1.undefined 只有一個(gè)值 未初始化
2.null 第二個(gè)只有一個(gè)值的數(shù)據(jù)類型 表示一個(gè)空對(duì)象指針
3.Boolean === true false 區(qū)分大小寫
4.number 整數(shù)和浮點(diǎn)數(shù)
NaN 任何涉及到NaN的操作都會(huì)返回NaN NaN與任何值都不相等
數(shù)值轉(zhuǎn)換
Number() 用于任何數(shù)據(jù)類型
true false ==》 1 0
數(shù)字值
null ==》 0
undefined ==> NaN
string 只包含數(shù)字 ==》 十進(jìn)制
包含浮點(diǎn) ==》 浮點(diǎn)數(shù)值
十六進(jìn)制 ==》 十進(jìn)制
空 ==》 0
以外 ==> NaN
object valueOf() toString()
parseInt()
如果第一個(gè)字符不是數(shù)字會(huì)符號(hào) ==》NaN
空字符串 ==》0
不具有解析八進(jìn)制的能力
parseFloat() 解析到一個(gè)無效的浮點(diǎn)字符為止 只解析十進(jìn)制
5.string
"" ''
轉(zhuǎn)換為字符串 toString()
String() null ==》null undefined ==>undefined
6.Object 一組數(shù)據(jù)和功能的集合
constructor 保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)
hasOwnProperty 檢查給定的屬性在當(dāng)前對(duì)象實(shí)例中是否存在
isPrototypeOf 檢查傳入的對(duì)象是否是當(dāng)前對(duì)象的原型
propertyIsEnumerable 檢查給定的屬性是否能夠使用for-in 語句來枚舉
toLocaleString 返回對(duì)象的字符串表示 該字符串與執(zhí)行環(huán)境的地區(qū)對(duì)應(yīng)
toString 返回對(duì)象的字符串表示
valueOf 返回的字符串 數(shù)值 布爾 表示 與toString 返回值相同
5、操作符
一元操作符 操作一個(gè)值
遞增遞減
一元加減 “+“ 只是進(jìn)行轉(zhuǎn)換 ”-“ 進(jìn)行轉(zhuǎn)化的同時(shí)也進(jìn)行計(jì)算
位操作符 有符號(hào)整數(shù) 無符號(hào)整數(shù)
布爾操作符
菇用! & ||
乘性操作符
* /
加性操作符
+ -
關(guān)系操作符
< > <= >=
相等操作符
== !=
=== !==
條件操作符
條件表達(dá)式
賦值運(yùn)算符
=
逗號(hào)操作符
,
6澜驮、語句
if 語句
do-while
while
for
for-in 枚舉對(duì)象的屬性
es6 增加for of
lable 添加標(biāo)簽
break continue 控制循環(huán)中的代碼執(zhí)行
whth 將代碼的作用域設(shè)置到一個(gè)特定的對(duì)象中
switch
7、函數(shù) function
調(diào)用函數(shù)
return 非必須 (1) 返回值 (2)結(jié)束函數(shù)
理解參數(shù)
ECMAScript 中的參數(shù)在內(nèi)部是用一個(gè)數(shù)組來表示 通過arguments對(duì)象來訪問這個(gè)參數(shù)數(shù)組(并沒有數(shù)組實(shí)例) length 屬性
命名的參數(shù)只提供便利 但不是必需的
arguments可以與命名參數(shù)一起使用 值與對(duì)應(yīng)的命名參數(shù)的值保持同步
變量 作用域 和內(nèi)存
變量 基本類型值 簡單的數(shù)據(jù)段
引用類型值 可能由多個(gè)值構(gòu)成的對(duì)象
引用類型的值中的屬性可以是基本類型也可以是引用類型
引用 可以動(dòng)態(tài)的添加屬性 基本類型不可以
特點(diǎn):
基本類型值在內(nèi)存中占據(jù)固定大小的空間惋鸥,因此被保存在棧內(nèi)存中杂穷。
從一個(gè)變量向另一個(gè)變量復(fù)制基本類型的值,會(huì)創(chuàng)建這個(gè)值的副本卦绣,
引用類型的值是對(duì)象耐量,保存在堆內(nèi)存中,
包含引用類型值的變量實(shí)際上包含的并不是對(duì)象本身滤港,而是一個(gè)指向該對(duì)象的指針廊蜒,
從一個(gè)變量向另一個(gè)變量復(fù)制引用類型的值,復(fù)制的其實(shí)是指針溅漾,因此兩個(gè)變量最終指向同一個(gè)對(duì)象山叮。
傳遞參數(shù)
所有函數(shù)的參數(shù)按值傳遞,也就是說 把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù)添履,就和把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣屁倔。
檢測(cè)類型
typeof 只能檢測(cè)5種 string number undefined boolean object
instanceof 檢測(cè)引用類型的值
* 使用typeof時(shí),function規(guī)范要求返回‘function’,但是在firfox以及ie的某些版本中會(huì)返回‘object’.
* ES6中新增加了一個(gè)類型‘Symbol’暮胧,使用typeof檢測(cè)這個(gè)類型時(shí)會(huì)返回'Symbol'锐借。
* ES6中新增的Set,Map叔壤,使用typeof檢測(cè)時(shí)會(huì)返回'object'瞎饲。
執(zhí)行環(huán)境
每一個(gè)執(zhí)行環(huán)境都有一個(gè)與之關(guān)聯(lián)的變量對(duì)象
全局執(zhí)行環(huán)境 Window
代碼執(zhí)行完畢 該環(huán)境也被銷毀 保存在其中的所有變量和函數(shù)定義也隨之銷毀
函數(shù)執(zhí)行環(huán)境
每一個(gè)函數(shù)都有自己的執(zhí)行環(huán)境。當(dāng)執(zhí)行流進(jìn)入一個(gè)函數(shù)時(shí)炼绘,函數(shù)的環(huán)境就會(huì)被推入到一個(gè)環(huán)境棧中嗅战。而在函數(shù)執(zhí)行之后,棧彈出。把控制權(quán)返回給之前的執(zhí)行環(huán)境驮捍。
當(dāng)代碼在一個(gè)環(huán)境中執(zhí)行疟呐,會(huì)創(chuàng)建變量對(duì)象的一個(gè)作用域鏈
用途:保證執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。
在局部作用域中定義的變量可以在局部環(huán)境中與全局變量互換使用东且。
內(nèi)部環(huán)境可以通過作用域鏈訪問所有的外部環(huán)境启具,但外部環(huán)境不能訪問內(nèi)部環(huán)境中的任何變量和函數(shù),這些環(huán)境之間的聯(lián)系是線性的珊泳、有次序的鲁冯。
引用類型
引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起
對(duì)象是某個(gè)特定引用類型的實(shí)例色查,新對(duì)象是使用new 操作符后跟一個(gè)構(gòu)造函數(shù)來創(chuàng)建
object
創(chuàng)建object的兩種方式
一薯演、new 操作符
var person = new Object();
person.name = "smy";
person.age = 18;
二、對(duì)象字面量
var person = {
name:"smy",
age:18
}
訪問對(duì)象屬性時(shí)使用都是 . 也可以使用方括號(hào)
alert(person["name"]) 優(yōu)點(diǎn):可以通過變量來訪問屬性
alert(person.name)
array
創(chuàng)建數(shù)組的兩種方式
一秧了、使用Array構(gòu)造函數(shù)
var books = new Array();
或者 var books = new Array("js","css","html")
也可以省略 new
二跨扮、數(shù)組字面量表示法
var books = ["html","css","js"]
索引 只能使用數(shù)字
alert(books[0]);
books[1] = "jquery";
length 不是只讀 可改變
檢測(cè)數(shù)組
Array.isArray()
轉(zhuǎn)換方法
toLocaleString()、toString()验毡、valueOf()
棧方法
push() 尾部增加 并返回修改后數(shù)組的長度
pop() 尾部移除 減少數(shù)組的length 返回移除項(xiàng)
隊(duì)列方法
unshift() 前邊添加任意項(xiàng)衡创,并返回新數(shù)組的長度
shift() 移除數(shù)組的第一個(gè)并返回該項(xiàng) 數(shù)組長度- 1
重新排序方法
reverse() 翻轉(zhuǎn)
sort() 升序
操作方法
concat() 基于當(dāng)前數(shù)組中的所有項(xiàng)創(chuàng)建一個(gè)新的數(shù)組
slice() 接受一個(gè)或兩個(gè)參數(shù) 即 起始 結(jié)束位置 但不包括結(jié)束位置的項(xiàng)。
splice()
作用: 刪除 splice(0,2) 刪除數(shù)組中的前兩項(xiàng)
插入 splice(0,2,"red","blue") 從第二個(gè)插入
替換 splice(2,1,"red","blue") 刪除當(dāng)前數(shù)組位置2的項(xiàng)晶通,從位置2插入字符串璃氢。
最終返回一個(gè)數(shù)組,該數(shù)組包含從原始數(shù)組中刪除的項(xiàng)(如果沒有 返回空數(shù)組)
位置方法
接受兩個(gè)參數(shù) 1.要查找項(xiàng)(要求嚴(yán)格相等) 2狮辽、查找起點(diǎn)位置的索引(可選)
返回要查找的項(xiàng)在數(shù)組中的位置拔莱,沒有找到返回 -1
indexOf() 從開頭開始查找
lastIndexOf() 從末尾開始查找
迭代方法
5種 接受兩個(gè)參數(shù) 1.要在每一項(xiàng)上運(yùn)行的函數(shù) 2.運(yùn)行該函數(shù)的作用域?qū)ο?--影響this的值(可選)
傳入這些方法中的函數(shù)都會(huì)接受三個(gè)參數(shù) 數(shù)組項(xiàng)的值、該項(xiàng)在數(shù)組中的位置隘竭、數(shù)組對(duì)象本身塘秦。
every() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回true动看,則返回true
filter() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)尊剔,返回該函數(shù)會(huì)返回true的項(xiàng)組成的數(shù)組
forEach() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),沒有返回值
map() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)菱皆,返回每次函數(shù)條用的結(jié)果組成的數(shù)組
some() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)须误,如果該函數(shù)對(duì)任一項(xiàng)返回true 則返回true。
歸并方法
迭代所有項(xiàng)仇轻,然后構(gòu)建一個(gè)最終返回值
reduce() 從第一項(xiàng)開始 逐個(gè)遍歷
reduceRight() 最后一項(xiàng)
接受兩個(gè)參數(shù) 1.在每一項(xiàng)上調(diào)用的函數(shù) 2.作為歸并基礎(chǔ)的初始值(可選)
函數(shù)接受4個(gè)參數(shù) 前一個(gè)值京痢、當(dāng)前值、項(xiàng)的索引篷店、數(shù)組對(duì)象
返回值都會(huì)作為第一個(gè)參數(shù)自動(dòng)傳給下一項(xiàng)祭椰。
Date
var now = new Date()
Date.parse()
Date.UTC() 返回表示日期的毫秒數(shù)
Date.now() 調(diào)用這個(gè)方法時(shí)的日期和時(shí)間毫秒數(shù)
var start = Date.now(); 如果瀏覽器不支持 var start = + new Date();
doSomething();
var stop = Date.now(),
result = stop - start;
繼承的方法
在不同的瀏覽器中返回的日期和時(shí)間格式不同
日期格式化方法
toDateString() 以特定于實(shí)現(xiàn)的格式展示星期臭家、月、日方淤、年 (瀏覽器而異)
toTimeString() 時(shí)分秒地區(qū)
toLocaleDateString() 特定地區(qū)的 (瀏覽器而異)
toLocaleTimeString() 特定地區(qū)的
toUTCString() 特定于實(shí)現(xiàn)的格式完整的UTC日期
時(shí)間組件的方法
钉赁。。携茂。
RegExp
g 全局
i 不區(qū)分大小寫
m 多行
es6增加了 y u 兩個(gè)標(biāo)志符
元字符需要轉(zhuǎn)義 ( [ { \ ^ $ } ] ) ? * + .
創(chuàng)建方式
一你踩、字面量
var pattern = /[bc] at /i
二、RexExp構(gòu)造函數(shù) 接受兩個(gè)參 數(shù) 1.匹配的字符串的模式 2.可選標(biāo)志符串讳苦。
var pattern2 = new RexExp("[bc]at","i")
實(shí)例方法
exec() 專門捕獲組設(shè)計(jì) 接受一個(gè)參數(shù) 返回包含第一個(gè)匹配項(xiàng)信息的數(shù)組
test() 接受一個(gè)字符串參數(shù) 匹配 true 否則 false
Function
每一個(gè)函數(shù)都是function 的實(shí)例 而且都與其他引用類型一樣具有屬性和方法
函數(shù)是對(duì)象带膜,因此函數(shù)名實(shí)際上也是一個(gè)指向函數(shù)對(duì)象的指針。
函數(shù)通常使用函數(shù)聲明語法定義的
function sum (num1,num2){
return num1+ num2
}
函數(shù)表達(dá)式定義函數(shù)
var sum = function(num1,num2){
return num1+ num2
}
使用Function構(gòu)造函數(shù)
var sum = new Function("num1","num2","return num1 + num2") 不推薦
一個(gè)函數(shù)可能會(huì)有多個(gè)名字
沒有重載 將函數(shù)想象指針
第二個(gè)函數(shù)實(shí)際上覆蓋了上一個(gè)函數(shù)
函數(shù)聲明與函數(shù)表達(dá)式
先讀取函數(shù)聲明鸳谜,并使其在執(zhí)行任何代碼之前可用钱慢,表達(dá)式必須等到解析器執(zhí)行到它所在的代碼執(zhí)行,才會(huì)真正執(zhí)行卿堂。
作為值的函數(shù)
函數(shù)名本身就是變量,函數(shù)也可以作為值來使用懒棉。也就是說草描,不僅可以將像傳遞參數(shù)一樣吧一個(gè)函數(shù)傳遞給另一個(gè)函數(shù),也可以將函數(shù)作為另一個(gè)函數(shù)的結(jié)果返回策严。
內(nèi)部屬性
arguments
類數(shù)組對(duì)象穗慕,包含傳入函數(shù)中的所有參數(shù)
callee屬性,是一個(gè)指針妻导,指向擁有這個(gè)arguments對(duì)象的函數(shù)
this 引用的是函數(shù)執(zhí)行的環(huán)境對(duì)象---或者說是this的值
函數(shù)的名字僅僅是一個(gè)包含指針的變量而已逛绵。
caller 保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用,如果全局作用域中調(diào)用當(dāng)前函數(shù)倔韭,他的值為null
屬性和方法
length 表示函數(shù)希望接收的命名函數(shù)參數(shù)的個(gè)數(shù)
prototype 保存他們所有實(shí)例方法的真正所在术浪,不可枚舉,for-in無法發(fā)現(xiàn)
在特定的作用域中調(diào)用函數(shù)寿酌,實(shí)際上等于設(shè)置函數(shù)體內(nèi)this對(duì)象的值
apply() 接收兩個(gè)參數(shù) 一個(gè)是在其中運(yùn)行函數(shù)的作用域 另一個(gè)參數(shù)數(shù)組(可以是array實(shí)例胰苏,也可以說是arguments對(duì)象
call() 作用類似apply()區(qū)別在于 ,傳遞給函數(shù)的參數(shù)必須逐個(gè)列舉出來
bind() 創(chuàng)建一個(gè)函數(shù)的實(shí)例醇疼,其this會(huì)被綁定到傳給bind()函數(shù)的值硕并。
基本包裝類型 Boolean Number String
與引用類型的區(qū)別,對(duì)象的生存期
Boolean
與引用類型的布爾區(qū)別 1.typeof 基本類型==》boolean
引用類型==》object
2.Boolean對(duì)象是Boolean類型的實(shí)例 instanceof ==>true
c測(cè)試基本類型布爾返回false
Number
toFixed() 按照指定的小數(shù)位返回?cái)?shù)值的字符串
toExponential() 返回以指數(shù)表示法秧荆,表示的數(shù)值的字符串形式
String
字符方法
charAt() 以單字符字符串的形式返回給定位置的那個(gè)字符
charCodeAt() 字符編碼
字符串的方法
concat() 用于將一或多個(gè)字符串拼接起來倔毙,返回拼接得到的新字符串
slice()
substr()
substring()
字符串位置的方法
indexOf()
lastIndexOf()
trim()方法
創(chuàng)建一個(gè)字符串的副本,刪除前置及后綴的所有空格乙濒,然后返回結(jié)果陕赃。
字符串大小寫轉(zhuǎn)換
toLowerCase()
toLocaleLowerCase() 特定地區(qū)
toUpperCase()
toLocaleUpperCase() 特定地區(qū)
字符串的模式匹配方法
match() 接受一個(gè)參數(shù) 表達(dá)式or RegExp對(duì)象 返回一個(gè)數(shù)組
search() 返回字符串中的第一個(gè)匹配項(xiàng)的索引 沒有 返回 -1 從頭開始查
localeCompare() 比較兩個(gè)字符串并返回 下列值中的一個(gè):
a 在 b 之前 -1
a = b 0
a 在 b 之后 1
forCharCode() 接受一個(gè)或者多個(gè)字符編碼
HTML 方法
單體內(nèi)置對(duì)象
Globle 對(duì)象 不屬于其他 對(duì)象的屬性和方法,最終都是它的屬性和方法
URL 編碼
eval() 方法
globle對(duì)象的屬性
Windows對(duì)象
Math對(duì)象
min()
max()
舍入方法
Math.ceil() 向上舍入
Math.floor() 向下舍入
Math.round() 向標(biāo)準(zhǔn)舍入
random() 返回大于等于0 小魚1 的一個(gè)隨機(jī)數(shù)
公式:值 = Math.floor(Math.random() * 可能值的總數(shù) + 第一個(gè)可能的值)
其他方法
Math.abs(num) 絕對(duì)值 、冪次方凯正、對(duì)數(shù)毙玻、平方根......
面向?qū)ο蟮某绦蛟O(shè)計(jì)
無序?qū)傩缘募希鋵傩钥梢园局道壬ⅲ瑢?duì)象或者函數(shù)
理解對(duì)象
屬性類型
數(shù)據(jù)屬性
[[Configurable]]
[[Enumerable]]
[[Writable]]
[[Value]]
Object.defineProperty() 接受三個(gè)參數(shù) 屬性所在的對(duì)象桑滩、屬性的名字、一個(gè)描述符對(duì)象
訪問器屬性
getter允睹、setter
[[Configurable]]
[[Enumerable]]
[[Get]] 讀取
[[Set]] 寫入
不能直接定義 必須使用Object.defineProperty()來定義
定義多個(gè)屬性
Object.defineProperties() 接受兩個(gè)對(duì)象參數(shù) 1.添加和修改其屬性的對(duì)象 2.對(duì)象的屬性與第一個(gè)對(duì)象中要添加或修改的屬性一一對(duì)應(yīng)运准。
讀取屬性的特性
Object.getOwnPropertyDescriptor() 去的給定屬性的描述符
屬性所在的對(duì)象和要讀取其描述符的屬性名稱
創(chuàng)建對(duì)象
對(duì)象可以在代碼執(zhí)行過程中創(chuàng)建和增強(qiáng),因此具有動(dòng)態(tài)性而非嚴(yán)格定義的實(shí)體缭受。
工廠模式
解決多個(gè)相似對(duì)象的問題胁澳,但未解決對(duì)象識(shí)別的問題。
構(gòu)造函數(shù)模式
構(gòu)造函數(shù)始終以一個(gè)大寫字母開頭米者,非構(gòu)造函數(shù)則應(yīng)該以一個(gè)小寫字母開頭
使用new 操作符韭畸,步驟
1.創(chuàng)建一個(gè)新對(duì)象
2.將構(gòu)造函數(shù)的作用域賦給新對(duì)象(因此this指向這個(gè)新對(duì)象)
3.執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對(duì)象添加屬性)
4.返回新對(duì)象
將構(gòu)造函數(shù)當(dāng)做函數(shù)
區(qū)別:調(diào)用他們的方式不同,只要通過new操作符來調(diào)用的蔓搞,那么他就可以作為構(gòu)造函數(shù)胰丁。
缺點(diǎn):每一個(gè)方法都要在每一個(gè)實(shí)例上重新創(chuàng)建一遍。
原型模式
每一個(gè)函數(shù)都有一個(gè)prototype(原型)屬性喂分,這個(gè)屬性是一個(gè)指針锦庸,指向一個(gè)對(duì)象,這個(gè)對(duì)象的用途是包含可以由特定類型的所有實(shí)例共享的屬性和方法蒲祈。
構(gòu)造函數(shù)與原型的組合
構(gòu)造函數(shù)用于定義實(shí)例屬性甘萧,原型用于定義方法和共享的屬性
動(dòng)態(tài)原型模式
把所有的信息封裝在構(gòu)造函數(shù),而通過在構(gòu)造函數(shù)中初始化緣溪行梆掸,又保持同時(shí)使用構(gòu)造函數(shù)和原型的優(yōu)點(diǎn)扬卷。
寄生構(gòu)造函數(shù)
創(chuàng)建一個(gè)函數(shù),這個(gè)函數(shù)的作用僅僅是封裝創(chuàng)建對(duì)象的代碼酸钦,然后再返回新創(chuàng)建的對(duì)象邀泉。
穩(wěn)妥構(gòu)造函數(shù)
新創(chuàng)建對(duì)象的實(shí)例方法不引用this,不使用new操作符調(diào)用函數(shù)。
繼承
接口繼承 實(shí)現(xiàn)繼承
原型鏈
構(gòu)建:是通過將一個(gè)類型的實(shí)例賦值給另一個(gè)構(gòu)造函數(shù)的原型實(shí)現(xiàn)的钝鸽。
這樣子類型就能夠訪問超類型的所有屬性和方法汇恤。
利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。
如果確定原型和實(shí)例的關(guān)系
1.instanceof操作符
2.isPrototypeOf()
謹(jǐn)慎定義方法
給原型添加方法的代碼一定要放在替換原型的語句之后拔恰。
通過原型鏈繼承時(shí)因谎,不能使用對(duì)象字面量創(chuàng)建原型方法。
借用構(gòu)造函數(shù)
call()
apply()
在將來新創(chuàng)建的對(duì)象上執(zhí)行構(gòu)造函數(shù)颜懊。
組合繼承
使用原型鏈實(shí)現(xiàn)對(duì)原型屬性方法的繼承财岔,而通過借用構(gòu)造函數(shù)來實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承风皿。
原型式繼承
基于已有的對(duì)象創(chuàng)建新對(duì)象,不必印尼次創(chuàng)建自定義類型匠璧。
寄生式繼承
創(chuàng)建一個(gè)僅用于封裝繼承過程的函數(shù)桐款,該函數(shù)內(nèi)部以某種方式來增強(qiáng)對(duì)象,最后再像真的是它做了所有的工作一樣返回對(duì)象夷恍。
寄生組合式繼承 (最有效的方式)
函數(shù)表達(dá)式
特點(diǎn):
不同于函數(shù)聲明魔眨,函數(shù)聲明要求必須有名字,但表達(dá)式不用酿雪,沒有名字的表達(dá)式也叫匿名函數(shù)遏暴。
定義函數(shù)的兩種
1.函數(shù)聲明
函數(shù)聲明提升
在執(zhí)行代碼之前會(huì)先讀取函數(shù)聲明。
sayHi()
function sayHi(){
alert("hi");
}
2.函數(shù)表達(dá)式
必須先賦值才能使用
var functionName = function(arg0,arg1,arg2){
函數(shù)體
}
遞歸
使用回調(diào)提升性能指黎。
通過使用argument.callee代替函數(shù)名朋凉,確保無論怎樣調(diào)用函數(shù)都不會(huì)出問題。
閉包
有權(quán)訪問另一個(gè)函數(shù)作用域中的變量函數(shù)醋安。
創(chuàng)建閉包的方式:在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù)
當(dāng)某個(gè)函數(shù)調(diào)用的杂彭,會(huì)創(chuàng)建一個(gè)執(zhí)行環(huán)境,以及相應(yīng)的作用域鏈吓揪,然后亲怠,使用arguments和其他命名參數(shù)的值來初始化函數(shù)的活動(dòng)對(duì)象。但在作用域鏈中磺芭,外部函數(shù)的活動(dòng)對(duì)象始終處于第二位,外部函數(shù)的外部函數(shù)的活動(dòng)對(duì)象處于第三位醉箕,....直至為作用域鏈終點(diǎn)的全局執(zhí)行環(huán)境钾腺。
作用域鏈的本質(zhì)是一個(gè)指向變量對(duì)象的指針列表,它只引用但不實(shí)際包含變量對(duì)象讥裤。
閉包與變量
閉包保存所保存的是整個(gè)變量的對(duì)象放棒,而不是某個(gè)特殊的變量。
this
this對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的
在全局中 this 等于Window己英、
當(dāng)作位某個(gè)對(duì)象方法調(diào)用時(shí)间螟,this等于那個(gè)對(duì)象。
匿名函數(shù)的執(zhí)行環(huán)境具有全局性损肛,通常執(zhí)行window
this與argument存在同樣的問題厢破,如果想訪問作用域中的argument 對(duì)象,必須將該對(duì)象的引用保存到另一個(gè)閉包能訪問的變量中治拿。
var name = "The window"
var object = {
name : "My Object",
getNameFunc :function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
內(nèi)存泄漏
模仿塊級(jí)作用域
塊語句中定義變量摩泪,實(shí)際上是在包含函數(shù)中而非語句中創(chuàng)建的。
function Number(count){
for(var i = 0;i < count;i++){
alert(i)
}
alert(i) //計(jì)數(shù)
}
function Number(count){
for(var i = 0;i < count;i++){
alert(i)
}
var i;//重新聲明變量
alert(i) //計(jì)數(shù)
}
在es6 中有所改變劫谅, let i ; 不可在同一作用域中见坑,多次聲明
(function(){
//這里是塊級(jí)作用域
})()
立即執(zhí)行函數(shù)嚷掠。
私有變量
任何在函數(shù)中定義的變量,都可以認(rèn)為是私有變量荞驴,因?yàn)椴荒茉诤瘮?shù)外部訪問這些變量
私有變量包括:函數(shù)的參數(shù)不皆,局部變量和在函數(shù)內(nèi)部定義的其他函數(shù)。
function add(num1,num2){
var sum = num1 + num2;
return sum;
}
靜態(tài)私有變量
初始化未經(jīng)聲明的變量熊楼,總是會(huì)創(chuàng)建一個(gè)全局變量
在嚴(yán)格模式下霹娄,給未經(jīng)聲明的變量賦值會(huì)導(dǎo)致錯(cuò)誤。
模塊模式 為單例 (只有一個(gè)實(shí)例的對(duì)象)創(chuàng)建私有變量和特權(quán)方法孙蒙。
增強(qiáng)的模塊模式 適合單例必須是某種類型的實(shí)例项棠,同時(shí)還必須添加某些屬性和伙房對(duì)其加以增強(qiáng)的情況。
BOM 瀏覽器對(duì)象模型
1.window 對(duì)象
BOM 的核心對(duì)象 window挎峦,它表示一個(gè)瀏覽器的實(shí)例
全局作用域
1.window對(duì)象同時(shí)扮演著 ECMScript 中的Global 對(duì)象角色, 因此全局聲作用域中的聲明的變量香追、函數(shù)都會(huì)變成window對(duì)象的屬性和方法。
2.全局變量不能通過delete刪除坦胶,而直接在window對(duì)象上定義的屬性和方法透典。
3.嘗試訪問未聲明的變量會(huì)拋出錯(cuò)誤,但是可以通過window對(duì)象顿苇,可以知道未聲明的變量是否存在峭咒。
var age = 20;
function sayAge(){
alert(this.age)
}
alert(window.age) //29
sayAge() //29
window.sayAge() //29
窗口關(guān)系及框架
保存在frames 集合中
top指向最高(最外)層的框架,也就是瀏覽器窗口纪岁。
parent始終指向當(dāng)前框架的直接上層框架凑队。 有可能與等于top
窗口的位置
ie safari opear chrome 提供 screenLeft/screenTop 表示窗口相對(duì)于屏幕左方的和上方的位置。
firefox screenX/y
moveTo()
moveBy()
窗口大小
ie9+ safari opear chrome firefox innerWidth/innerHeight(opear幔翰,頁面視區(qū)大小漩氨,減去邊框) outerWidth/outHeight(ie9+ safari firefox 返回本身尺寸)
通過doucument.documentElement.clientWidth/Height 保存頁面視口的信息
導(dǎo)航和打開窗口
window.open()導(dǎo)航到一個(gè)特定的url,也可以打開一個(gè)新的瀏覽器窗口,接受四個(gè)參數(shù)1.要加載的URL遗增,窗口目標(biāo)叫惊,一個(gè)特性字符串,一個(gè)新頁面是否取代瀏覽器歷史記錄中當(dāng)前加載頁面的布爾值做修。
間歇調(diào)用和超時(shí)調(diào)用
setTimeout() 接受兩個(gè)參數(shù) 1.要執(zhí)行的代碼 以毫秒表示的時(shí)間霍狰。 返回一個(gè)id,表示超時(shí)調(diào)用饰及。
clearTimeout()
setInterval() 返回一個(gè)id 用于將來某個(gè)時(shí)間取消間歇調(diào)用
系統(tǒng)對(duì)話框
alert()
confim()
prompt()
2.location 對(duì)象
提供了與當(dāng)前窗口中加載的文檔有關(guān)的信息蔗坯,還有一些導(dǎo)航功能。
它既是window對(duì)象的屬性燎含,也是document的屬性步悠。
用處:不僅只表現(xiàn)在它保存著當(dāng)前文檔的信息,還表現(xiàn)在它將URL解析為獨(dú)立的片段瘫镇, 讓開發(fā)人員可以通過不同的屬性訪問這些片段鼎兽。
2.1 查詢字符串參數(shù)
function getStringArgs(){
var qs = (location.search.length > 0 ? location.search.substring(1):""), //去掉查詢字符串開頭的問號(hào)
args = {},
items = qs.length ? qs.split("&") : [],//分割字符串答姥,并返回name = vaule格式的字符串?dāng)?shù)組。
item = null,
name = null,
value = null,
i = 0,
len = items.length;
for( i = 0; i < len;i++){
item = items[i].split("="); //根據(jù) = 分割每一項(xiàng)谚咬。
第一項(xiàng)為參數(shù)名鹦付,第二項(xiàng)為參數(shù)值的數(shù)組。
name = decodeURLComponent(item[0]);
value = desodeURLComponent(item[1]);
//分別解碼name 和 value
if(name.length){
args[name] = value;// name作為args對(duì)象的屬性择卦,value作為相應(yīng)屬性的值
}
}
return args;
}
2.2 位置操作
改變?yōu)g覽器的位置:assign()方法并為其傳遞一個(gè)URL
location.assigin("http://www.baidu.com")
等同于:window.location = "http://baidu.com"
location.
禁用“后退按鈕” 使用replace()方法 只接受一個(gè)參數(shù)敲长,url,結(jié)果雖然會(huì)導(dǎo)致瀏覽器位置的改變,但不會(huì)在歷史記錄中生成新的記錄秉继。
reload() 重新加載當(dāng)前顯示的頁面祈噪。
3.navigator 對(duì)象
3.1 檢測(cè)插件
非ie瀏覽器 plugins數(shù)組達(dá)到這個(gè)目的
name:插件的名稱
description:插件的描述
filename:插件的中文名
length:插件所處理的MIME類型的數(shù)量
3.2 注冊(cè)處理程序
4.screen 對(duì)象
基本上只用來表明客戶端的能力,瀏覽器窗口外部的顯示器的信息尚辑,如像素寬度和高度
5.history 對(duì)象
用來保存上網(wǎng)的歷史記錄辑鲤,從窗口被打開的那一刻起算。
使用go()方法可以在用戶的歷史記錄中任意跳轉(zhuǎn)杠茬,可以向前也可以向后月褥。接受一個(gè)參數(shù),history(-1)//后退
history(1/2) //前進(jìn)一頁/兩頁
也可以傳一個(gè)字符串參數(shù)
history.go("wrox.com") //跳轉(zhuǎn)到最近的wrox.com頁面
可以用back() 和 forward() 來代替
客戶端檢測(cè)
1.能力檢測(cè)
檢測(cè)的目標(biāo)不是識(shí)別特定的瀏覽器瓢喉,而是識(shí)別瀏覽器的能力
if(object.propertyInQuestion) {
//使用object.propertyInQuestion
}
1.1 更可靠的能力檢測(cè)
想知道某個(gè)特性是否會(huì)按照適當(dāng)?shù)姆绞叫惺隆? 1.2 能力檢測(cè)宁赤,不是瀏覽器檢測(cè)
2.怪癖檢測(cè)
識(shí)別瀏覽器的特殊行為 想知道瀏覽器存在什么缺陷(bug)
var hasDontEnumQuirk = function (){
var o = { toString :function()*{} };
for( var prop in o){
if(prop == "toString"){
return false;
}
}
return true;
} ();
3.用戶代理檢測(cè)
通過檢測(cè)用戶代理字符串來確定實(shí)際使用的瀏覽器。
在每一次http請(qǐng)求過程中栓票,用戶代理字符串是作為響應(yīng)首部發(fā)送的,而且該字符串可以通過js的navigator.userAgent屬性訪問走贪。
DOM 文檔對(duì)象模型
DOM 描繪了一個(gè)層次化的節(jié)點(diǎn)樹佛猛,允許開發(fā)人員添加、移除厉斟、和修改頁面的某一部分挚躯。
1.節(jié)點(diǎn)層次
對(duì)層次强衡、多類型
節(jié)點(diǎn)分為幾種不同的類型擦秽,每種類型分別表示文檔中不同的信息及標(biāo)記。每個(gè)節(jié)點(diǎn)都擁有各自的特點(diǎn)漩勤、數(shù)據(jù)感挥、方法。
文檔節(jié)點(diǎn)是每一個(gè)文檔的跟節(jié)點(diǎn)越败。
節(jié)點(diǎn)關(guān)系
childNodes 其中保存著一個(gè)NodeList對(duì)象 類數(shù)組對(duì)象触幼。用于保存一組有序的節(jié)點(diǎn),可以通過位置來訪問這些節(jié)點(diǎn)究飞。也有l(wèi)ength 屬性置谦,但不是Array實(shí)例堂鲤。
它基于DOM結(jié)構(gòu)動(dòng)態(tài)執(zhí)行查詢結(jié)果。
parentNode屬性 指向文檔樹的父節(jié)點(diǎn)媒峡。
hasChildNodes()
ownDocument() 指向整個(gè)文檔的文檔節(jié)點(diǎn)瘟栖。
操作節(jié)點(diǎn)
appendChild() 末尾添加節(jié)點(diǎn)。
insertBefore() 接受兩個(gè)參數(shù)谅阿,要插入的節(jié)點(diǎn)半哟,作為參照的節(jié)點(diǎn)。
replaceChild() 接受兩個(gè)參數(shù)签餐,要插入的節(jié)點(diǎn)寓涨,要替換的節(jié)點(diǎn)。
cloneNode() 接受一個(gè)布爾值 是否深復(fù)制
Documnet 類型
文檔子節(jié)點(diǎn)
文檔信息
查找元素
getElementById() getElementByTagName()
特殊集合
DOM 一致性檢測(cè)
文檔寫入
Element 類型
html 元素
取得特性
getAttribute() 與實(shí)際特性名相同
h5 支持自定義特性應(yīng)該加上data-前綴以便驗(yàn)證氯檐。
設(shè)置特性 接受兩個(gè)參數(shù)戒良,要設(shè)置的特性名,值
setAttribute()
removeAttribute() //徹底刪除元素的特性
attributes 屬性 可獲取男摧、可設(shè)置
創(chuàng)建元素
document.creatElement() 創(chuàng)建新元素 接受一個(gè)參數(shù)蔬墩,元素的標(biāo)簽名。
子節(jié)點(diǎn)
childNodes 包含了它所有的子節(jié)點(diǎn)
Text 類型
創(chuàng)建文本節(jié)點(diǎn)
document.creatTextNode() 創(chuàng)建新文本節(jié)點(diǎn)耗拓,接受一個(gè)參數(shù)拇颅,要插入節(jié)點(diǎn)中的文本。
規(guī)范化文本節(jié)點(diǎn)
normalize()
分割文本節(jié)點(diǎn)
splitText()
comment 類型
DOM 操作技術(shù)
1.動(dòng)態(tài)腳本
插入外部文件
直接插入js代碼
2.動(dòng)態(tài)css
3.操作表格
4.使用NodeList
DOM擴(kuò)展
1.querySelector() 接受一個(gè)css接受符乔询,返回與該模式匹配的第一個(gè)元素樟插,如果沒有,返回null竿刁。
2.querySelectorAll() 同上黄锤。
3.matchesSeletor() 接受一個(gè)css接受符 返回true false
元素遍歷
HTML5
類相關(guān)擴(kuò)充
getElementByClassName() 接受一個(gè)參數(shù),一個(gè)包含一或多個(gè)類名的字符串食拜,返回指定類的所有元素的NodeList
classList屬性
document.activeElement焦點(diǎn)屬性
HTMLDocument 的變化
最近感覺自己的思維枯竭鸵熟,又重新看了一遍,每一次看完都受益匪淺负甸!寫的很棒流强!多讀書!