Javascript使用
[if !supportLists]一、????? [endif]JS的三種使用方式
[if !supportLists]1、????????[endif]行內(nèi):寫在html標(biāo)簽中的js代碼中
[if !supportLists]2、????????[endif]內(nèi)部:寫在寫在<script type="text/javascript"></script>標(biāo)簽之間可以放在html中的任意位置,一般放在<head>標(biāo)簽中或<body>標(biāo)簽中或<body>標(biāo)簽后;
3、?? 外部:引入外部的js文件
<script type="text/javascript"
src="js文件的路徑"
></script>
注:如果<script>標(biāo)簽中設(shè)置了src屬性,name寫在<script>雙標(biāo)簽中的js代碼無(wú)效;
[if !supportLists]二、????? [endif]變量和注釋
[if !supportLists]1、????????[endif]語(yǔ)句(statment)是為了完成某種任務(wù)進(jìn)行的操作,語(yǔ)句分號(hào)結(jié)尾;
[if !supportLists]2、????????[endif]多個(gè)語(yǔ)句可以寫在一行,但是不建議這么寫;
[if !supportLists]3、????????[endif]表達(dá)式不需要分號(hào)結(jié)尾,一旦表達(dá)式后面添加分號(hào),則JavaScript引擎會(huì)將表達(dá)式視為語(yǔ)句,這樣會(huì)產(chǎn)生一些沒(méi)有任何意義的語(yǔ)句;
[if !supportLists]4、????????[endif]所有的變量都通過(guò)“var”聲明;
[if !supportLists]5、????????[endif]注釋://單行注釋;/*多行注釋*/。
[if !supportLists]三、????? [endif]變量的聲明
[if !supportLists]1、????????[endif]js是一種弱類型語(yǔ)言,聲明時(shí)不需要指定數(shù)據(jù)類型,直接通過(guò)var修飾符聲明;
[if !supportLists]2、????????[endif]先聲明再賦值,或者聲明并賦值;
[if !supportLists]3、????????[endif]如果聲明變量時(shí)不適用var修飾,則該變量是全局變量;
[if !supportLists]4、????????[endif]變量的注意點(diǎn):a、若是聲明沒(méi)有賦值,則該變量的值為undefined;
b、變量要有定義才能使用,若未聲明使用,js報(bào)錯(cuò),告訴你變量沒(méi)有定義;
c、可以在同一條var中聲明多個(gè)變量;
e、若使用var重新聲明已經(jīng)存在的變量,是無(wú)效的;
f、若使用var重新聲明已經(jīng)存在的變量且賦值,則會(huì)覆蓋掉前面的值;
g、js是一種動(dòng)態(tài)類型、弱類型的語(yǔ)言,也就是說(shuō),變量的類型沒(méi)有限制。
5、變量提升
Js引擎的工作方式,先解析代碼,獲取所有的被聲明變量,然后再一行一行地運(yùn)行,結(jié)果所有的變量的聲明語(yǔ)句都會(huì)提升到代碼的頭部。
[if !supportLists]四、????? [endif]數(shù)據(jù)類型
Js中有6種數(shù)據(jù)類型,其中有5種簡(jiǎn)單數(shù)據(jù)類型
1、Undefined:?? 表示未定義或者不存在,即此處目前沒(méi)有任何值;
2、Null: 表示空缺,即此處應(yīng)該有一個(gè)值,但目前為空;
3、布爾值(Boolean):true和false兩個(gè)特定值;
4、字符串(string):字符組成的文本;
5、數(shù)值(Number):整數(shù)和小數(shù);
6、對(duì)象(object)(引用):各種值組成的集合
1)、對(duì)象object,{name:”zhangsan”,age:”18”}
2)、數(shù)組,(array)[1,2,3]
3)、函數(shù),(function)function test() {}
操作符typeof
Typeof操作符用來(lái)檢測(cè)數(shù)據(jù)類型。
說(shuō)明:1、typeof null 返回的是 object 字符串
2、函數(shù)不是數(shù)據(jù)類型,但是也可以使用 typeof 操作符返回字符串。
3、type操作符可以操作變量,也可以操作字面量;
4、函數(shù)在js中是對(duì)象,不是數(shù)據(jù)類型,所以使用typeof區(qū)分function和object是必要的;
????? Undefined
[if !supportLists]1、????????[endif]undefined類型的值是undefined;
[if !supportLists]2、????????[endif]undefined是一個(gè)表示“無(wú)”的原始值,表示值不存在;
[if !supportLists]3、????????[endif]當(dāng)聲明了一個(gè)變量而沒(méi)有初始化時(shí),這個(gè)變量值就是undefined;
[if !supportLists]4、????????[endif]當(dāng)函數(shù)需要形參,但未傳遞實(shí)參時(shí),值就是undefined;
[if !supportLists]5、????????[endif]當(dāng)函數(shù)沒(méi)有返回值,但定義了變量接受時(shí),值就是undefined。
Null
[if !supportLists]1、????????[endif]null類型是只有一個(gè)值得數(shù)據(jù)類型,它表示空值,即該處的值為空;
[if !supportLists]2、????????[endif]null表示一個(gè)空對(duì)象的引用;
[if !supportLists]3、????????[endif]使用typeof操作符測(cè)試null,返回object字符串;
[if !supportLists]4、????????[endif]Undefined派生自null,所有等值比較返回值是true,所有未初始化的變量,和賦值為null的變量相等。
數(shù)值型(整型和浮點(diǎn)型)
? 1、所有數(shù)字都是以64位浮點(diǎn)數(shù)形式儲(chǔ)存的,所有js中1和1.0相等;
2、1加1.0得到的還是整數(shù),浮點(diǎn)數(shù)最高精度是17位小數(shù),由于浮點(diǎn)數(shù)運(yùn)算不精確,所有盡量不適用;
? 3、對(duì)于過(guò)大和過(guò)小的數(shù)值,可以使用科學(xué)計(jì)數(shù)法來(lái)表示;
? 4、超過(guò)數(shù)據(jù)范圍,出現(xiàn)Infinity(正無(wú)窮)或者-Infinity(負(fù)無(wú)窮)
5、isFinite()函數(shù)可以確定是否超出范圍;(true沒(méi)有超出,false超出了)
? 6、NaN表示非數(shù)值(Not a Number),是一個(gè)特殊的值;
? 注意:NaN不等于任何值,包括它本身,因?yàn)樗皇且粋€(gè)值
?????? NaN與任何數(shù)包括它自己的運(yùn)算,得到的都是NaN
isNaN()可以用來(lái)判斷一個(gè)值是否為NaN,true不是數(shù)字,false是數(shù)字;
對(duì)象
? Instanceof運(yùn)算符:typeof操作符對(duì)數(shù)組和對(duì)象的顯示結(jié)果都是object,那么可以利用instanceof運(yùn)算符來(lái)判斷一個(gè)變量是否是某個(gè)對(duì)象的實(shí)例;
[if !supportLists]五、????? [endif]類型轉(zhuǎn)換
[if !supportLists]1、????????[endif]自動(dòng)類型轉(zhuǎn)換
[if !supportLists]2、????????[endif]函數(shù)轉(zhuǎn)換
parseInt()在轉(zhuǎn)換前分析該字符串,判斷位置0處的字符串,判斷它是否是個(gè)有效數(shù)字,如果不是,則直接返回 NaN,不再繼續(xù),如果是則繼續(xù),直到找到非字符。
parseInt()方法的基模式,可以把二進(jìn)制,八進(jìn)制、十六進(jìn)制或其他任何進(jìn)制的字符串轉(zhuǎn)換成整數(shù)?;怯?parseInt()方法的第二個(gè)參數(shù)指定的。
如果十進(jìn)制數(shù)包含前導(dǎo) 0,那么最好采用基數(shù) 10,這樣才不會(huì)意外地得到八進(jìn)制的值。
[if !supportLists]3、????????[endif]顯示轉(zhuǎn)換
toString()函數(shù)將內(nèi)容轉(zhuǎn)換為字符串形式,可以將數(shù)字以指定的進(jìn)制轉(zhuǎn)換成字符串,默認(rèn)為十進(jìn)制。
Number 還提供了 toFixed()函數(shù)將根據(jù)小數(shù)點(diǎn)后指定位數(shù)將數(shù)字轉(zhuǎn)為字符串,四舍五入。
[if !supportLists]4、????????[endif]強(qiáng)制轉(zhuǎn)換
JS 為 Number、Boolean、String 對(duì)象提供了構(gòu)造方法,用于強(qiáng)制轉(zhuǎn)換其他類型的數(shù)據(jù)。此時(shí)操作的是整個(gè)數(shù)據(jù),而不是部分。
[if !supportLists]六、????? [endif]數(shù)組
特點(diǎn):數(shù)組長(zhǎng)度可變,數(shù)組里面的類型可以不一樣,不存在下標(biāo)越界。
[if !supportLists]1、????????[endif]數(shù)組的定義
1、隱式創(chuàng)建???????? var變量名 = [值1,值2,...];
?? 2、直接實(shí)例化
?? var變量名 = new Array(值1,值2,...);
?? 3、實(shí)例化并指定長(zhǎng)度
?? var變量名 = new Array(size);
?? 獲取數(shù)組的長(zhǎng)度數(shù)組.length
[if !supportLists]2、????????[endif]數(shù)組的遍歷
1、普通 for 循環(huán)遍歷? for(var i = 0; i <數(shù)組名.length; i++) {
?????????????????????????????? }
?? 注:可以拿到undefinded的值,無(wú)法獲取數(shù)組中屬性對(duì)應(yīng)的值
2、for ... in
?? for(vari in數(shù)組) {
?????????????????????????????? //i是下標(biāo)或?qū)傩悦?/p>
???????????????????????? }
?? 注:無(wú)法拿到undefinded的值,可以獲取數(shù)組中屬性對(duì)應(yīng)的值
?? 3、foreach
?? 數(shù)組.foreach(function(element,index){
???????? //element:元素;index:下標(biāo)
???????????????????????? });
注:無(wú)法獲取屬性對(duì)應(yīng)的值與undefinded的值
* for --?不遍歷屬性
* foreach -- 不遍歷屬性和索引中的 undefined
* for in -- 不遍歷索引中的 undefined
[if !supportLists]3、????????[endif]數(shù)組提供的方法
push 添加元素到最后
unshift 添加元素到最前
pop 刪除最后一項(xiàng)
shift 刪除第一項(xiàng)
reverse 數(shù)組翻轉(zhuǎn)
join 數(shù)組轉(zhuǎn)成字符串
indexOf 數(shù)組元素索引
slice 截?。ㄇ衅?shù)組,原數(shù)組不發(fā)生變化
splice 剪接數(shù)組,原數(shù)組變化,可以實(shí)現(xiàn)前后刪除效果
concat 數(shù)組合并
[if !supportLists]七、????? [endif]函數(shù)
函數(shù)即方法,函數(shù)也是對(duì)象。
[if !supportLists]1、????????[endif]函數(shù)的定義方式
1)函數(shù)聲明語(yǔ)句:function? 函數(shù)名([形參]){? }
? 調(diào)用:函數(shù)名([實(shí)參]);
?????????? 2)函數(shù)定義表達(dá)式:
???????????????? Var變量名/函數(shù)名=function([形參]){? }
?????????? 調(diào)用:變量名([實(shí)參])/函數(shù)名([實(shí)參]);
?????????? 3)Function構(gòu)造函數(shù)
???????????????? var函數(shù)名 = new Function('參數(shù)1','參數(shù)2','函數(shù)的主體內(nèi)容');
?????????? 調(diào)用:函數(shù)名([實(shí)參]);
?????????? 注:構(gòu)造函數(shù)的最后一個(gè)參數(shù)是函數(shù)體。
[if !supportLists]2、????????[endif]注意
js 中的函數(shù)沒(méi)有重載,同名的函數(shù),會(huì)被后面的函數(shù)覆蓋。
js 中允許有不定數(shù)目的參數(shù),后面介紹 arguments 對(duì)象。
[if !supportLists]3、????????[endif]函數(shù)的參數(shù)、調(diào)用和return
1)參數(shù): 函數(shù)運(yùn)行的時(shí)候,有時(shí)需要提供外部數(shù)據(jù),不同的外部數(shù)據(jù)會(huì)得到不同的結(jié)果,這種外部數(shù)據(jù)就叫參數(shù),定義時(shí)的參數(shù)稱為形參,調(diào)用時(shí)的參數(shù)稱為實(shí)參。
1、實(shí)參可以省略,那么對(duì)應(yīng)形參為 undefined
?2、若函數(shù)形參同名(一般不會(huì)這么干):在使用時(shí)以最后一個(gè)值為準(zhǔn)。
?3、可以給參數(shù)默認(rèn)值:當(dāng)參數(shù)為特殊值時(shí),可以賦予默認(rèn)值。
?4、參數(shù)為值傳遞,傳遞副本;引用傳遞時(shí)傳遞地址,操作的是同一個(gè)對(duì)象
2)函數(shù)的調(diào)用
常用的調(diào)用方式:函數(shù)名([實(shí)參]);
存在返回值可以變量接收,若接收無(wú)返回值函數(shù)則為 undefined。
函數(shù)調(diào)用模式:var fn9 =
function() {
????????????? console.log(this);// Window對(duì)象
????????????? return1;
???????? }
???????? varf = fn9();
???????? console.log(f);
方法調(diào)用模式:var obj = {
????????????? uname:"zhangsan",
????????????? uage:18,
????????????? cats:["喵喵","貓貓"],
????????????? sayHello:function(){
??????????????????? console.log(this);// obj對(duì)象
??????????????????? console.log("你好呀~");
????????????? }
???????? };
???????? console.log(obj.sayHello);
???????? obj.sayHello();
間接調(diào)用:function fn10(x,y) {
??????????????? console.log(x+y);
??????????????? console.log(this);
????????? }
????????? fn10(1,2); //? Window對(duì)象
????????? fn10.call(); //? Window對(duì)象
注意:apply傳入的是一個(gè)參數(shù)數(shù)組,也就是將多個(gè)參數(shù)組合成為一個(gè)數(shù)組傳入,而call則作為call的參數(shù)傳入(從第二個(gè)參數(shù)開(kāi)始)。如func.call(func1,var1,var2,var3)對(duì)應(yīng)的apply寫法為:func.apply(func1,[var1,var2,var3])
3)return語(yǔ)句
函數(shù)的執(zhí)行可能會(huì)有返回值,需要使用 return 語(yǔ)句將結(jié)果返回。return 語(yǔ)句不是必需的
如果沒(méi)有的話,該函數(shù)就不返回任何值,或者說(shuō)返回 undefined。
作用:在沒(méi)有返回值的方法中,用來(lái)結(jié)束方法。
有返回值的方法中,一個(gè)是用來(lái)結(jié)束方法,一個(gè)是將值帶給調(diào)用者。
[if !supportLists]八、????? [endif]arguments對(duì)象和函數(shù)的方法及屬性
arguments 對(duì)象可以得到函數(shù)的實(shí)參數(shù)量
函數(shù)名.name
函數(shù)名.length()得到函數(shù)的形參數(shù)量
函數(shù)名.toString()得到函數(shù)的源碼
[if !supportLists]九、????? [endif]函數(shù)的作用域
函數(shù)的作用域:全局(global
variable)和局部(local
variable)
1)全局變量與局部變量同名問(wèn)題
2)在函數(shù)中定義變量時(shí),若沒(méi)有加 var 關(guān)鍵字,使用之后自動(dòng)變?yōu)槿肿兞?/p>
3)變量作用域提升
十、閉包
????? 閉包的形成:
???????????????? 1、外部函數(shù)內(nèi)部嵌套內(nèi)部函數(shù)
???????????????? 2、內(nèi)部函數(shù)中使用外部函數(shù)的環(huán)境
???????????????? 3、外部函數(shù)返回內(nèi)部函數(shù)
????? 閉包的作用:
???????????????? 1、獲取函數(shù)內(nèi)部的變量
???????????????? 2、保存變量的值在內(nèi)存中
???????????????? 3、避免變量名重復(fù)
十一、內(nèi)置對(duì)象
????? Date:
//獲取
???????????????? ? getFullYear()年, getMonth()月, getDate()日,
???????????????? ? getHours()時(shí),getMinutes()分,getSeconds()秒
???????????????? //設(shè)置
???????????????? setYear(), setMonth(), …
???????????????? toLoacaleString()
???????????????? 說(shuō)明:
???????????????? 1.getMonth():得到的值:0~11(1 月~12 月)
???????????????? 2.setMonth():設(shè)置值時(shí) 0~11
???????????????????????????? ?3.toLocaleString():可根據(jù)本地時(shí)間把 Date 對(duì)象轉(zhuǎn)換為字符串,并返回結(jié)果。
十二、JS對(duì)象
????????? JS中一切數(shù)據(jù)皆是對(duì)象
[if !supportLists]1)????????[endif]定義對(duì)象
[if !supportLists]1、????????[endif]字面量形式創(chuàng)建對(duì)象
Var 變量名={? }//空對(duì)象
Var 變量名={鍵:值,······}
[if !supportLists]2、????????[endif]通過(guò)new Object對(duì)象創(chuàng)建
Var 變量名=new Object();
[if !supportLists]3、????????[endif]通過(guò)Object對(duì)象的creat方法創(chuàng)建對(duì)象
Var變量名=Object.create(null或?qū)ο?;
[if !supportLists]2)????????[endif]對(duì)象的序列化和反序列化
序列化即將 JS 對(duì)象序列化為字符串,反序列化即將字符串反序列化為 JS 對(duì)象。
調(diào)用 JSON 方法,可以將對(duì)象序列化成字符串,也可以將字符串反序列化成對(duì)象。
JSON.stringify(object)? //序列化對(duì)象,將對(duì)象轉(zhuǎn)為字符串。
JSON.parse(jsonStr)//反序列化,將json字符串轉(zhuǎn)換為對(duì)象。
[if !supportLists]3)????????[endif]eval()
1、可借助 eval()動(dòng)態(tài)函數(shù),將參數(shù)字符串解析成 js 代碼來(lái)執(zhí)行,只接受原始字符串作為參數(shù)
eval(“console.log(‘你好’)”);//控制臺(tái)輸出你好
2、可將 json 串轉(zhuǎn)為 json 對(duì)象
1)第一種解析方式:得到的 json 對(duì)象名就是 jsonObj
eval("varjsonObj = " + jsonStr);
2)第二種解析方式:對(duì)象中有多個(gè)屬性
varjsonObj = eval("(" + jsonStr + ")");
由于 json 是以{ }的方式來(lái)開(kāi)始以及結(jié)束的,在 eval中會(huì)被當(dāng)成一個(gè)語(yǔ)句塊來(lái)處理,故必須強(qiáng)制將它轉(zhuǎn)換成一種表達(dá)式。加上圓括號(hào)是使 eval 函數(shù)在處理時(shí)強(qiáng)制將括號(hào)內(nèi)的表達(dá)式轉(zhuǎn)化為對(duì)象而不作為語(yǔ)句來(lái)執(zhí)行。
3)第二種解析方式:對(duì)象中只有一個(gè)屬性
eval(jsonStr);