undefined:聲明但是沒有賦值,本應該有值
1.變量被聲明了庭瑰,但沒有賦值時局装,就等于undefined藕施。
2.對象沒有聲明或者賦值的屬性,該屬性的值為undefined藻茂。
3.函數(shù)沒有提供參數(shù)或者返回值驹暑,默認為undefined(擴展知識)。
null:表示"沒有對象"辨赐,即該處不應該有值
1.作為函數(shù)的參數(shù)优俘,表示該函數(shù)的參數(shù)不是對象(擴展知識)。
2.作為對象原型鏈的終點(擴展知識)掀序。
Number:
1.正數(shù)帆焕、負數(shù)、0不恭、小數(shù)
2.NaN:不是一個數(shù)字
isNaN:如果檢測值不是數(shù)字類型叶雹,瀏覽器先轉成數(shù)字類型,再判斷
NaN==NaN返回false
var a=Number("12px");
if(a==12){
console.log("a=12");
}else if(a==NaN){
console.log("a不是一個數(shù)字");
}else{
console.log("以上都不成立");
}
3.強制數(shù)據類型轉換:Number,可以轉換任意類型為數(shù)字换吧,如果是字符串折晦,比如是純數(shù)字字符串,不能含有其他字符沾瓦。
4.非強制數(shù)據類型轉換:parseInt\parseFloat满着,只能轉換字符串或者數(shù)字」彷海可以含有其他字符风喇,但是數(shù)字必須開頭。
從左到右乖篷,一個一個字符查找响驴,把字符串轉化成數(shù)字透且,如果遇到非數(shù)字撕蔼,就不再查找豁鲤。
5.float類型bug(擴展知識)
0.1+0.02==0.3
0.8*7==5.6
解決辦法:toFixed
.Boolean
1.!:將值轉成布爾類型,然后取反
2.!!:將值轉成布爾類型鲸沮,相當于Boolean
3.如果只有一個值:只有0,NaN,null,undefined,""返回false,其他全部返回true琳骡。
2.比較規(guī)則:
1.對象與對象比較永遠不相等。[]==[] {}=={} 3=="3"
2.基本數(shù)據類型比較 只要值相等就相等
3.對象與字符串比較,先將對象轉成字符串 []==""
4.對象與Boolean比較讼溺,對象轉成字符串楣号,然后轉成數(shù)字,Boolean也轉化成數(shù)字比較
5.對象與數(shù)字比較怒坯,對象轉成字符串炫狱,轉數(shù)字,然后與數(shù)字比較
6.數(shù)字==布爾剔猿,布爾轉成數(shù)字
7.字符串==數(shù)字视译,字符串轉數(shù)字
8.字符串==布爾,都轉化成數(shù)字
9.null==undefined,true,與其他所有類型都不等
10.===比較數(shù)據類型归敬,==轉成同一個數(shù)據類型比較
字符串
1.定義
2.轉義符
\n \r \t \b? \\ \' \''
3.轉字符串:
.toString()
String()
4.字符串是不可變的引用類型
5.字符串常用方法(API):
substr
substring
replace
replaceAll
Object
1.由多組屬性名\屬性值組成(多個鍵值對key\value組成)
2.對象的兩種創(chuàng)建方式(json字面量創(chuàng)建酷含,new實例創(chuàng)建)
3.JSON類型:JSON.parse,JSON.stringify
4.數(shù)組類型:Array,常用屬性和方法汪茧,訪問方法
5.屬性增刪改查,屬性不能重復
兩種方式訪問屬性
假刪除\真刪除
6.對象細分:Object,RegExp,String,Boolean,Date,Array,Function,Math等對應的實例
對象椅亚、類、實例
變量
1.變量:可變的量舱污,用來存儲值和代表值
2.定義方法:后臺定義方法呀舔,前臺定義方法
3.=是賦值操作,左側是變量名扩灯,右側是存儲的值
4.松散數(shù)據類型
2.數(shù)據類型:
1.typeof用來判斷六中數(shù)據類型
2.基本數(shù)據類型:number,string,boolean,null,undefined
3.引用數(shù)據類型:object,array,function,regexp,Date,包裝對象,Math,Globle
數(shù)據類型檢測
1.例子
var num=12;
num2=num;
num2++;
console.log(num2);
//++num2
//num2+=num2;
var obj={name:"zhufeng"};
var obj2=obj;
obj2.name="zhufengpeixun";
console.log(obj);
2.結構存儲
1.內存存儲數(shù)據的兩個邏輯組成部分:堆與棧
棧(stack):有限的空間别威,不可變大小,操作速度快驴剔,線性表省古,先進先出。不僅僅是變量丧失,執(zhí)行環(huán)境等都可以存在于堆中豺妓,由系統(tǒng)自動分配。
堆(heap):空間相對比較大布讹,可變大小空間琳拭,map形式存儲(key,value),通過new手動分配(部分對象可以不用new聲明分配)
2.堆與棧的功能:
棧負責保存我們的少量數(shù)據代碼與數(shù)據引用和代碼執(zhí)行路徑
堆則負責保存大量數(shù)據對象描验。
3.內存地址:0x+八位數(shù)字
3.數(shù)據在內存中的存儲
1.引用類型總是放在堆中白嘁。
2.值類型總是存在于棧中。
3.指針總是存在于它聲明的地方膘流。
4.基本數(shù)據類型和引用數(shù)據類型區(qū)別
1.基本數(shù)據類型把值直接賦給變量絮缅。接下來操作過程中鲁沥,直接使用值操作。兩個基本數(shù)據類型沒有什么關系耕魄。
2.引用數(shù)據類型:
1.在定義一個變量
2.開辟一個新的空間画恰,把屬性名和屬性值存在這個空間中。
3.把空間地址賦給變量吸奴。
4.連個引用類型相等引用的同一個內存空間的值允扇,一個改變,另外一個也跟著改變则奥。
5.如果一個變量斷開引用考润,重新賦值,另一個變量不受影響
5.數(shù)據類型檢測
1.typeof:返回數(shù)據類型字符串读处,不能檢查object下細分的類型额划。可以檢查函數(shù)和null(例子:多個typeof嵌套)
2.instanceof
3.Object.prototype.toString.call();(擴展知識)
4.constructor([].constructor===Array)(擴展知識)
if.4個判斷語法
1.if档泽、else:能完成所有的判斷
if判斷條件可以是表達式俊戳,也可以是一個值,也可以是多個表達式
重點:判斷代碼塊內部聲明的變量外部也可以訪問馆匿,所以全局變量不要以i~n字母命名
2.三元運算符:多值單條件判斷
false?console.log("1"):void(0)
3.switch:單值多條件判斷
break與不寫break
條件判斷:===
4.&&:多值單條件簡單判斷
&&和|| 多值判斷
2.js判斷的應用(開關燈)
1.獲取body
document:上下文context
document.getElementById:只能獲得一個
get element by id
2.讓body有個點擊事件
3.點擊時候讓body顏色改變
4.用if else switch 三元運算符來實現(xiàn)
1.for 四部曲:
1.聲明賦值變量 var i=0;
2.執(zhí)行判斷條件 i<5
3.執(zhí)行{}內代碼
4.執(zhí)行i++部分
聲明變量可以在外部訪問抑胎。
賦值區(qū)、判斷區(qū)渐北、操作區(qū)都可以寫多個表達式
5.退出雙重循環(huán)
2.循環(huán)邏輯控制語句:break/continue;
break:直接退出循環(huán)阿逃,不執(zhí)行下次循環(huán),不執(zhí)行i++部分
continue:終止當前循環(huán)赃蛛,執(zhí)行下一次循環(huán)
3.練習題:
for(var i=0;i<10;i++){
if(i<=5){
i=i+2;
continue;
}
i=i+5;
break;
console.log(i);
}
console.log(i);
2. forin while dowhile
1.forin
key value:有多少個屬性恃锉,就遍歷多少次,不管是對象屬性還是原型屬性
迭代會先迭代數(shù)字呕臂,后迭代屬性破托,最后迭代原型屬性
for in循環(huán)中想獲取我們的屬性名,只能用[]歧蒋,不能用.土砂,因為不確定是否存在數(shù)字屬性名
2.while
3.dowhile
3.隔行變色,三行變色
1.用for,forin,while,dowhile實現(xiàn)
2.用多種判斷方式實現(xiàn)
3.鼠標移入改變顏色
函數(shù)
function:函數(shù)數(shù)據類型,相當于一個方法或者一個功能
函數(shù)別名:方法谜洽,如果被當作事件處理函數(shù)萝映,又稱作句柄
1.定義一個函數(shù)(計劃一段代碼,定義一個模板)
1.在內存堆中開辟一個內存空間
2.把函數(shù)體js代碼當作字符串存在內存中間內(如果函數(shù)只定義阐虚,沒執(zhí)行的話,沒有任何意義)
3.堆棧中的函數(shù)名對應地址实束,地址引用
4.當一個函數(shù)執(zhí)行時候奥秆,執(zhí)行環(huán)境被推入內存中逊彭,這個過程叫做壓棧析显。
2.執(zhí)行函數(shù)(執(zhí)行計劃)
1.在堆棧中開辟一片空間谷异,這個空間叫做執(zhí)行環(huán)境
2.把存儲空間的js代碼字符串當作代碼運行
3.function 作用:
1.防止代碼重復
2.將代碼進行封裝歹嘹,代碼沒有必要重新編寫尺上,只需要執(zhí)行以下函數(shù)即可材蛛。
3.隱藏變量,創(chuàng)建私有變量
4.創(chuàng)建類
4.參數(shù):求1+1的和(形參:可以理解成一個變量)(多態(tài):一個功能的多重形態(tài)怎抛,通過參數(shù)實現(xiàn)不同的功能)
function sum(){
var total=1+1;
console.log(total);
}
sum();
1.形參的作用:實現(xiàn)一個功能卑吭,發(fā)現(xiàn)部分原材料沒有,置頂計劃時候沒有辦法獲取马绝,需要從外部獲取豆赏。
這時候我們需要把原材料定義在形參上,在執(zhí)行計劃的時候富稻,只提供原材料就好了掷邦。
2.定義一個形參,沒有傳遞值椭赋,默認值:undefined抚岗,傳遞參數(shù)檢測,沒有重載
function sum(num1,num2){
if(typeof num1==="undefined"){
total+=num1;
}
if(typeof num2==="undefined"){
total+=num2;
}
console.log(total);
}
3.arguments:函數(shù)內置接受參數(shù)機制,類數(shù)組(數(shù)字作為索引哪怔,索引從0開始苟跪,代表第幾個傳遞的參數(shù))
//內置:天生存在的,不管你傳遞參數(shù)沒有蔓涧,都會有這個對象的存在
console.dir(arguments);
[0],length,callee:代表當前函數(shù)本身
4.函數(shù)執(zhí)行時候件已,會在內部實現(xiàn)一個私有地盤,只有在這個地盤內的代碼可以訪問私有變量元暴,外部代碼不可以訪問私有變量篷扩。
函數(shù)執(zhí)行時候會形成一個私有作用域保護里面的變量不受外界干擾,我們把這個機制叫做閉包茉盏。
arguments修改會修改形參內容鉴未,同理形參修改也會修改arguments枢冤。只有一種情況例外,
arguments的長度不是可變的铜秆,所以修改形參不會增加arguments.
5.外部如何訪問total?return
在外部想訪問什么值淹真,函數(shù)內部return這個值就可以了.外面可以訪問這個結果或者對結果再進
行加工。
這個時候函數(shù)終止執(zhí)行连茧,控制函數(shù)函數(shù)體代碼執(zhí)行到什么位置結束核蘸。
如果我們沒有寫return,或者寫return;啸驯,默認返回值undefined
實名函數(shù)客扎、匿名函數(shù)、函數(shù)表達式和立即執(zhí)行函數(shù)
~,!,+,-與()都可以定義立即執(zhí)行函數(shù)
終止外部函數(shù)執(zhí)行
6.事件句柄
7.eval
數(shù)組
1.兩種創(chuàng)建方式
new Array(數(shù)組內容) //實例創(chuàng)建方式
[xx,xx,xx]? ? ? ? //字面量創(chuàng)建方式
console.dir([])
2.數(shù)組是由多個項組成的罚斗,每個項之間用逗號隔開徙鱼,每一項存儲的數(shù)據類型可以是任意數(shù)據類型
3.數(shù)組也是對象類型的,是由屬性名和屬性值組成
屬性名:數(shù)組中代表第幾項的編號针姿,也可以稱之為索引
4.輸出數(shù)組內容:
數(shù)組[索引項]:就是獲取數(shù)組中第索引+1項的對應的內容
length/['length']:獲取數(shù)組長度
如果索引超出索引項袱吆,會返回undefined
數(shù)組迭代,for 循環(huán)和for in 循環(huán)距淫,for循環(huán)聲明前兩個屬性實現(xiàn)數(shù)組迭代
1.添加方法
push:
shift:
pop:
unshift:
splice(實現(xiàn)shift,pop,unshift,push)
2.查詢和復制方法
slice(實現(xiàn)復制)
concat(實現(xiàn)復制)
3.轉字符串
toString
join
實現(xiàn)求和:eval(join("+"))
4.數(shù)組排序和排列
reverse
sort:原有數(shù)組也改變:只能處理10以內的數(shù)字排序
//由小到大
sort(function(a,b){
//a,b a代表每次循環(huán)當前項绞绒,b代表每次循環(huán)后續(xù)項
//通過冒泡排序的思想實現(xiàn)
return a-b;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //如果前面比后面大,這樣就交換位置
});
5.不兼容方法
map,forEach,indexOf等方法