javascript
var a1=[1,3,4,"dhsf",true];
console.log(a1);
// 全局作用域中的全局對(duì)象window
console.log(window)
// 文檔節(jié)點(diǎn)document 它是全局對(duì)象的屬性 但是本身也是一個(gè)對(duì)象
console.log(document)
// 使用文檔節(jié)點(diǎn)對(duì)象的方法,可以找到頁(yè)面中的DOM元素
console.log(document.getElementsByTagName("button")[0])
回調(diào)函數(shù)
檢查
屬性可以是任意類型,使用in檢查屬性 語法: "屬性名" in 對(duì)象 自身沒有但是原型對(duì)象中含有該屬性宏所,會(huì)返回true
檢測(cè)對(duì)象本身是否含有屬性:對(duì)象.hasOwnProperty("屬性名")
檢查對(duì)象是否是某個(gè)類的實(shí)例 :對(duì)象 instanceof 類
this
- 當(dāng)以函數(shù)的形式調(diào)用時(shí),this就是window
- 當(dāng)以方法的形式調(diào)用時(shí),誰調(diào)用誰就是this
- 當(dāng)以構(gòu)造函數(shù)的形式調(diào)用時(shí),就是新創(chuàng)建的那個(gè)對(duì)象,所以可以使用點(diǎn)來添加它的屬性赌蔑。
- 調(diào)用call apply時(shí)俯在,this就是指定的那個(gè)對(duì)象⊥薰撸可以用來改變this
<!-- this關(guān)鍵字 -->
<script>
function test() {
console.log(this);
}
// 默認(rèn)情況下直接調(diào)用的函數(shù)都是由window調(diào)用的
// 所以test函數(shù)中的this是window
test(); // 相當(dāng)于window.test();
var obj = new Object()
obj.name = "lnj";
obj.age = 33;
obj.say = function () {
console.log(this.name, this.age);
}
// 這里的say是一個(gè)方法, 方法必須通過對(duì)象來調(diào)用
// 所以這里的say方法是由obj對(duì)象調(diào)用的, 所以say方法中的this是obj對(duì)象
obj.say();
</script>
</body>
</html>
特殊方法
call apply 都是函數(shù)對(duì)象的方法:均調(diào)用函數(shù)執(zhí)行 fun();fun.apply();fun.call();這三者是等價(jià)的
調(diào)用他們可以將一個(gè)對(duì)象指定為第一個(gè)參數(shù)跷乐,此時(shí)該對(duì)象是函數(shù)執(zhí)行的this,而不是我們定義的window
call方法可以將實(shí)參在對(duì)象(第一個(gè)參數(shù))后依次傳遞,apply需要把實(shí)參封裝到一個(gè)數(shù)組中進(jìn)行傳遞
arguments是一個(gè)類數(shù)組對(duì)象(偽數(shù)組)趾浅,可以通過索引操作數(shù)據(jù)愕提,同樣可以獲取長(zhǎng)度
調(diào)用函數(shù)時(shí),我們的實(shí)參會(huì)在arguments中保存皿哨,不定義形參浅侨。可以直接使用實(shí)參,arguments[0]代表第一個(gè)實(shí)參证膨。里面有一個(gè)屬性callee如输,這個(gè)屬性對(duì)應(yīng)一個(gè)函數(shù)對(duì)象,就是當(dāng)前正在指向的函數(shù)的對(duì)象。
在調(diào)用函數(shù)時(shí)不见,瀏覽器每次都會(huì)傳遞兩個(gè)隱含的參數(shù)澳化,函數(shù)的上下文對(duì)象this 封裝實(shí)參的對(duì)象arguments
可以定義形參,直接使用arguments[i]
function sum(){
for (let index = 0; index < arguments.length; index++) {
console.log(arguments[index])
//10,20,30,40
}
}
sum(10,20,30,40)
eval():執(zhí)行一段字符串形式的js代碼
函數(shù)調(diào)用(執(zhí)行) :注意this的不同
- 直接調(diào)用 函數(shù)對(duì)象()
- 通過對(duì)象調(diào)用 對(duì)象.函數(shù)名()
- 通過new調(diào)用
- 通過apply/call 函數(shù)名.call(對(duì)象名)
js代碼的位置
- 寫在標(biāo)簽中的事件中稳吮,可是這樣造成結(jié)構(gòu)與行為的耦合缎谷,不便于維護(hù)。
- 可以將js代碼寫在a標(biāo)簽中的href屬性中灶似,這樣當(dāng)當(dāng)點(diǎn)擊超鏈接時(shí)會(huì)執(zhí)行js代碼列林。需要使用javascript:開頭
- js的代碼是寫在html中的,所以需要以"<script></script>"中標(biāo)記喻奥,屬性值為type=text/javascript
- 可以將js代碼編寫到外部文件中席纽,使用script標(biāo)簽的src屬性引用進(jìn)來。優(yōu)點(diǎn):不同的文件均可以導(dǎo)入文件撞蚕,而且可利用瀏覽器的緩存機(jī)制润梯。
注意:script一旦引入外部文件,不會(huì)再執(zhí)行其他js代碼甥厦。
作用域與函數(shù)作用域
作用域指的是一個(gè)變量起作用的區(qū)域纺铭。js中沒有塊級(jí)作用域,就是除了函數(shù)作用域刀疙,所有花括號(hào)里面的變量就是全局變量舶赔。
全局作用域:
- 直接編寫在script標(biāo)簽中js代碼,都在全局作用域
- 全局作用域在頁(yè)面打開時(shí)創(chuàng)建谦秧,關(guān)閉時(shí)銷毀
- 全局作用域中有個(gè)全局對(duì)象window 它代表瀏覽器的窗口竟纳,由瀏覽器創(chuàng)建,可以直接使用
- 在全局作用域創(chuàng)建的變量都是window對(duì)象的屬性疚鲤,函數(shù)都是window對(duì)象的方法
函數(shù)作用域(局部變量)
定義形參就相當(dāng)于定義了函數(shù)作用域中聲明了變量
隱式全局變量:在函數(shù)中(js)锥累,不使用var聲明的變量是全局變量
- 調(diào)用函數(shù)時(shí)創(chuàng)建函數(shù)作用域,函數(shù)執(zhí)行完畢集歇,作用域銷毀
- 每次調(diào)用一次函數(shù)桶略,就會(huì)創(chuàng)建一個(gè)新的作用域
- 在函數(shù)作用域中是可以訪問全局作用域里面的變量的,但是全局作用域的變量是不可以訪問函數(shù)作用域中的變量的
- 當(dāng)在函數(shù)作用域操作一個(gè)變量時(shí)诲宇,他會(huì)先在自身的作用域?qū)ふ沂欠裼凶兞考始撸缓笤偃ド弦患?jí)作用域?qū)ふ遥钡饺肿饔糜蚬美叮绻肿饔糜蛉詻]找到鹅心,就會(huì)報(bào)錯(cuò)。referenceError
- 在函數(shù)作用域想要訪問全局變量纺荧“桶铮可以使用window對(duì)象來定位
類型
- 數(shù)據(jù)類型:字面量類型: Number String BoolLean Undefined Function Object
- null是object類型的 未定義變量時(shí)undefined類型的
- Null 中只有null一種取值 表示是一個(gè)空對(duì)象
- Undefined中只有undefined 變量定義為未賦值就是undefined
類型轉(zhuǎn)換
轉(zhuǎn)換為string
- 1)使用ToString()方法溯泣,但是null與undefined類型沒有該方法,不會(huì)影響原數(shù)據(jù)榕茧。
- 2)調(diào)用String函數(shù) null 轉(zhuǎn)換為null undefined轉(zhuǎn)換為undefined
- 3)+""
轉(zhuǎn)換為number
- js中所有的數(shù)字都是number
Nuber.Nax_Vaule
Infinity
-Infitity
NAN Not A Number - 如果字符串是純數(shù)字垃沦,則轉(zhuǎn)換為對(duì)應(yīng)的數(shù)字
如果字符串有非數(shù)字,轉(zhuǎn)換為NAN
如果字符串是空 或者全是空格的字符串用押,轉(zhuǎn)為數(shù)字0
布爾:
true:1 false:0
undefined轉(zhuǎn)換為NAN
null轉(zhuǎn)換為0 - 調(diào)用Number()函數(shù)
- 調(diào)用parseInt(sting,進(jìn)制數(shù)) 專門針對(duì)字符串肢簿;將字符串中的有效的整數(shù)內(nèi)容取出來,然后轉(zhuǎn)換為Number A=1234PX" 同理還有 parseFloat
如果非string進(jìn)行操作 那么會(huì)將其先轉(zhuǎn)換為string之后運(yùn)算
/1 -0 *1 取+
轉(zhuǎn)換為Boolean
數(shù)字:除了0 NAN 都是true
字符串:除了空串 都是true
對(duì)象:true 這里就有包裝類的特殊情況
var b=new Boolean(false)蜻拨;
if(b)
{
console.log("對(duì)象轉(zhuǎn)化為布爾值都是true池充,所以會(huì)執(zhí)行")
}
null undefined:false
對(duì)對(duì)象取兩次反:轉(zhuǎn)換為布爾值
運(yùn)算符
- +:任何事物與字符串都會(huì)自動(dòng)轉(zhuǎn)換為字符串,相加都是拼接
- 任何做- * /都會(huì)轉(zhuǎn)換為數(shù)字:可使用任意值-0 *1 /1來轉(zhuǎn)換為number -:會(huì)先轉(zhuǎn)換為數(shù)字 然后再進(jìn)行計(jì)算
- 自增(i++;++i)其中i都會(huì)加一缎讼,不做改變時(shí)表達(dá)式的值
- 邏輯[針對(duì)布爾值] ($ | ! )(|| &&)
非布爾值的邏輯運(yùn)算:會(huì)先轉(zhuǎn)換為布爾值 然后在運(yùn)算 并且返回原值
與:如果第一個(gè)值是true,則返回第二個(gè)數(shù)值
如果第一個(gè)值是fause,返回第一個(gè)值
或:
如果第一個(gè)值是true,返回第一個(gè)值
如果第一個(gè)值是fause,返回第2個(gè)值 - 關(guān)系運(yùn)算符:返回布爾值 :注意沒人可以必過NAN 字符串比較的是字符編碼收夸,字符是一位一位比較的
比較兩個(gè)字符串,可能得出錯(cuò)誤結(jié)論
在字符串使用轉(zhuǎn)義字符輸入unicode編碼"\u四位16進(jìn)制"
在網(wǎng)頁(yè)中使用$#編碼 - 等于:NAN不等于任何數(shù)值血崭,包括它自己 會(huì)轉(zhuǎn)換為相同數(shù)據(jù)類型后在比較
- 全等 ===不會(huì)做自動(dòng)轉(zhuǎn)換 而等于會(huì)做自動(dòng)轉(zhuǎn)換
流程控制語句
- 條件判斷語句
幾種if:if只能控制緊隨其后的語句卧惜,if語句中只執(zhí)行一句。 - 條件分支語句
switch case :沒有break就會(huì)執(zhí)行滿足條件的之后的夹纫。 - 循環(huán)語句
對(duì)象(復(fù)合數(shù)據(jù)類型) 引用
與基本數(shù)據(jù)類型不同咽瓷,基本數(shù)據(jù)類型的數(shù)值都是存儲(chǔ)在棧空間的舰讹,數(shù)值之間是獨(dú)立存貯茅姜,修改并不會(huì)互相影響。
而對(duì)象是存儲(chǔ)在堆空間的月匣。每創(chuàng)建一個(gè)對(duì)象钻洒,都會(huì)在堆內(nèi)存開辟一段空間存儲(chǔ)對(duì)象,變量保存的是對(duì)象的地址锄开,如果兩個(gè)變量保存同一個(gè)內(nèi)存地址素标,說明指向同一對(duì)象,但是它們并不相等院刁。修改其中一個(gè)變量的屬性粪狼,另一個(gè)變量必然受到影響。在椩匍空間存儲(chǔ)的是對(duì)象的地址,這個(gè)地址指向堆空間存儲(chǔ)的對(duì)象
字面量:永遠(yuǎn)不會(huì)改變的值困鸥。變量直接保存字面量锰茉,并且數(shù)值可變。使用var聲明奕枢,記得賦值
內(nèi)建對(duì)象
ES標(biāo)準(zhǔn)定義的對(duì)象卦绣。任何瀏覽器都有可以使用 MAth Function StringDOM 對(duì)象
由js運(yùn)行環(huán)境提供的對(duì)象盒延,主要是瀏覽器提供的對(duì)象 比如 DOM BOM自定義對(duì)象 :LW自己定義的對(duì)象(引用數(shù)據(jù)類型 堆里存地址)
-
1.1 對(duì)象屬性
讀取:對(duì)象名.屬性
如果不存在添寺,不會(huì)報(bào)錯(cuò)胯盯,會(huì)返回undefined
修改:對(duì)象名.屬性=值
刪除:delete 對(duì)象.屬性特殊的屬性:對(duì)象["屬性"]=值 同樣需要使用該方式讀取 []可接受變量
屬性的值可以是任何類型如果對(duì)象中不含有這個(gè)屬性,訪問的話會(huì)返回undefined计露,并不會(huì)報(bào)錯(cuò)
刪除:delete 對(duì)象.屬性 1.2 使用 for in 遍歷對(duì)象屬性
for 變量 in 對(duì)象
對(duì)象有幾個(gè)屬性博脑,這里就會(huì)循環(huán)幾次,每次會(huì)把屬性名賦值給變量薄坏。想要輸出屬性值趋厉。使用 對(duì)象[變量]1.3 屬性可以是任意類型
- 1.2 創(chuàng)建對(duì)象
方法1:使用New關(guān)鍵字調(diào)用構(gòu)造函數(shù),構(gòu)造函數(shù)就是專門用來創(chuàng)建對(duì)象的胶坠。
var 對(duì)象=new Object();
只能動(dòng)態(tài)給空對(duì)象新增屬性,使用對(duì)象.屬性=屬性值
<script>
1.使用默認(rèn)類創(chuàng)建一個(gè)空對(duì)象
var obj = new Object()
// 2.動(dòng)態(tài)給空對(duì)象新增屬性
obj.name = "lnj";
obj.age = 33;
// 3.動(dòng)態(tài)給空對(duì)象新增方法
obj.say = function () {
console.log("hello");
}
// 4.使用對(duì)象的屬性和方法
console.log("使用默認(rèn)類name"+obj.name);
console.log("使用默認(rèn)類age"+obj.age);
obj.say();
</script>
方法2:使用字面量創(chuàng)建君账,可以直接賦值
var 對(duì)象名={屬性:屬性值,屬性名:屬性值}
可以在創(chuàng)建的時(shí)候同時(shí)添加屬性沈善,使用:
注意如果是特殊的屬性乡数,屬性也需要加括號(hào)
var obj = {}; // 相當(dāng)于var obj = new Object()
// 2.動(dòng)態(tài)給空對(duì)象新增屬性
obj.name = "lnj";
obj.age = 33;
或者定義時(shí)賦值‘
var obj = {
name:"lw",
age:12,
say : function () {
console.log("使用字面量1"+"hello");
}
};
方法3:使用工廠函數(shù)
function 函數(shù)名(形式參數(shù)){
創(chuàng)建一個(gè)新對(duì)象
var xx=new Object();
像對(duì)象中添加屬性
對(duì)象.屬性=屬性值;
對(duì)象.方法=function(){
函數(shù)體
}
}
<!-- 4.2.1工廠函數(shù) -->
<script>
function createPerson(name, age) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.say = function () {
console.log("hello");
}
return obj;
}
var obj1 = createPerson("lnj", 33);
var obj2 = createPerson("zq", 18);
console.log(obj1);
console.log(obj2);
</script>
<!-- 4.2.2 工廠函數(shù) -->
<script>
function createPerson(name, age) {
var obj = {
name: name,
age: age,
say: function () {
console.log("hello");
}
}
return obj;
}
var obj1 = createPerson("lnj", 33);
var obj2 = createPerson("zq", 18);
console.log(obj1);
console.log(obj2);
</script>
方法4:使用構(gòu)造函數(shù)(使用new關(guān)鍵字):因?yàn)楣S函數(shù)的構(gòu)造函數(shù)一直是object,所以創(chuàng)建的對(duì)象的類型都相同闻牡。
構(gòu)造函數(shù)與普通函數(shù)的不同在于調(diào)用方式净赴,構(gòu)造函數(shù)使用new關(guān)鍵字來調(diào)用。
所謂的調(diào)用就是函數(shù)的執(zhí)行
1.立即創(chuàng)建一個(gè)新的對(duì)象
2.將新建的對(duì)象設(shè)置為函數(shù)中的this
3 逐行執(zhí)行函數(shù)中的代碼
- 將新建的對(duì)象作為返回值返回
使用一個(gè)構(gòu)造函數(shù)創(chuàng)建的對(duì)象罩润,我們稱為一類對(duì)象玖翅,所以也稱構(gòu)造函數(shù)為類。
函數(shù)
函數(shù)就是一系列語句的集合割以。只有函數(shù)式可以執(zhí)行的金度,其他的數(shù)據(jù)時(shí)不可以的严沥。
使用函數(shù)提高了代碼復(fù)用消玄,提高了使用效率
創(chuàng)建函數(shù)(對(duì)象)
-
1 將函數(shù)要實(shí)現(xiàn)的代碼以字符串的形式傳遞給構(gòu)造函數(shù):
var fun=new Function("console.log('這是我傳遞的字符串')") 封裝的代碼不會(huì)立即執(zhí)行,會(huì)在函數(shù)調(diào)用的時(shí)候執(zhí)行 對(duì)象()
-
2 使用函數(shù)聲明來創(chuàng)建函數(shù)
function 函數(shù)名(形參){語句}
3 使用函數(shù)表達(dá)式創(chuàng)建函數(shù)(匿名函數(shù))
就是使用賦值符號(hào)携龟。
var 函數(shù)名=function(){}
這是一個(gè)立即執(zhí)行函數(shù):函數(shù)定義完骨宠,立即被調(diào)用层亿,一般只執(zhí)行一次
注意
如果函數(shù)作為對(duì)象的屬性:我們稱為方法匿又。
fun();調(diào)用函數(shù),相當(dāng)于使用函數(shù)返回值
fun; 使用函數(shù)對(duì)象
break:退出當(dāng)前循環(huán)
continue:跳過當(dāng)次循環(huán)
return:退出函數(shù)
注意:
各個(gè)對(duì)象的函數(shù)是相同的痛单,浪費(fèi)內(nèi)存旭绒,將其在全局中定義挥吵,但是污染了全局作用域的命名空間忽匈,而且不安全丹允。使用原型對(duì)象解決這個(gè)問題
原型對(duì)象
我們每創(chuàng)建一個(gè)函數(shù)時(shí)。解析器都會(huì)給函數(shù)(對(duì)象)添加一個(gè)屬性prototype,這個(gè)屬性對(duì)應(yīng)著唯一對(duì)象萎羔,這個(gè)對(duì)象就是原型對(duì)象碳默。當(dāng)函數(shù)使用構(gòu)造函數(shù)調(diào)用時(shí)髓废,它所創(chuàng)建的對(duì)象會(huì)有一個(gè)隱含屬性指向該構(gòu)造函數(shù)的原型對(duì)象慌洪,通過使用proto來訪問該屬性冈爹。原型對(duì)象就是類中的公用區(qū)域频伤,所有對(duì)象都擁有原型對(duì)象中擁有的屬性憋肖。就是我們?cè)L問一個(gè)對(duì)象的屬性時(shí),他會(huì)首先在自己的屬性中找怎炊,如果有直接使用结胀,不再尋找糟港。找不到去原型對(duì)象中找秸抚,直到原型為object剥汤。所以創(chuàng)建構(gòu)造函數(shù)時(shí),將對(duì)象共有的屬性與方法寫原型對(duì)象中(prototype)暮芭。
myaa.protype.a 原型對(duì)象中添加屬性
所以我們創(chuàng)建構(gòu)造函數(shù)時(shí),可以講對(duì)象共有的屬性以及方法添加到構(gòu)造函數(shù)的原型對(duì)象中砾莱。這樣不用給每個(gè)對(duì)象添加腊瑟,而且不會(huì)影響全局作用域。還可以使得所有對(duì)象都擁有屬性與方法峭范。
當(dāng)我們打印對(duì)象時(shí)游岳,實(shí)際調(diào)用的是它的tostring方法胚迫,不想輸出[object object]访锻∑谌可以給對(duì)象重定義tostring方法
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<title>函數(shù)</title>
<body>
<script>
// function sayHi(name) {
// alert(name);
// }
// sayHi("lnj");
// var sayHello = function (name, age) {
// console.log("name = "+ name, "age = "+age);
// }
// sayHello("lnj", 12);
// var sayHello = function (name, age) {
// alert("name = "+ name+" "+"age = "+age);
// }
// sayHello("lnj", 22);
// function sum(a, b) {
// var res = a + b;
// return res;
// }
// var res = sum(10, 20);
// console.log(res); // undefined
//arguments
// function getSum() {
// var sum = 0;
// for (var i = 0; i < arguments.length; i++) {
// sum += arguments[i];
// }
// return sum;
// }
// var sum = getSum(5, 1, 3, 4);
// console.log(sum);
// //作為參數(shù)
// var sayHi = function () {
// console.log("hello world");
// }
// function test(fn) {
// fn();
// }
// test(sayHi);
//作為返回值
function test() {
var sayHi = function () {
console.log("hello world11");
}
return sayHi
}
var res = test();
(function () {
console.log("hello world");
})();
function test() {
function demo() { // 該函數(shù)是局部作用域
console.log("demo函數(shù)");
}
// 可以在同一個(gè)局部作用域中訪問
demo();
}
// 不能在局部范圍以外訪問
test();
function test() {
console.log("指趣學(xué)院");
}
// 2.函數(shù)表達(dá)式
function test() {
console.log("指趣學(xué)院");
}
var demo;
test();
demo = function () {
console.log("www.it666.com");
}
</script>
</body>
</html>
參數(shù)
調(diào)用函數(shù)時(shí)沙庐,實(shí)參傳遞給形參拱雏,瀏覽器不會(huì)檢查實(shí)參的類型與數(shù)量贡耽,如果實(shí)際參數(shù)少蒲赂,則會(huì)有undefined的形參凳宙。
簡(jiǎn)化的參數(shù)傳遞:
如果形參的參數(shù)過多,可以定義一個(gè)對(duì)象(屬性為這些參數(shù)),將該對(duì)象作為實(shí)參傳遞給函數(shù)有梆,這時(shí)形參可以簡(jiǎn)寫為任意東西X饺汹,函數(shù)體中使用X.屬性
函數(shù)作為參數(shù),此時(shí)函數(shù)叫做回調(diào)函數(shù)
function f1(fn) {
fn();
console.log("haha") ;
}
function f2(){
console.log("xixi")
}
f1(f2);
//xixi haha
形參過多時(shí)兜辞,可以使用對(duì)象作為實(shí)參逸吵,且參數(shù)沒有順序限制扫皱。
function person1 (o){
console.log("我叫"+o.name+"我今年"+o.age+"我是一個(gè)"+o.sex)
}
var obj ={name:"lw",age:18,sex:"female"};
console.log(person1(obj))
返回值
return:任意數(shù)據(jù)類型
一個(gè)函數(shù)有return 就有返回值
一個(gè)沒有return 就沒有返回值
一個(gè)沒有return 就沒有返回值,在調(diào)用時(shí)接收了段多,那么就是undefined
當(dāng)函數(shù)調(diào)用后衩匣,需要這個(gè)返回值琅捏,就定義一個(gè)變量接收它
在函數(shù)中return后的語句都不會(huì)執(zhí)行柄延,函數(shù)不寫return就會(huì)返回undefined 寫了return沒有參數(shù) 函數(shù)調(diào)用之后還是undefined
垃圾回收
我們做的就是把不使用的對(duì)象設(shè)置為null
數(shù)組
數(shù)組[索引] 讀取不存在的索引 不會(huì)報(bào)錯(cuò)會(huì)返回undefined
像數(shù)組的最后一個(gè)位置添加元素:arr[arr.lenth]=數(shù)值
數(shù)組中的元素可以是任意類型 var arr=new Array(10,"hello",null,undefined,{name:"jj"}市俊,function(){alert("hello")})
重要的屬性:length 可以修改:若長(zhǎng)度大于原有的摆昧,多出來的會(huì)空閑绅你,若短忌锯,會(huì)刪除。
創(chuàng)建數(shù)組
- 字面量
var 數(shù)組=[];可以同時(shí)指定數(shù)組的元素值 - 使用構(gòu)造函數(shù)
var 數(shù)組=new Array();
同時(shí)也可以定義數(shù)組值似舵,作為函數(shù)的形式參數(shù)
var a1=[1,3,4,"dhsf",true];
var a2=[];
var a3=new Array();
var a4=new Array("Saab","Volvo","BMW");
- 區(qū)別(一個(gè)參數(shù)的時(shí)候)
var a;
a=[10];元素是10
arr=new Array(10) 數(shù)組長(zhǎng)度是10
數(shù)組常見的方法
1. push :在數(shù)組的末尾添加一個(gè)或者多個(gè)元素啄枕,并返回新數(shù)組的長(zhǎng)度
2. unshift:數(shù)組的起始添加一個(gè)或者多個(gè)元素频祝,并返回新數(shù)組的長(zhǎng)度(其他元素索引會(huì)改變)
3. pop:該方法是刪除數(shù)組的最后一個(gè)元素常空,并返回刪除的元素。
4. shift:該方法是刪除數(shù)組的第一個(gè)元素烘嘱,并返回刪除的元素醉鳖。
5. slice:從數(shù)組中抽取元素盗棵,不改變?cè)瓟?shù)組纹因,將抽取的封裝到新數(shù)組中瞭恰,然后返回該新數(shù)組惊畏。參數(shù):截取的數(shù)組的開始下標(biāo)驳棱,截取的數(shù)組的結(jié)束下標(biāo)
6.slice:抽取想要的元素 參數(shù)就是抽取的區(qū)間信息
語法:截取的新數(shù)組=slice[截取的數(shù)組的起始下標(biāo)农曲,截取的下標(biāo)的數(shù)組結(jié)束下標(biāo))
注意:方法并不會(huì)改變?cè)瓟?shù)組,注意索引的包含關(guān)系,而且第二個(gè)參數(shù)可不寫,截取第一個(gè)參數(shù)以后的,同樣索引也可以是**負(fù)數(shù)**暮的,從后向前面計(jì)算 -1:倒數(shù)第一個(gè)冻辩。
7. splice:刪除數(shù)組恨闪,會(huì)影響原始的數(shù)組,原數(shù)組只剩刪除的部分咙咽,返回值是顯示刪除的部分钧敞,相加為原數(shù)組。
被刪除的元素=splice(開始位置的索引弄诲,刪除的個(gè)數(shù),想要插入的元素:出現(xiàn)的數(shù)組的最前面)
數(shù)組的遍歷:將數(shù)組元素全部取出來
1.使用for循環(huán)
使用forEach方法(IE8以及IE8以下的瀏覽器不支持該方法)
該方法接收一個(gè)函數(shù)作為參數(shù)凤巨,也就是函數(shù)名佑淀,一般我們會(huì)傳遞一個(gè)匿名函數(shù)伸刃,這個(gè)函數(shù)由我們創(chuàng)建但是并不由我們調(diào)用捧颅,稱做回調(diào)函數(shù)碉哑。
瀏覽器會(huì)在瀏覽器中傳遞三個(gè)參數(shù)扣典,
第一個(gè):當(dāng)前正在遍歷的元素
第二個(gè):當(dāng)前正在遍歷的元素的索引
第三個(gè):當(dāng)前正在遍歷的數(shù)組
arr.forEach(funtion(value,index,arr){console.log("value="+value)})
js通過dom來對(duì)文檔進(jìn)行操作 只要理解dom就可以隨心所欲操作web頁(yè)面
DOM :文檔對(duì)象模型
文檔:整個(gè)HTML文檔
對(duì)象: 網(wǎng)頁(yè)中的每一部分都轉(zhuǎn)換為對(duì)象
模型:使用模型來表示對(duì)象之間的關(guān)系 方便獲取對(duì)象 就是一棵樹(dom樹)
變量提升
先提升變量,在提升聲明
變量的提前聲明:使用var關(guān)鍵字聲明的 會(huì)在代碼執(zhí)行前被聲明 湿硝,不使用var則不會(huì)提前聲明关斜,但是只是在當(dāng)前作用域提升蚤吹,并且提升到最前面
函數(shù)聲明裁着,會(huì)被所有代碼執(zhí)行前創(chuàng)建二驰,所以可以在函數(shù)聲明前調(diào)用該函數(shù)
函數(shù)表達(dá)式桶雀,不會(huì)提前
<script>
f1();
function f1(){
console.log("1")
}
f1();
function f1(){
console.log("2")
}
f1()
var f2=function(){
console.log("3")
}
f2();
var f2=function(){
console.log("4")
}
f2();
</script>
節(jié)點(diǎn):構(gòu)成html文檔的最基本單元(Node)
標(biāo)簽(元素)節(jié)點(diǎn) 屬性節(jié)點(diǎn)(id name type) 文檔節(jié)點(diǎn)(html) 文本節(jié)點(diǎn)(標(biāo)簽中的文本內(nèi)容)
元素:整個(gè)的元素全肮,其中包括屬性節(jié)點(diǎn) 文檔節(jié)點(diǎn)
節(jié)點(diǎn)的屬性:
文檔節(jié)點(diǎn):nodeName:#document nodeType:9 nodeValue:null
元素節(jié)點(diǎn):nodeName:標(biāo)簽名 nodeType:1 nodeValue:null
屬性節(jié)點(diǎn):nodeName:屬性名 nodeType:2 nodeValue:屬性值
文本節(jié)點(diǎn):nodeName:#text nodeType:3 nodeValue:文本內(nèi)容
window對(duì)象
調(diào)試
在source中進(jìn)行調(diào)試
獲取元素節(jié)點(diǎn)
getElementById:id屬性 一個(gè)
getElementsByName:name屬性 一組類數(shù)組對(duì)象
getElementsByTagName:標(biāo)簽屬性 一組
querySelector:主要字符串的選擇器 總會(huì)返回唯一的元素 如果有多個(gè),也只是返回第一個(gè)
querySelectorAll:符合條件的元素會(huì)封裝在一個(gè)數(shù)組中返回 盡管只有一個(gè)
獲取元素節(jié)點(diǎn)的子節(jié)點(diǎn)
childNodes:所有子節(jié)點(diǎn) 包括文本節(jié)點(diǎn)在內(nèi)的所有節(jié)點(diǎn)
firstChild
lastChild
獲取父節(jié)點(diǎn)以及兄弟節(jié)點(diǎn)
parentNode
previousSibling
nextSibling
屬性
innerHTML:自結(jié)束標(biāo)簽沒用评疗,獲取元素內(nèi)部的html代碼
innerText:獲取元素內(nèi)部的文本屬性
獲取body的內(nèi)容
document.body 保存的是body的引用
document.all 代表所有元素
document.element
事件(onxxxx)
就是文檔或?yàn)g覽器窗口中發(fā)生一些特定的交互瞬間百匆,js與html之間的交互是通過事件實(shí)現(xiàn)的
定義事件 用戶與瀏覽器的交互行為
- 直接在事件對(duì)應(yīng)的屬性中設(shè)置一些js代碼加匈,當(dāng)事件被觸發(fā)時(shí)矩动,會(huì)執(zhí)行代碼。但是會(huì)存在結(jié)構(gòu)與行為的耦合男图,不方便維護(hù)逊笆。
<button id="btn1" onclick="alert('nihao')">按鈕</button>
- 為事件綁定對(duì)應(yīng)的響應(yīng)函數(shù)难裆,當(dāng)事件被觸發(fā)時(shí)乃戈,函數(shù)可以被調(diào)用執(zhí)行症虑,這里可以不可以為一個(gè)元素綁定多個(gè)事件谍憔,后面的會(huì)覆蓋前面的呦
<button>按鈕</button>
<script>
var btn=document.getElementsByTagName("button")[0];
btn.onclick=function(){
alert("你還點(diǎn)")
}
</script>
1. 使用script標(biāo)簽
2. 獲取對(duì)象
3. 綁定事件
- 使用addEventListener方法為元素綁定響應(yīng)函數(shù)
參數(shù)1:需要執(zhí)行的事件习贫,事件并沒有ON前綴
參數(shù)2:事件觸發(fā)時(shí)執(zhí)行的回調(diào)函數(shù)
參數(shù)3:需要一個(gè)布爾值來確定是否在捕獲階段獲取事件 一般是false
相比直接綁定苫昌,可以綁定多個(gè)事件 蜡歹,this 是綁定事件的對(duì)象
元素.addEventListener();
缺陷:不支持IE8以及以下的瀏覽器
使用 addEvent()
參數(shù)1:需要執(zhí)行的事件月而,事件有ON前綴
參數(shù)2:事件觸發(fā)時(shí)執(zhí)行的回調(diào)函數(shù)
區(qū)別:與addEventListener執(zhí)行結(jié)果相反 后綁定先執(zhí)行 this 是window
兼容this與事件綁定 定義函數(shù) 為指定元素綁定響應(yīng)函數(shù)
obj:要綁定事件的對(duì)象
eventStr:事件的字符串
callback:事件的回調(diào)函數(shù)
function bind(obj溢谤,eventStr,callback){
if( obj.addEventListener)
//普通瀏覽器
{
obj.addEventListener(eventStr,callback,false);
}
//IE8以及以下
else{
obj.addEvent("on"+eventStr,callback)
}
}
事件注意事項(xiàng)
- 當(dāng)事件被觸發(fā)時(shí)世杀,函數(shù)可以被調(diào)用執(zhí)行瞻坝,這時(shí)瀏覽器會(huì)將一個(gè)事件對(duì)象作為實(shí)參傳遞給函數(shù)所刀,該對(duì)象包含了該事件的常用屬性浮创,比如 鼠標(biāo)的坐標(biāo) shift元素是否被觸發(fā)
但是ie8及其以下的瀏覽器是不支持該對(duì)象的斩披,它是將其封裝在window對(duì)象的屬性中的垦沉,假設(shè)對(duì)象為event 一般使用event=event||window.event來實(shí)現(xiàn)兼容
if(!event){event=window.event} 如果不存在?耳奕?null
onload事件
事件是在頁(yè)面加載完成之后才會(huì)觸發(fā) 一般WWIwindow綁定一個(gè)onload事件
<script>
window.onload=function(){
var btn=document.getElementsByTagName("button")[0];
btn.onclick=function(){
alert("你還點(diǎn)")
}
}
</script>
事件的冒泡
事件的冒泡就是事件的向上傳導(dǎo),當(dāng)后代元素上的事件被觸發(fā)時(shí)坏挠,其祖先元素的相同事件也會(huì)被觸發(fā)降狠。
取消冒泡:將事件對(duì)象的cncelBubble屬性設(shè)置為true
事件的委托
指將事件統(tǒng)一綁定給元素的共同的祖先元素榜配,然后當(dāng)后代元素上的事件被觸發(fā)時(shí)蛋褥,會(huì)一直冒泡到祖先元素烙心,從而指向祖先元素的系響應(yīng)函數(shù)來處理事件。
事件委托利用了事件冒泡匙瘪,通過委托辆苔,減少了事件的綁定次數(shù)扼劈,提高了程序的性能荐吵。
事件的傳播
微軟:事件由內(nèi)向外傳播 即事件冒泡
網(wǎng)景:事件由外向內(nèi)傳播
W3C綜合兩個(gè)公司先煎,將事件傳播分三個(gè)階段
捕獲階段:
- 在捕獲階段時(shí)由最外層的祖先元素,想目標(biāo)元素進(jìn)行事件的捕獲占锯,但是默認(rèn)不會(huì)觸發(fā)事件
目標(biāo)階段: - 事件捕獲到目標(biāo)元素,捕獲結(jié)束開始子啊目標(biāo)元素上觸發(fā)事件
時(shí)間冒泡: - 事件從目標(biāo)元素向它的祖先元素傳遞堡称,依次觸發(fā)却紧。
- 如果希望在捕獲階段觸發(fā)事件晓殊,可以addEventListener的第三個(gè)參數(shù)設(shè)置為true挺物,一般我們并不希望在捕獲階段觸發(fā)事件识藤,IE8以及以下沒有捕獲階段
json
- js就是一個(gè)特殊格式的字符串,這個(gè)字符串可以被任何語言識(shí)別赶撰,
并且可以轉(zhuǎn)換為任意任意語言中的對(duì)象
json中的js對(duì)象的格式相似豪娜,只不過json中額屬性名必須加引號(hào)
json分類:
數(shù)組[]
對(duì)象{}
json中允許的值:字符串 數(shù)值 布爾值 null 對(duì)象
將json字符串轉(zhuǎn)換為js對(duì)象:JSON類
JSON.parse()
js對(duì)象轉(zhuǎn)換為json字符串
JSON,stringify
類
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<title>類的定義及其對(duì)象</title>
<body>
<script>
// 通過構(gòu)造函數(shù)定義一個(gè)類
// 在構(gòu)造函數(shù)中描述該類事物共性的屬性和行為
function Person(name, age) {
this.name = name;
this.age = age;
this.say = function () {
console.log(this.name, this.age);
}
}
// 通過構(gòu)造函數(shù)創(chuàng)建對(duì)象
// new 的執(zhí)行過程
// 1 在內(nèi)存中創(chuàng)建了一個(gè)空的對(duì)象
// 2 讓構(gòu)造函數(shù)中的this指向剛剛創(chuàng)建的對(duì)象
// 3 執(zhí)行構(gòu)造函數(shù),在構(gòu)造函數(shù)中設(shè)置屬性和方法(當(dāng)然也可以做其它事情)
// 4 返回了當(dāng)前對(duì)象
var p1 = new Person("lnj", 33);
var p2 = new Person("zq", 18);
console.log(p1.say());
p2.say();
// // 每個(gè)對(duì)象都可以訪問一個(gè)名稱叫做constructor的屬性, 屬性指向創(chuàng)建該實(shí)例的構(gòu)造函數(shù)
// var obj = new Object();
// obj.name = "lnj";
// console.log(obj); // Object
// function Person(name) {
// this.name = name;
// }
// var p = new Person("zs");
// console.log(p); // Person
// // 可以通過對(duì)象的constructor屬性判斷某個(gè)對(duì)象是否是某個(gè)類的實(shí)例
// console.log(p.constructor === Person); // true
// // 也可以通過instanceof判斷某個(gè)對(duì)象是否是某個(gè)類的實(shí)例
// // 企業(yè)開發(fā)推薦
// console.log(p instanceof Person);
</script>
</body>
</html>
幾種對(duì)象
-
Date對(duì)象
var date =new Date() 會(huì)獲得當(dāng)前時(shí)間
獲取指定時(shí)間:參數(shù)中指定 月/日/年 時(shí): 分: 秒 var date =new Date()
gettime():是獲取當(dāng)前時(shí)間時(shí)間戳 距離格林威治時(shí)間(1970 1/1 0:0:0)所花費(fèi)的毫秒數(shù)
Math對(duì)象
math 對(duì)象魚其他不同鸣奔。不是一個(gè)構(gòu)造函數(shù),它屬于一個(gè)工具類不用創(chuàng)建對(duì)象锨匆。它里面封裝了數(shù)學(xué)運(yùn)算的相關(guān)屬性以及方法恐锣。
Math.random():生成 0-1的隨機(jī)數(shù)
Math.round(Math.random()*x):生成 0-x的隨機(jī)數(shù)
Math.round(Math.random()*(y-x))+x:生成 x-y的隨機(jī)數(shù)
以下三個(gè)是js的包裝類
3.String對(duì)象
可以將基本數(shù)據(jù)類型轉(zhuǎn)換為String對(duì)象
var s=123;
s.tostring()
發(fā)現(xiàn)s是基本數(shù)據(jù)類型暗膜,是不可以添加屬性與方法学搜,但是這里確實(shí)可以瑞佩,
這是因?yàn)閷?duì)基本數(shù)據(jù)的數(shù)值調(diào)用屬性以及方法時(shí)炬丸,瀏覽器會(huì)臨時(shí)使用包裝類將其轉(zhuǎn)化為對(duì)象稠炬,然后調(diào)用對(duì)象的屬性與方法,調(diào)用結(jié)束撤摸,會(huì)轉(zhuǎn)換會(huì)原來的數(shù)據(jù)類型
底層字符串是以數(shù)組的形式保存的钥飞,所以可以使用下標(biāo)
4.Number對(duì)象
可以將基本數(shù)據(jù)類型轉(zhuǎn)換為Number對(duì)象
5.Boolean對(duì)象
可以將基本數(shù)據(jù)類型轉(zhuǎn)換為Boolean對(duì)象
修改樣式
樣式的優(yōu)先級(jí):
1.就近原則
2.理論上:行內(nèi)>內(nèi)嵌>鏈接>導(dǎo)入
3.實(shí)際上:內(nèi)嵌、鏈接渐扮、導(dǎo)入在同一個(gè)文件頭部,誰離相應(yīng)的代碼近耻讽,誰的優(yōu)先級(jí)高
-
行內(nèi)的樣式
元素.style.樣式名=樣式值
原來css的樣式含有-针肥,修改為駝峰命名具则。font-size 改為fontSize
如果為樣式添加!important此方法就會(huì)失效
之中方式為屬性設(shè)置內(nèi)聯(lián)樣式 當(dāng)前的樣式(IE)
元素.currentStyle.樣式名=樣式值
若是元素沒有設(shè)置樣式蜂厅,獲取其默認(rèn)值病游。
其他瀏覽器:getComputedStyle屬于window
元素.getComputedStyle.樣式名=樣式值
參數(shù)1:獲取對(duì)象的元素
參數(shù)2:偽元素 null
返回對(duì)象稠通,封裝了修改過的樣式
如果元素的屬性為設(shè)置衬衬,并不會(huì)返回默認(rèn)值,而是返回實(shí)際值改橘。
比如div未設(shè)置寬佣耐,那么就會(huì)顯示實(shí)際的寬(數(shù)值),而不是currentStyle的anto
設(shè)置所有瀏覽器兼容的方式:
function getStyle(obj唧龄,name){
if( getComputedStyle)
//普通瀏覽器
{
return getComputedStyle(obg,null)[name];
}
//IE8以及以下
else{
return obj.currentStyle[name];
}
}
正則表達(dá)式 (定義字符串的一些規(guī)則)
計(jì)算機(jī)根據(jù)正則表達(dá)式兼砖,判斷字符串是否符合規(guī)則,將符合條件的提取出來既棺。
可以理解為正則表達(dá)式就是規(guī)則。
創(chuàng)建正則表達(dá)式對(duì)象:
var patt=new RegExp("pattern","modifiers")
var patt=new RegExp("正則表達(dá)式","匹配模式");
使用字面量:
var patt=/pattern/modifiers;
修飾符用于執(zhí)行不區(qū)分大小寫和全文的搜索。
i - 修飾符是用來執(zhí)行不區(qū)分大小寫的匹配。
g - 修飾符是用于執(zhí)行全文的搜索(而不是在找到第一個(gè)就停止查找,而是找到所有的匹配)。
var patt=new RegExp("a") 正則表達(dá)式可以檢查字符串中是否含有a
patt.test("bcd")
var patt= /a[bce]d/
patt.test("acd")
規(guī)則 :這里都是針對(duì)執(zhí)行一次的
[] 里面是或的關(guān)系
| 或的關(guān)系
[abc] 查找方括號(hào)之間的任何字符。
[a-z] 任意的小寫字母
[A-Z] 任意的大寫字母
[A-z] 任意的字母
[0-9] 查找任何從0至9的數(shù)字技即。
[^] 除了
(x|y) 查找由|分隔的任何選項(xiàng)澈歉。
正則表達(dá)式的方法:test ()檢查字符串是否符合正則表達(dá)式涡尘,符合:true
patt.test("字符串")
量詞:設(shè)置一個(gè)內(nèi)容的出現(xiàn)次數(shù) (只對(duì)前面的元素起作用)
{n} 正好出現(xiàn)n次
{m,n} 出現(xiàn)m-n次
{m,} m次以上
至少一個(gè) 等同于{1川梅,}
^ 以……開頭
匹配任何結(jié)尾為 n 的字符串转质。
^n 匹配任何開頭為 n 的字符串绑榴。
?=n 匹配任何其后緊接指定字符串 n 的字符串赤套。
?!n 匹配任何其后沒有緊接指定字符串 n 的字符串。
正則表達(dá)可以作為參數(shù)
split() 字符串拆分為數(shù)組 即使不指定全局,也會(huì)全部拆分
search():搜索字符串是否有指定內(nèi)容猿妈,有输瓜,返回第一次出現(xiàn)的索引,沒有旧蛾,就返回-1
str="ccf hello hhh polo friy"
res=str.search(/a[re]b/)
console.log(res)
match:提取符合條件的內(nèi)容
通常match只會(huì)找到第一個(gè)符合條件的內(nèi)容绍绘,找到后停止酌媒,設(shè)置全局搜索
str=[1a2b3c4d]
res=str.match(/a/gi)
replace():將字符串指定的內(nèi)容替換為新內(nèi)容
參數(shù)1:被替換的內(nèi)容 可以接受一個(gè)正則表達(dá)式
參數(shù)2: 新結(jié)果
默認(rèn)只會(huì)替換第一個(gè)