第一章 Javascript簡介
Javascript實現(xiàn)
- 核心(ECMAScript)
- 文檔對象模型(DOM)
- 瀏覽器對象模型(BOM)
ECMA-262
- 語法
- 類型
- 語句
- 關(guān)鍵字
- 保留字
- 操作符
- 對象
文檔對象模型
針對XML但經(jīng)過擴展用于HTML的應(yīng)用程序變成接口API。把整個頁面映射為一個多層節(jié)點結(jié)構(gòu)南蓬。提供訪問和操作網(wǎng)頁的方法和接口。
- DOM1映射文檔結(jié)構(gòu)
- DOM2
- DOM視圖(Vidws)
- DOM事件(Events)
- DOM樣式(Style)
- DOM遍歷和范圍(Traversal and Range)
- DOM3加載文檔的方法、驗證文檔的方法
瀏覽器對象模型
提供與瀏覽器交互的方法和接口。
第二章 在HTML中使用JavaScript
引入外部javascript, 標簽之間不能再添加額外的內(nèi)容。否則不執(zhí)行措嵌。
<script type="text/javascript" src="abc.js"></script>
defer屬性,腳本延遲到整個頁面解析完再執(zhí)行芦缰。每個標簽按順序執(zhí)行企巢。
async屬性,不能保證按先后順序執(zhí)行让蕾。
charset屬性包斑,字符集。
script內(nèi)嵌文件中出現(xiàn)的內(nèi)容要\轉(zhuǎn)義涕俗。
外部文件的優(yōu)點:
- 可維護
- 可緩存
- 適應(yīng)未來
noscript元素
當瀏覽器不支持JavaScript的時候罗丰,顯示noscript元素中的內(nèi)容≡俟茫“需要啟用JavaScript”
所有script元素都會按照他們做頁面中出現(xiàn)的先后順序依次被解析萌抵。在不使用defer和async的情況下,只有在解析完前面script元素中的代碼之后元镀,才會開始解析后面script中的代碼绍填。一般放在文檔的后面 。
使用defer屬性可以 讓腳本在文檔完全呈現(xiàn)之后再執(zhí)行栖疑,延遲腳本總是按照指定他們的順序執(zhí)行讨永。
使用async屬性可以表示當前腳本不必等待其他腳本,也不必阻塞文檔呈現(xiàn)遇革。
第三章 基本概念
語法
- 區(qū)分大小寫
- 標識符:第一個字符必須是字母卿闹、下劃線揭糕、美元符號,其他字符可以是字母锻霎、下劃線著角、美元符號、數(shù)字旋恼±艨冢可以包含ASCII和Unicode字符,駝峰大小寫格式冰更。
- 注釋 // 單行注釋 /****多行注釋****/
- 嚴格模式:不確定的行為得到處理产徊,不安全的行為拋出錯誤,"use strict" 可以在頂部添加代碼蜀细,也可以在指定函數(shù)下添加舟铜。
- 語句:結(jié)尾分號不是必須,但推薦使用审葬∩罟觯控制語句多行使用代碼塊,建議始終使用涣觉。
關(guān)鍵字和保留字
不一一列舉了痴荐。
變量
松散型變量可以保存任何數(shù)據(jù)
var message; //undefined
var message="hi";
如果在函數(shù)中var定義一個變量,退出函數(shù)后會銷毀官册。如果函數(shù)中不用var直接使用生兆,全局變量退出后還能使用。
可以用逗號創(chuàng)建多個變量var message=1 , go="haha", age=29;
數(shù)據(jù)類型
基本數(shù)據(jù)類型 undefined膝宁,Null鸦难,Bollean,Number员淫,String
復(fù)雜數(shù)據(jù)類型 Object
typeof操作符
- undefined 未定義
- boolean 布爾值
- string 字符串
- number 數(shù)值
- object 對象或者null
- function 函數(shù)
instanceof檢測對象
person instanceof Array
undefined類型
聲明變量但是沒有初始化合蔽。沒有必要顯式的聲明。
var message;
alert(message); //undefined
alert(age); //產(chǎn)生錯誤
但是他們typeof都能輸出undefined介返。
Null類型
空對象類型 typeof 返回object
未來使用空變量拴事,初始化為null。
null == undefined //ture
Boolean 類型
在使用if的時候用于默認條件判斷圣蝎。 使用Boolean()進行轉(zhuǎn)換
|數(shù)據(jù)類型|轉(zhuǎn)換為true的值|轉(zhuǎn)換為false的值|
|-|-|
|Boolean|true|false|
|String|非空字符串|空字符串|
|Number|非零數(shù)字包括無窮大|0和NaN|
|Object|任何對象|null|
|Undefined|不使用|undefined|
Number類型
八進制第一位是0刃宵,如果字面值中數(shù)值超出范圍。那么前導(dǎo)0忽略徘公。八進制在嚴格模式無效牲证。
十進制前兩位是0x。在進行算數(shù)計算時关面,所有的十六進制和八進制被轉(zhuǎn)換為十進制坦袍。
isFinite(123) 判斷是否無限大
沒有小數(shù)部分的浮點數(shù)十厢,會轉(zhuǎn)換為整數(shù)锅必。
1.2e7
1.2e-7
浮點數(shù)表示法
最大能表示的數(shù)值 Number.MAX_VALUE
最小能表示的數(shù)值 Number.MIN_VALUE
0除以0返回NaN互亮,NaN和任何數(shù)值都不相等,包括本身。使用isNaN(123)--false辛燥,isNaN(NaN)當然返回true,不能轉(zhuǎn)換為數(shù)值的缝其,也會返回true挎塌。isNaN("10")就是false,isNaN(true) 可以被轉(zhuǎn)換成數(shù)值1内边,也是false榴都。isNaN("blue")不能轉(zhuǎn)換成數(shù)值,是false漠其。
Number()數(shù)值轉(zhuǎn)換規(guī)則
- 布爾值嘴高,轉(zhuǎn)換為0和1
- 數(shù)字,簡單傳入返回
- null和屎,返回0
- undefined拴驮,返回NaN
- 字符串,遵循以下規(guī)則柴信。
- 如果只含數(shù)字套啤,轉(zhuǎn)換為十進制數(shù)字,前導(dǎo)0忽略
- 如果含浮點格式随常,轉(zhuǎn)換為浮點數(shù)值
- 如果包含有效的十六進制字符潜沦,轉(zhuǎn)換成十進制數(shù)字
- 如果字符串是空的,轉(zhuǎn)換為0
- 除上述之外绪氛,轉(zhuǎn)換為NaN
- 如果是對象唆鸡,調(diào)用valueOf()方法,依照前面的規(guī)則返回的數(shù)值進行返回枣察。如果結(jié)果是NaN争占,則調(diào)用對象的toString()方法,再依照前面進行返回询件。
parseInt()函數(shù)
找到第一個非空字符進行轉(zhuǎn)換燃乍,如果第一個字符不是數(shù)字,返回NaN宛琅。因此刻蟹,轉(zhuǎn)換空字符串會返回NaN。而Number會返回0.第二個參數(shù)可以是基數(shù)嘿辟。"22.5"返回22舆瘪,小數(shù)點不是有效的數(shù)字字符片效。
parseFloat 函數(shù)
從第一個字符開始解析每個字符。一直解析到字符串末尾英古〉硪拢或者解析遇見一個無效的浮點數(shù)字字符為止。第二個小數(shù)點無效召调。
String類型
字符字面量
\n \t \r
每個字面量長度是1
字符串不可變膨桥,要改變字符串,只能銷毀原來的唠叛。
toString()方法
返回字符字面量只嚣,能傳遞基數(shù),但是null和undefined沒有這個方法艺沼。如果想把null和undefined轉(zhuǎn)換成字符串册舞,使用String()轉(zhuǎn)型函數(shù)、
Object類型
var o = new Object()
每個實例都有下列屬性和方法
- constructor 創(chuàng)建當前對象的函數(shù)
- hasOwnProperty 檢查給定的屬性在當前對象實例中是否存在
- isPrototypeOf 檢查傳入對象是否是傳入對象的原型
- propertyIsEnumerable 檢查給定對象能否使用for in語句
- toLocaleString() 返回對象字符串表示障般,與執(zhí)行環(huán)境對應(yīng)
- toString() 返回對象字符串表示
- valueOf() 返回對象字符串调鲸,數(shù)值,布爾值表示
操作符
一元操作符
遞增和遞減操作符挽荡,前置和后置藐石。
- 包含有效數(shù)字字符的字符串,轉(zhuǎn)換為數(shù)字后操作徐伐。
- 不包含有效數(shù)字的字符串贯钩,變量設(shè)置為NaN
- 布爾值轉(zhuǎn)換為0和1再操作。
- 浮點數(shù)办素,執(zhí)行加減1
- 對于對象角雷,先調(diào)用valueOf方法,運用轉(zhuǎn)換規(guī)則性穿。如果結(jié)果是NaN勺三,則調(diào)用toString()方法。
一元加減操作符需曾。如果是非數(shù)值吗坚,用Number()轉(zhuǎn)換,如果是對象呆万,先調(diào)用valueof和toString方法商源,然后再轉(zhuǎn)換。
位操作符
負數(shù)是二進制的補碼谋减,補碼是反碼+1.
按位非NOT 負值減1
按位與AND &
按位或OR |
按位異或 XOR ^ 相同為0 不同為1
左移 << 用0填充
右移 >> 用0填充
布爾操作符
邏輯非!
對象返回false牡彻,
空字符串返回true,
非空字符串返回false出爹,
操作數(shù)0返回true庄吼,
非零返回false缎除,
null返回true,
NaN返回true总寻,
undefined返回true器罐。
兩個邏輯非,可以轉(zhuǎn)換為布爾值渐行。和Boolean() 相同
邏輯與&&
- 第一個操作數(shù)是對象轰坊,返回第二個操作數(shù)
- 第二個操作數(shù)是對象,只有在第一個求值結(jié)果是true情況下才返回該對象殊轴。
- 兩個操作數(shù)都是對象衰倦,返回第二個操作數(shù)袒炉。
- 有一個操作數(shù)是null旁理、NaN、undefined我磁,則返回他
- 短路操作
邏輯或||
- 如果第一個操作數(shù)是對象孽文,返回第一個操作數(shù)
- 如果第一個操作數(shù)的求值結(jié)果為false,則返回第二個操作數(shù)夺艰。
- 如果兩個操作數(shù)都是對象芋哭,則返回第一個操作數(shù)
- 如果兩個都是null、NaN郁副、undefined减牺。
- 短路操作
乘性操作符
乘法*
- 如果操作符都是數(shù)值,按照常規(guī)乘法計算存谎,超出范圍變成無窮大拔疚。
- 有一個操作數(shù)是NaN,結(jié)果是NaN
- Infinity與0相乘既荚,結(jié)果是NaN
- infinity與非0相乘稚失,結(jié)果是infinity或者-infinity
- 兩個Infinity相乘,返回Infinity
- 有一個操作數(shù)不是數(shù)值恰聘,調(diào)用Number()轉(zhuǎn)換后句各,在執(zhí)行上面的操作。
除法/
- 超過范圍晴叨,結(jié)果是infinity或者-infinity
- 有一個操作符是NaN凿宾,返回NaN
- infinity除以infinity,返回NaN
- 0除以0,返回NaN
- 非零有限數(shù)被0除兼蕊,結(jié)果是infinit或-Infinity
- 有一個操作數(shù)不是數(shù)值初厚,后臺調(diào)用Number()轉(zhuǎn)換后,再用上面的規(guī)則遍略。
求模%
- 數(shù)值返回正常值惧所。
- 被除數(shù)無限大除數(shù)有限大骤坐,返回NaN
- 被除數(shù)有限大除數(shù)是0,返回NaN
- Infinity被Infinity除下愈,結(jié)果是NaN
- 被除數(shù)有限大纽绍,除數(shù)無窮大,結(jié)果是被除數(shù)势似。
- 被除數(shù)是0拌夏,結(jié)果是0.
- 有一個操作數(shù)不是數(shù)值,調(diào)用Number()履因,再應(yīng)用上述規(guī)則障簿。
加性操作符
加法
- 有一個操作符是NaN,結(jié)果就是NaN
- 兩個正無窮相加或者兩個負無窮相加栅迄,結(jié)果就是正無窮和負無窮站故。
- 正無窮和負無窮相加,結(jié)果是NaN
- 字符串相加毅舆,就拼接
- 一個是字符串西篓,則將另一個轉(zhuǎn)換為字符串,再拼接憋活。
- 如果操作數(shù)是對象岂津、數(shù)值、布爾值悦即,調(diào)用他們的toString()取得相應(yīng)字符串的數(shù)值吮成,對于undefined和null,分別調(diào)用string()取得字符串undefined和null
減法
- 兩個操作符都是數(shù)值辜梳,執(zhí)行常規(guī)計算粱甫。
- 有一個是NaN,結(jié)果都是NaN
- Infinity-Infinity=NaN
- -Infinity- -infinity = NaN
- infinity--infinity=infinity
- -infinity-infinity=-infinity
- 0-0=0
- 0--0=-0
- -0--0=+0
- 如果一個操作數(shù)是字符串冗美、布爾值魔种、null、undefined粉洼,后臺調(diào)用number()將轉(zhuǎn)換為數(shù)值节预,再根據(jù)前面的規(guī)則執(zhí)行減法計算。如果轉(zhuǎn)換的結(jié)果是NaN属韧,那么整個結(jié)果是NaN
- 如果有一個操作符是對象安拟,調(diào)用valueOf取得對象的數(shù)值,如果得到的是NaN宵喂,則結(jié)果是NaN糠赦,如果沒有valueOf方法,則調(diào)用toString()方法并得到字符串轉(zhuǎn)換為數(shù)值。
關(guān)系操作符
- 兩個操作符都是數(shù)值拙泽,執(zhí)行數(shù)值比較淌山。
- 都是字符串,比較編碼數(shù)值
- 如果一個操作數(shù)是數(shù)值顾瞻,則將另一個操作數(shù)轉(zhuǎn)換為一個數(shù)值進行比較泼疑。
- 如果一個操作數(shù)是對象,則調(diào)用這個對象的valueOf方法荷荤,用結(jié)果進行比較退渗。如果沒有,就調(diào)用toString方法蕴纳。
- 如果一個操作數(shù)是布爾值会油,則現(xiàn)將其轉(zhuǎn)換為數(shù)值,進行比較古毛。
- 任何操作符和NaN比較翻翩,都是false。
相等操作符
相等和不相等 先轉(zhuǎn)換再比較
- 有一個操作數(shù)是布爾值喇潘,轉(zhuǎn)為數(shù)值再比較体斩。
- 一個是字符串,另一個是數(shù)值颖低,比較相等這錢先將字符串轉(zhuǎn)換為數(shù)值。
- 一個是對象另一個不是弧烤,調(diào)用valueOf方法忱屑,用得到的基本類型和前面的比較。
- null和undefined相等暇昂。不能將null和undefined轉(zhuǎn)換為其他任何數(shù)值莺戒。
- 有一個操作數(shù)是NaN,相等操作符返回false急波,不相等返回true从铲。NaN不等于NaN。
NaN<3 false
NaN>=3 false - 兩個操作數(shù)是對象澄暮,比較是否是同一個對象名段。
全等和不全等 僅比較不轉(zhuǎn)換
條件操作符
variable = bollean_expression ? true_value : false_value;
賦值操作符
= += -= *= /= %= <<= >>= >>>=
逗號操作符
var num1=1,num2=2,num3=3;
var num=(2,4,5,6,7) //返回最后一個
語句
if語句
if(a>b){
alert("aaa");
}else if(i<0){
alert("aaa");
}else{
alert("aaa");
}
if (condition) statement1 else statement2
do-while語句
do{
statement
}while(expression);
while語句
while(expression) statement
for語句
for (initialization; expression; post-loop-expression) statement
for (;;;) statement 無限循環(huán)
for-in 語句
枚舉對象屬性,確認對象是不是或者undefined
for (property in expression) statement
label語句
label:statement
break和continue語句
可以返回標簽
with語句
with(expression) statement
with(location){
var qs = qs
var hostname = hostname
}
var qs = location.qs
var hostname = location.qs
switch語句 每句要break
switch(i){
case 25:
alert("25");
break;
case 35:
alert("35");
break;
default:
alert("other");
}
如果不寫break,就會合并2個的情況泣懊。
函數(shù)
function functionName(arg0,arg1,...,argN){
statements
}
return語句停止并立即退出伸辟,之后的語句不會執(zhí)行。
ECMAScript函數(shù)不介意傳遞進來多少個參數(shù)馍刮,也不建議是什么數(shù)據(jù)類型信夫。
arguments[0]可以獲取第一個參數(shù),并且時時保持同步。arguments.length確定傳遞進來多少參數(shù)静稻【唬可以重寫argument對應(yīng)的值。如果沒有賦值振湾,那就是undefined惠奸。
沒有重載
后面的函數(shù)覆蓋前面的
第四章 變量、作用域和內(nèi)存問題
基本類型和引用類型
動態(tài)屬性
var person = new Object();
person.name = "abc";
alert(person.name); //"abc"
var name ="abc";
name.age =24;
alert(name.age); //undefied
不能給基本類型的數(shù)值添加屬性恰梢。
復(fù)制變量值
基本類型的數(shù)值復(fù)制佛南,兩個變量相互獨立。
引用類型對象復(fù)制嵌言,復(fù)制的為指針嗅回。
傳遞參數(shù)
所有函數(shù)的參數(shù)傳遞是按照數(shù)值傳遞。
function setName(obj){
obj.name = "Nicholas";
obj = new Object();
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name) //"Nicholas"
內(nèi)部的obj被賦予了其他的指針摧茴。
檢測類型
基本類型使用 typeof
引用類型 result = variable instanceof constructor
執(zhí)行環(huán)境及作用域
在web瀏覽器中绵载,全局執(zhí)行環(huán)境是windows對象。
代碼在環(huán)境中執(zhí)行苛白,會創(chuàng)建變量對象的作用域鏈娃豹。
內(nèi)部環(huán)境可以通過作用域鏈訪問外部環(huán)境,但是外部環(huán)境不能訪問內(nèi)部環(huán)境中的變量和函數(shù)购裙。
延長作用域鏈
try-catch語句的catch塊
with語句
這兩個語句都會在作用域鏈前端添加一個變量對象懂版。對于with語句來說,會將指定的對象添加到作用域鏈中躏率。對catch語句來說躯畴,會創(chuàng)建一個新的變量對象,其中包含的是被拋出的錯誤對象的生命薇芝。
沒有塊級作用域
在括號內(nèi)的if或者for的變量是全局變量蓬抄,不是局部變量。
在函數(shù)內(nèi)夯到,var是局部嚷缭,不添加var是全局
查詢標識符,由內(nèi)部到外部耍贾。找到這個變量阅爽。
垃圾收集
以后再說標記清除、引用計數(shù)逼争、性能問題优床、管理內(nèi)存
第五章引用類型
Object 類型
創(chuàng)建對象
var person = new Object()
//對象字面量表示法
var person = {
name:"aaa";
age:29
}
var person = {
"name":"aaa";
"age":29
}
//對象最后不能加逗號
var a = {} //與new Object()相同
訪問屬性
person['name'] //可以用空格非數(shù)字,變量誓焦,關(guān)鍵字
person.name
Array 類型
var colors = new Array()
var colors = new Array(20) //預(yù)先知道長度
var colors = new Array("a","b","c")
var colors = Array(3) //3項
var colors = Array("aa")
var colors = Array(3) // 省略new 操作
var names = ['a','b'] //字面量法胆敞,
var names = [1,2,] //不要這樣
var names = [,,,] //也不要這樣
colors[0] //顯示第0項着帽,也可以修改,或者對新的項新增移层。
colors.length //顯示長度
colors[colors.length] = "a" //添加新項
value instanceof Array 檢測數(shù)組仍翰,一個環(huán)境
Array.isArray(value) 確定到底是不是數(shù)組,不管哪個環(huán)境
轉(zhuǎn)換方法
array.valueof() 返回數(shù)組观话,對每一項toString
toLocaleString()
toString() 返回數(shù)組每個值的字符串形式拼接而成的一個以逗號分隔的字符串
array.join("|")
棧方法
后進先出LIFO(last in first out)
array.push(1,2,3) 返回修改后數(shù)組長度
array.pop() 返回移除的數(shù)組
隊列方法
先進先出FIFO(first-in-first-out)
array.push(1予借,2,3)
array.shift()
前進后出
array.pop()
array.unshift
重新排列方法
array.reverse() 反序
array.sort(function compare(value1,value2){return value2-value1})
function compare(value1,value2){
if(value1 < value2){
return -1;
} else if (value1 > alue2){
return 1;
} else {
return 0
}
}
操作方法
array.concat([a,b,c])組合成新數(shù)組,沒有參數(shù)的時候频蛔,只是返回副本灵迫。
array.slice(1,3) 按照python那種方式提取數(shù)組,不會影響原始數(shù)組
array.splice(1,0,[1,2]) 刪除晦溪、插入瀑粥、替換數(shù)組
位置方法
indexOf(4,4) 可以查找某個東西的位置,帶參數(shù)從那個位置開始找三圆。
lastIndexOf()
迭代方法
- every() 每項運行都運行函數(shù)狞换,每一項都返回true,則返回true
- filter() 返回true的組成新數(shù)組
- forEach() 每一項運行給定函數(shù)舟肉,沒有返回值
- map() 返回每次調(diào)用函數(shù)的結(jié)果
- some() 任何一項返回true修噪,就返回true
function(item,index,array){
return(item>2);
}
歸并方法
reduce() reduceRight()
var values = [1,2,3,4,5]
var sum = values.reduce(function(prev,cur,index,array){
return prev+cur
})
DATE類型
var now = new Date() 創(chuàng)建日期當前對象,可傳入1970.1.1的毫秒數(shù)
var someDate = new Date(Date.parse("May 25, 2005")) 按照日期格式轉(zhuǎn)換
var someDate = new Date(Date.UTC(2005,4,5,17,55,55)) 按照0的基數(shù)
var start = Date.now() 取得當前時間
valueOf返回毫秒表示路媚,方便比較
toString和toLocalString 返回字符串
RexExp類型
暫缺
Function類型
function sum(num1, num2){
return num1 + num2
}
var sum = function(num1,num2){
return num1 + num2;
};
末尾分號
沒有重載
函數(shù)聲明與函數(shù)表達式
率先讀取聲明黄琼,讀取到規(guī)定地方才讀取表達式
function sum(sum1, sum2){} //這是聲明,函數(shù)聲明提升
var sum = function (){} //這是表達式
作為值的函數(shù)
把一個函數(shù)作為另一個函數(shù)的結(jié)果返回.return function(){}
函數(shù)內(nèi)部屬性
arguments 傳入對象的所有參數(shù)
this 執(zhí)行環(huán)境,在不同的環(huán)境表示
arguments.callee 是函數(shù)自己 比如階乘可以用
caller 保存著調(diào)用當前函數(shù)的函數(shù)引用磷籍。
function outer(){
inner()
}
function inner(){
inner.caller; //outer();
}
arguments.callee.caller 更松散的耦合
函數(shù)的屬性和方法
length 函數(shù)希望接收的命名參數(shù)的個數(shù)
prototype 屬性适荣,不可枚舉,for-in無法發(fā)現(xiàn)
apply() 可以擴充作用域院领,在特定作用域中調(diào)用函數(shù)
call() 與apply作用相同,區(qū)別是接受參數(shù)的方式不同够吩,傳遞的參數(shù)必須枚舉出來
function sum(num1,num2){
return num1+num2
}
function callSum1(num1,num2){
return sum.apply(this,arguments);
}
function callSum2(num1,num2){
return sum.apply(this,[num1,num2]);
}
function callSum3(num1,num2){
return sum.call(this,num1,num2);
}
擴充作用域
window.color = "red"
var o = {color:blue}
function saycolor(){alert(this.color)}
saycolor.call(0)
bind() 綁定作用域
window.color = "red"
var o ={color:"blue"}
function sayColor(){
alert(this.color)
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
基本包裝類型
var s1 = "some text"
var s2 = s1.substring(2);
實際上完成的是以下操作
var s1 = new String("some text");
var s2 = s1.substring(2)
s1 = null
Boolean類型
因為所有對象會轉(zhuǎn)換成true比然,所以用處不大。
valueOf() 返回基本類型true和false
toString() 返回字符串true
typeof基本類型會返回boolean周循,引用類型返回object强法,理解引用關(guān)系非常重要。
永遠不要使用Boolean 對象
Number類型
var numberObject = new Number(10)
valueOf()返回基本類型的數(shù)值
toLocalString和toString返回字符串形式
num.toFix(2) 返回指定小數(shù)位湾笛,四舍五入
typeof基本類型返回number
typeof引用類型返回object
String類型
valueOf toString toLocalString 返回字符串
使用toString用于將數(shù)值格式化為字符串方法
字符方法
stringValue.charAt(1) //訪問指定位置
stringValue.charCodeAt(1) //訪問指定位置的編碼
stringValue[1] //訪問指定位置
操作方法
stringValue.concat("world") //字符串連接
slice substr substring //子字符串
indexOf lastIndexOf //位置方法
trim() //刪除空格
toLowerCase toUpperCase //大小寫轉(zhuǎn)換
match() //接收正則表達式或者RegExp對象
search() //接收正則表達式或者REgExp對象 返回第一個匹配是索引
replace() //替換 可以用正則表達式
localeCompare() //方法
單體內(nèi)置對象
Golbal對象
URL編碼方法
encodeURI() //整個URL編碼饮怯,不會對本身屬于URL字符編碼冒號斜杠
encodeURLComponent() //對一段編碼,對任何非標準字符編碼嚎研。
decodeURL()
decodeURLComponent() 解壓
eval方法
解析語句
Golbal對象屬性
各種類型蓖墅,構(gòu)造函數(shù),錯誤,日期论矾,regexp等
windows對象
訪問Global對象教翩,Web瀏覽器都是將這個全局對象作為windows對象實現(xiàn)。
Math對象
底數(shù)贪壳,自然數(shù)饱亿,最大值,最小值闰靴,四舍五入彪笼,隨機數(shù)
第六章 面向?qū)ο蟮某绦蛟O(shè)計
var person = new Object();
person.name = "abc";
person.sayName = function(){
alert()
}
var person = {
name:"abc",
age:29.
sayName:function(){
alert(this.name);
}
}
屬性類型
數(shù)據(jù)屬性
[[Configurable]] 能否刪除重新定義
[[Enumerable]] 能否通過for-in 循環(huán)返回屬性
[[writable]]
[[Value]] 這個屬性的數(shù)值
Object.defineProperty(aaa,"name",{
writable:false,
value:"aaaa"
})
訪問器屬性
[[Configurable]] 能否刪除重新定義
[[Enumerable]] 能否通過for-in 循環(huán)返回屬性
[[get]]讀取屬性調(diào)用的函數(shù)
[[set]]寫入屬性調(diào)用的函數(shù)
aaa._age=87;
Object.defineProperty(aaa,"age",{
get:function(){
return this._age;
},
set:function(newValue){
this._age=newValue;
}
})
aaa.age=88
alert(aaa.age)
定義多個屬性
var book={};
Object.defineproperties(book,{
_year:{
value:2004
},
edition:{
value:1;
}
}
)
讀取屬性的特性
Object.getOwnPropertyDescriptor(book,"year")
如果是訪問屬性,那么是configurable,enumerable,get,set
如果是數(shù)據(jù)屬性蚂且,那這個對象屬性有configurable\enumerable\writable和value
var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
descriptor.value
創(chuàng)建對象
工廠模式
function createObject(name,age,job){
var person = new Object;
person.name = name;
person.age = age;
person.job = job;
person.sayName = function(){
alert(this.name)
}
return person;
}
無法解決對象識別問題
構(gòu)造函數(shù)模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName = function(){
alert(this.name);
}
}
var person1= new Person("johnny",18,"workker")
沒有顯式創(chuàng)建對象配猫,直接將屬性和方法賦給this對象,沒有return語句膘掰。構(gòu)造函數(shù)要大寫章姓。
person1.constructor == Person //true
person1 instanceof Person //true
每次執(zhí)行方法,都要重建一次识埋。兩個創(chuàng)造出來的sayname不相同凡伊。把函數(shù)移到外面,但是沒有封裝了窒舟。
原型模式
function Person(){}
Person.prototype.name = "Johnny"
Person.prototype.age = 20
Person.prototype.job = "Software Engineer"
Person.prototype.sayName = function(){
alert (this.name);
}
var person1 = new Person()
person1.sayName();
var person2 = new Person()
person2.sayName();
alert(person1.sayName == person2.sayName); //true
Person.prototype.isPrototypeOf(person1) //true
Object.getPrototypeOF(person1).name //"Johnny"
無法通過對象實例重寫原型中的值系忙,重寫之后會給實例添加屬性,卻不能改寫原型惠豺。使用delete刪除屬性银还,從而回復(fù)對原型的訪問。使用person1.hasOwnProperty('name') 是否存在于實例中洁墙。
原型與in操作符
如果對象能通過原型或者實例訪問到屬性蛹疯,in返回true。
確定是原型中的屬性热监。
function hasPrototypeProperty(object,name){
return !object.hasOwnProperty(name) && (name in object);
}
使用for-in循環(huán)捺弦,返回的是所有能夠通過對象訪問的、可枚舉屬性孝扛,既包括存在于實例中的屬性列吼,也包括存在于對象中的屬性。
原型簡寫
function Person(){}
Person.prototype = {
constrotor : Person,
name:"abc",
sayName : function(){
alert(this.name);
}
}
Object.defineProperty(Person.prototype,"constructor",{
enumerable:false,
value:Person
}
);
取得對象上可枚舉實例的屬性
var keys = Object.keys(Person.prototype);
alert(keys); //"name,age,job,sayName"
取得所有實例的屬性苦始,無論是否可枚舉
Object.getOwnPropertyNames(Person.prototype);
要不然constructor無法確定對象類型寞钥。但是變成可枚舉的enumerable。
更簡單的原型語法
function Person(){}
Person.prototype = {
constructor:Person,
name:"Nicho",
age:18,
sayName:function(){
alert(this.name);
}
};
這樣從這里創(chuàng)建的新對象的constructor就不再指向Person了陌选。所以要重寫constructor.但是會導(dǎo)致constructor 的Enumerable特性被設(shè)置成true理郑。
Object.defineProperty(Person.prototype,"constructor",{
enumerable:false,
value:Person
})
原型的動態(tài)性
重寫一個原型屬性可以蹄溉,但是重寫整個原型會導(dǎo)致指向他的實例失去屬性。
原型對象問題
沒有傳遞參數(shù)香浩,共享本性类缤。
原型對象的問題
所有的實例在默認情況下都使用相同的屬性。
組合使用構(gòu)造函數(shù)模式和原型模式邻吭。
function Person(name, age, job){
this.name = name;
this.age=18
}
Person.prototype={
constructor:Person,
sayName:function(){
alert(this.name);
}
}
使用最廣泛餐弱、認同度最高
動態(tài)原型模式
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if (typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert(this.name);
}
}
}
不能使用對象字面量重寫原型,會切斷聯(lián)系囱晴。
寄生構(gòu)造模式
先不看了
穩(wěn)妥構(gòu)造模式
先不看了
繼承
function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property
}
function SubType(){
this.subproperty = false
}
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function(){
return this.subproperty;
}
var instance = new SubType();
alert(instance.getSuperValue())
//確定原型和實例的關(guān)系
instance instanceof Object
instance instanceof SuperType
instance instanceof SubType
Object.prototype.isPrototypeOf(instance)
SuperType.prototype.isPrototypeOf(instance)
SubType.prototype.isPrototypeOf(instance)
謹慎定義方法膏蚓,覆蓋方法,給原型添加方法一定要放在替換語句之后畸写。
重寫subtype會阻斷與super之間的聯(lián)系驮瞧。
不能通過字面量添加新方法,這樣會重寫原型枯芬。
SubType.prototype = {
getSubValue:function(){
return this.subproperty;
},
someOtherMethod: function(){
return false;
}
}
問題1 论笔,引用類型的原型,原型會變成另一個類型的實例千所,實例對原型的修改狂魔,提現(xiàn)在了其他的實例上。在創(chuàng)建子類型的時候淫痰,不能向超類型的構(gòu)造函數(shù)傳遞參數(shù)最楷。
借用構(gòu)造函數(shù)?待错?籽孙?
function SuperType(name){
this.color = [1,2,3,"name"]
}
function SubType(){
SubType.call(this,"haha");
}
var instance1 = new SubType();
instance1.push("black")
var instance2 = new SubType();
instance2.color //沒有變化
可以傳遞參數(shù).缺點都在構(gòu)造函數(shù)中定義,無法重復(fù)使用火俄,超類型中定義的方法犯建,在子類型中不可見。
組合繼承瓜客?胎挎??忆家?
function SuperType(name){
this.name = name;
this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function(){
alert (this.name);
}
function SubType(name,age){
SuperType.call(this,name);
this.age = age;
}
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
alert(this.age);
}
var instance1 = new SubType("Nicholas",29);
instance1.color.push("black");
alert(instance1,colors); //四個顏色
instance1.sayName(); //nigulasi
instance1.sayAge(); //29
var instance1 = new SubType("aaa",28);
instance1.color.push("black");
alert(instance1,colors); //三個顏色
instance1.sayName(); //aaa
instance1.sayAge(); //28
既避免了原型鏈和借用構(gòu)造函數(shù)的缺陷,又融合了有點德迹,是最常用的繼承模式芽卿。
原型式繼承
寄生式繼承
寄生組合式繼承
第七章 函數(shù)表達式
函數(shù)聲明,函數(shù)聲明提升胳搞。
函數(shù)表達式卸例,類似于賦值語句称杨。
遞歸
arguments.callee 返回函數(shù)本身,多用于遞歸筷转。