一.瀏覽器組成:
1.shell
2.內(nèi)核:
?渲染引擎(語法規(guī)則和渲染)
?JS引擎
?其他模塊
二.JS的特點(diǎn):
1.單線程
2.解釋性語言
解釋性語言優(yōu)點(diǎn):(不需要編譯成文件)跨平臺(tái)
缺點(diǎn):效率低
編譯性語言優(yōu)點(diǎn):效率高
缺點(diǎn):不跨平臺(tái)
三.JS三大部分:
ECMAScript???DOM???BOM
四.如何引入JS:
頁面內(nèi)嵌標(biāo)簽
外部引入“l(fā)ocation”>
(為符合web標(biāo)準(zhǔn)(w3c標(biāo)準(zhǔn)中的一項(xiàng))結(jié)構(gòu)攒磨、樣式司顿、行為相
分離管跺,會(huì)采用外部引入)
該標(biāo)簽有如下六個(gè)屬性:
1.async:表示應(yīng)該立即下載腳本,但不妨礙頁面中其他操作津辩,如下載其他資源(立即下載,但不能保證先后順序執(zhí)行,要確保文件獨(dú)立性)
2.charset:很少使用坡椒,瀏覽器會(huì)自動(dòng)忽略
3.defer:表示腳本可以延遲到文檔完全被解析和顯示后執(zhí)行(立即下載就缆,但延遲執(zhí)行)
4.language:已廢棄
5.src:表示包含要執(zhí)行代碼的外部文件
6.type:可以看成是language的替代屬性帖渠,表示編寫代碼使用的腳本語言類型,通常我們使用“text/javascript”
注意:
defer=”defer”
async=”async”
嵌入代碼與外部文件
外部文件的優(yōu)點(diǎn):
1.可維護(hù)性高
2.可緩存:即當(dāng)兩個(gè)頁面加載同一內(nèi)容竭宰,外部文件只需下載一次
3.未來適應(yīng)性高
三.js基本語法
1.變量:
js采用單一var原則空郊,聲明賦值相分解份招,為提高效率,盡量在同一處聲明所有變量
2.值類型----數(shù)據(jù)類型
?不可改變的原始值(棧數(shù)據(jù))
Number,String,Boolean,undefined,null
?引用值(堆數(shù)據(jù))
array, object, function
3.js規(guī)則:
js語法錯(cuò)誤會(huì)引發(fā)后續(xù)代碼終止狞甚,但不會(huì)影響其它js代碼塊
字符串比較:如果第一個(gè)字符比較成功脾还,則不進(jìn)行下一位的比較。
4.&& ||入愧!邏輯運(yùn)算符:
&&短路語句:全真為真鄙漏,否則為假
var
a=1+1&&123;
&&兩側(cè)為表達(dá)式棺蛛,計(jì)算后轉(zhuǎn)換為bool類型怔蚌,進(jìn)行&&運(yùn)算
fn&&fun(fn)用于判斷fn是否有值
||有一個(gè)真即為真,全假為假:
var a=1||2旁赊;
第一個(gè)表達(dá)式為真就不往后看
桦踊!用于取反
!终畅!可用于查看布爾值
& |按位與或
Eg:
if(2>0>0)=true>0
5.Typeof():返回值都是字符串類型
六種數(shù)據(jù)類型:
NumberstringBooleanundefinedobjectfunction
6.類型轉(zhuǎn)換:
1.隱式類型轉(zhuǎn)換
2.顯示類型轉(zhuǎn)換
3.不發(fā)生類型轉(zhuǎn)換
一.隱式類型轉(zhuǎn)換:
isNaN ()
++/—+/-(一元正負(fù))
+
*/%
&& ||籍胯!
<><=>=
== !=
二.顯式類型轉(zhuǎn)換:
Number(mix)
parseInt(string,radix)
parseFloat(string)
toString(radix)
String(mix)
Boolean()
Number():轉(zhuǎn)換結(jié)果
true/false--->1/0,數(shù)字字符串离福,null--->0;undefined--->NaN杖狼;
parseInt():parseInt(目標(biāo)數(shù),基底)妖爷;
將目標(biāo)數(shù)以基底為進(jìn)制轉(zhuǎn)換為十進(jìn)制轉(zhuǎn)成整形
從第一位開始蝶涩,到非數(shù)字為截止,轉(zhuǎn)換成數(shù)字
不可以轉(zhuǎn)bool類型
parseFloat():
目標(biāo)數(shù)轉(zhuǎn)換成浮點(diǎn)數(shù)
找到第一個(gè)小數(shù)點(diǎn)后到第一個(gè)非數(shù)字位為止
String():變成字符串
Boolean():結(jié)果為false的
undefind/NaN/""/0/null/false(undefined==null)
toString():
undefined/null不能用toString
toString(基底):將目標(biāo)數(shù)轉(zhuǎn)換成基底進(jìn)制后變?yōu)樽址?/b>
NaN不等于任何東西絮识,包括自身绿聘,在判斷時(shí)用字符串比較(NaN==”NaN”)
undefined==null,二者均不大于0次舌,不小于0.不等于0
===:絕對(duì)等于
toFixed():科學(xué)記數(shù)法四舍五入保留有效數(shù)字
四.函數(shù):
函數(shù)聲明:function_name(argument) {
//body...
}
函數(shù)表達(dá)式
1.命名函數(shù)表達(dá)式vartext=function text() {
// body...
}
2.匿名函數(shù)表達(dá)式var demo=function () {
//body...
}
五.?dāng)?shù)組:
arr.length()數(shù)組長度
arguments.length()實(shí)參長
text.length()形參長
六.預(yù)編譯:
1.變量聲明提升
2.函數(shù)聲明整體提升
imply global:未經(jīng)聲明就賦值為暗示全局變量
此對(duì)象為window所有
eg:
a=100;
var a=b=123;
一切聲明的全局變量全是window屬性
局部變量預(yù)編譯
1.創(chuàng)建AO對(duì)象
2.找形參和變量聲明熄攘,將形參和變量聲明作為屬性名,值為undefined
3.將實(shí)參和形參同一
4.找函數(shù)聲明彼念,值賦為函數(shù)體
全局變量預(yù)編譯GO{}
GO===window
所以訪問全局可以不用打window
1.創(chuàng)建GO對(duì)象
2.找變量聲明
3.找函數(shù)賦值函數(shù)體
七.閉包:
當(dāng)內(nèi)部函數(shù)被保存到外部時(shí)挪圾,將會(huì)生成閉包。閉包會(huì)導(dǎo)致原有作用域鏈不釋放国拇,造成內(nèi)存泄露洛史。
eg:functionadd() {
var num=0;
functiona() {
document.write(++num);
}
return a;
}
var myadd=add();
myadd();
myadd();
此時(shí)a函數(shù)中保留了add函數(shù)之前的go和ao(這是在a函數(shù)定義是就存在的)
所以當(dāng)myadd被調(diào)用時(shí),訪問的是同一個(gè)num
八.立即執(zhí)行函數(shù)(function (形參) {}(實(shí)參)):立即執(zhí)行酱吝,執(zhí)行后立馬銷毀
仿佛是專門用來解決閉包問題的
eg:
var sum=(function (a,b) {
returna+b;
}(1,2));
只有表達(dá)式才能被執(zhí)行(聲明不可以執(zhí)行也殖!)
+-!()可以進(jìn)行隱式類型轉(zhuǎn)換將聲明轉(zhuǎn)換成表達(dá)式,所以(function(a,b){})(a,b)也叫立即函數(shù)(不標(biāo)準(zhǔn)形態(tài))
數(shù)學(xué)括號(hào)優(yōu)先級(jí)大于執(zhí)行括號(hào)
eg :
function text() {
vararr=[];
for(vari=0;i<10;i++)
{
(function(j){
arr[j]=function()
{
document.write(j);
}
}(i))//這樣就可以保存當(dāng)時(shí)的i,如果套在內(nèi)部忆嗜,則當(dāng)時(shí)打印
}
returnarr;
}
var myarr=text();
for(var j=0;j<10;j++)
{
myarr[j]();
}
逗號(hào)運(yùn)算符概念:返回最后一個(gè)結(jié)果
typeof空格相當(dāng)于typeof()
九.對(duì)象:
delete:
刪除對(duì)象屬性
delete+空格+對(duì)象的屬性
返回值為true
var obj={}對(duì)象字面量/對(duì)象直接量
構(gòu)造函數(shù)
{
1.系統(tǒng)自帶
2.自定義
}
系統(tǒng)自帶:Object(),Array(),Number(),String(),Boolean(),Date()
var obj1=new Object();
構(gòu)造函數(shù)與正常函數(shù)沒有區(qū)別己儒,為了區(qū)別構(gòu)造函數(shù)與普通函數(shù),我們將構(gòu)造函數(shù)首字母大寫
1.變量命名原則:
多個(gè)單詞組成的變量遵循小駝峰式命名:theFirstName
構(gòu)造函數(shù)命名規(guī)則遵循大駝峰式命名:MyStudent
2.構(gòu)造函數(shù)原理:
new關(guān)鍵字在函數(shù)開頭中隱式的創(chuàng)建this空對(duì)象捆毫,然后隱式的return this(返回對(duì)象)
如果強(qiáng)制返回引用值闪湾,則忽略隱式返回,如果強(qiáng)制返回原始值绩卤,則忽略原始值
包裝類:
Number(),String(),Boolean()包裝類不能增加屬性
十.原型:
_開頭的屬性帶有私密性
construct:構(gòu)造者通過這個(gè)屬性可以訪問到構(gòu)造者
__proto__:默認(rèn)值是該構(gòu)造函數(shù)名.原型
function person() {
//body...
}
person.prototype.name="p";
varo=new person();
person.prototype={
name:"a",
cc:"1"
}
console.log(o);
*在js中引用值中存的是地址途样,如果原始地址被更改的話,引用值中存的地址不變濒憋,
*__proto__中存的是person.prototype的地址何暇,如果person.prototype的地址發(fā)生改變,this只有當(dāng)new的時(shí)候才會(huì)被創(chuàng)建凛驮,__proto__指向的地址不變裆站,所以導(dǎo)致上述情況發(fā)生
原型鏈的頂端是object.prototype到了頭瀏覽器會(huì)返回null
__proto__指向的是父級(jí)的prototype
繼承:
傳統(tǒng)js繼承方法:構(gòu)造父級(jí)對(duì)象作為子級(jí)的原型
圣杯模型:利用閉包原理構(gòu)造一個(gè)空函數(shù),該函數(shù)原型與父級(jí)原型相同黔夭,作為緩沖區(qū)存在(作為繼承函數(shù))