1 對(duì)象
1)JS中為什么要用對(duì)象
函數(shù)的參數(shù)如果特別多的話,可以使用對(duì)象簡(jiǎn)化
function logLike(liao) {
console.log(liao.name);
console.log(liao.intro);
console.log(liao.college);
console.log(liao.site);
}
2)什么是對(duì)象
類和對(duì)象:
類
描述一類事物,相當(dāng)于‘設(shè)計(jì)圖紙’
JavaScript中可以自定義類版述,同時(shí)也提供了一個(gè)默認(rèn)的類叫做Object
對(duì)象
描述一個(gè)具體的事物,相當(dāng)于‘成品’寞冯。有自己的特征和行為
3) JS中的對(duì)象
JS中的對(duì)象是無(wú)序?qū)傩缘募?br>
對(duì)象就是一組沒(méi)有順序的值渴析,由一組組件值對(duì)構(gòu)成
事物的特征在對(duì)象中用屬性來(lái)表示
事物的行為在對(duì)象中用方法來(lái)表示
4) JS中對(duì)象的分類
內(nèi)建對(duì)象(內(nèi)置對(duì)象)
由ES標(biāo)準(zhǔn)中定義的對(duì)象,在任何的ES的實(shí)現(xiàn)中都可以使用(自帶的吮龄、默認(rèn)的)
比如:String````Number````Boolean````Function````Object````Math
宿主對(duì)象
由JS的運(yùn)行環(huán)境提供的對(duì)象俭茧,現(xiàn)在主要指瀏覽器提供的對(duì)象
比如:BOM對(duì)象、DOM對(duì)象
自定義對(duì)象
自己創(chuàng)建的對(duì)象
5) 對(duì)象字面量
var Mrx = {
//屬性
name:'明日香',
age:19,
sex:'女',
//行為
doMh:function () {
console.log('LoveMrx');
}
};
console.log(Mrx);
console.log.(typeof Mrx); //Object
6) 常見(jiàn)創(chuàng)建對(duì)象的方式
對(duì)象字面量
(見(jiàn)上一個(gè)函數(shù))
new Object()創(chuàng)建對(duì)象
可以先創(chuàng)建對(duì)象漓帚,需要用的時(shí)候再賦值母债,優(yōu)勢(shì)是節(jié)約內(nèi)存。
var Mrx = new Object();
Mrx.name='明日香';
Mrx.age='19';
Mrx.sex='女';
console.log(Mrx);
console.log(typeof Mrx);
工廠函數(shù)常見(jiàn)對(duì)象
function Mrx(name,age,sex) {
var p = new Object();
p.name = name;
p.age = age;
p.sex = sex;
p.doMh = function () {
console.log('LoveMrx');
};
return p;
}
var x1=Mrx('MRX',19,'女');
var x2=Mrx('LBL',18,'女')毡们;
console.log(x1,x2);
自定義構(gòu)造函數(shù)
function Hummn(name,age,sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.doMh = function () {
console.log('LoveMrx');
}
//return this迅皇; //一般不寫(xiě),是默認(rèn)隱藏屬性
}
var x1 = new Hummn('MRX',19,'女');
var x2=new Mrx('LBL',18,'女');
console.log(x1);
console.log(x2);
7) 屬性和方法
屬性
如果一個(gè)變量屬于一個(gè)對(duì)象所有衙熔,那么該變量就可以稱之為該對(duì)象的一個(gè)屬性登颓,屬性一般是名詞,用來(lái)描述事物的特征
方法
如果一個(gè)函數(shù)屬于一個(gè)對(duì)象所有青责,那么該函數(shù)就可以稱之為該對(duì)象的一個(gè)方法挺据,方法是動(dòng)詞,描述事物的行為和功能
8) new關(guān)鍵字
new
關(guān)鍵字一般和構(gòu)造函數(shù)一起配合使用
構(gòu)造函數(shù)
構(gòu)造函數(shù)是一種特殊的函數(shù)
構(gòu)造函數(shù)用于創(chuàng)建一類對(duì)象脖隶,首字母要大寫(xiě)
構(gòu)造函數(shù)要和new一起使用才有意義
new做了哪些事情扁耐?
1-new先在內(nèi)存中創(chuàng)建一個(gè)新的空對(duì)象
2-new會(huì)讓this指向這個(gè)新的對(duì)象
3-執(zhí)行構(gòu)造函數(shù),給這個(gè)新對(duì)象加屬性和方法
4-返回這個(gè)新對(duì)象
9) this關(guān)鍵字
this是一個(gè)指針
特點(diǎn):
1-普通函數(shù)執(zhí)行产阱,內(nèi)部this指向全局對(duì)象window
2-函數(shù)在定義的時(shí)候this是不確定的婉称,只有調(diào)用的時(shí)候才可以確定
3-如果函數(shù)作為一個(gè)對(duì)象的方法,被該對(duì)象所調(diào)用构蹬,那么函數(shù)內(nèi)的this則指向該對(duì)象
4-構(gòu)造函數(shù)中的this是一個(gè)隱式對(duì)象王暗,類似一個(gè)初始化模型,所有方法和屬性都掛載到了這個(gè)隱式對(duì)象身上庄敛,后續(xù)通過(guò)new關(guān)鍵詞來(lái)調(diào)用俗壹,從而實(shí)現(xiàn)實(shí)例化
//普通函數(shù)
var str = '張三';
function func() {
console.log(this); //返回window
console.log(this.str); //返回張三
}
func();
//對(duì)象
var obj = {
name='Mrx',
age=19,
func: function () {
console.log(this); //返回的是對(duì)象obj
console.log(this.name);
console.log(this.this);
}
};
obj.func();
//構(gòu)造函數(shù)
function Fn() {
this.name = 'Mrx';
this.age = 19;
console.log(this);
}
Fn(); //this指向window
new.Fn(); //this指向?qū)ο驠n
10) 對(duì)象使用
遍歷對(duì)象的屬性
var Mrx = {
//屬性
name:'明日香',
age:19,
sex:'女',
//行為
doMh:function () {
console.log('LoveMrx');
}
};
//訪問(wèn)對(duì)象的屬性
console.log(Mrx['name']); //[ ]里是字符串
//遍歷對(duì)象 for···in···
for(var key in Mrx) {
console.log(key); //輸出:name,age,sex,doMh
console.log(key + ':' + Mrx[key]); //輸出name:明日香
}
刪除對(duì)象的屬性
delete
關(guān)鍵字
//刪除對(duì)象的屬性
delete Mrx.age;
console.log(Mrx); //沒(méi)有age屬性了
//增加對(duì)象的屬性
Mrx.age = 30 ;
Mrx.friends = ['Lbl','Dzs'];
console.log(Mrx);
11) 基本類型和引用類型在堆棧中的表示
基本數(shù)據(jù)類型
基本類型又叫做值類型,在存儲(chǔ)時(shí)藻烤,變量中存儲(chǔ)的是值本身绷雏,因此叫做值類型
String
Number
···
引用數(shù)據(jù)類型
復(fù)雜數(shù)據(jù)類型,在存儲(chǔ)中怖亭,變量中存儲(chǔ)的僅僅是地址(引用)涎显,因此叫做引用數(shù)據(jù)類型
Object
區(qū)別
JS中的變量都是保存到棧內(nèi)存中的,基本數(shù)據(jù)類型的值直接在棧內(nèi)存中存儲(chǔ)兴猩,值與值之間是獨(dú)立存在期吓,修改一個(gè)變量不會(huì)影響其他的變量
對(duì)象是保存到堆內(nèi)存中的,每創(chuàng)建一個(gè)新的對(duì)象倾芝,就會(huì)在堆內(nèi)存中開(kāi)辟出一個(gè)新的空間讨勤,而變量保存的是對(duì)象的內(nèi)存地址(對(duì)象的引用),如果兩個(gè)變量保存的是同一個(gè)對(duì)象引用蛀醉,當(dāng)一個(gè)通過(guò)一個(gè)變量修改屬性時(shí)悬襟,另一個(gè)也會(huì)受到影響
堆和棧 (括號(hào)內(nèi)為個(gè)人理解,不具備參考意義)
棧(有點(diǎn)像電腦內(nèi)存):由操作系統(tǒng)自動(dòng)分配釋放拯刁,存放函數(shù)的參數(shù)值脊岳,局部變量的值等
堆(有點(diǎn)像電腦硬盤):存儲(chǔ)復(fù)雜類型(對(duì)象),一般由程序員分配釋放,若程序員不釋放割捅,由垃圾回收機(jī)制回收
注意奶躯!JS中沒(méi)有堆和棧的概念,只是方標(biāo)理解亿驾,存放方式是一致的
基本類型在內(nèi)存中的存儲(chǔ)(一變二不變)
var str1 = 'MRX';
var str2 = str1;
str1 = '變了';
console.log(str1); //變了
console.log(str2); //MRX
復(fù)雜類型在內(nèi)存中的存儲(chǔ)(一變大家變)
function Mrx(name,age,intro) {
this.name = name;
this.age = age;
this.intro = intro;
}
var p1 = new Mrx('MRX',19,'Love Mrx');
var p2 = p1;
p1.name = 'LBL';
console.log(p2.name); //LBL
console.log(p1 === p2); //ture
基本類型作為函數(shù)的參數(shù)(一變二不變)
復(fù)雜類型作為函數(shù)的參數(shù)(一變大家變)
2 內(nèi)置對(duì)象
概念:
JavaScript提供多個(gè)內(nèi)置對(duì)象 String
Math
Array
Array對(duì)象
檢查一個(gè)對(duì)象是否是數(shù)組
instanceof
//缺點(diǎn)是父代(Object)也會(huì)返回true
var arr = ['張三','李四']嘹黔;
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); //true
isArray()
//常用
var arr = ['張三','李四'];
console.log(Array.isArray(arr)); //true
console.log(Array.isArray('arr')); //fales
toString()/ValueOf()
toString() 數(shù)組轉(zhuǎn)換為字符串,逗號(hào)分隔每一項(xiàng)
valueOf() 返回?cái)?shù)組對(duì)象本身
var arr = ['張三','李四']莫瞬;
console.log(arr.toString()); //張三儡蔓,李四
console.log(arr.valueOf() === arr); //true
常用方法
join(separator) (加入)
將數(shù)組的元素組起一個(gè)字符串,以separator為分隔符疼邀,省略的話則默認(rèn)用逗號(hào)為分隔符喂江,該方法只接收一個(gè)參數(shù):即分隔符
separator必須是字符串類型
var arr = ['張三','李四','王五'];
var str = arr.join('-'); //separator必須是字符串類型
console.log(str); //張三-李四-王五
push()和pop()
push() 接受任意數(shù)量的參數(shù)旁振,把他們逐個(gè)添加到數(shù)組末尾获询,并返回修改后數(shù)組的長(zhǎng)度;
pop() 數(shù)組末尾移除最后一項(xiàng)拐袜,減少數(shù)組的length值吉嚣,然后返回移除的項(xiàng)
var arr = ['張三','李四','王五'];
arr.push('小伙');
console.log(arr.push('小伙'))蹬铺; //4
console.log(arr); //張三尝哆,李四,王五甜攀,小伙
arr.pop();
console.log(arr.pop()) //王五
shift()和unshift()
shift() 刪除原數(shù)組第一項(xiàng)较解,并返回刪除元素的值,如果數(shù)組為空則返回undefined
unshift() 將參數(shù)添加到原數(shù)組開(kāi)頭赴邻,并返回?cái)?shù)組長(zhǎng)度
var arr = ['張三','李四','王五'];
arr.shift();
console.log(arr.shift()); //張三
arr.unshift('大伙');
console.log(arr.unshift('大伙')); //3
reverse()
反轉(zhuǎn)數(shù)組項(xiàng)的順序
var arr = [1,2,3,4,5];
arr.revese();
console.log(arr.revese()); //5,4,3,2,1
concat() (常用于網(wǎng)絡(luò)請(qǐng)求啡捶,無(wú)限下拉菜單)
將參數(shù)添加到原數(shù)組中姥敛。這個(gè)方法會(huì)先copy一個(gè)當(dāng)前數(shù)組,然后將接受到的參數(shù)添加到這個(gè)copy數(shù)組的末尾瞎暑,最后返回新構(gòu)建的數(shù)組彤敛。在沒(méi)有給concat()方法傳遞參數(shù)的情況下,他只是復(fù)制當(dāng)前數(shù)組并返回
var arr = [1,2,3,4,5];
var arr1 = [7,8];
var arr2 = [9];
var newArr = arr.concat(arr1);
console.log(newArr); //1,2,3,4,5,6,7,8
var newArr2 = arr.concat(arr1,arr2); //1,2,3,4,5,6,7,8,9
var newArr3 = arr.concat(arr1,arr2,'張三豐'); //1,2,3,4,5,6,7,8,9,張三豐
indexOf()和lastindexOf() index=索引 (常用于獲取文件后綴名)
格式: indexOf(你要找的東西了赌,從哪個(gè)位置開(kāi)始找)墨榄;
var arr = [1,2,3,3,2,1];
arr.indexOf(2);
console.log(arr.indexOf(2)); //1
arr.indexOf(2,2); //4
arr.lastindexOf(1); //5
arr.lastindexOf(1,1); //0
forEach() (常用于遍歷數(shù)組)
這個(gè)方法只支持IE8以上的瀏覽器,所以如果需要兼容IE8勿她,則不要使用forEach袄秩,還是使用for循環(huán)來(lái)遍歷
數(shù)組中有幾個(gè)元素,函數(shù)就會(huì)執(zhí)行幾次,每次執(zhí)行時(shí)之剧,瀏覽器會(huì)將遍歷到元素以實(shí)參的方式傳遞進(jìn)來(lái)郭卫,我們可以來(lái)定義形參,來(lái)讀取這些內(nèi)容
forEach(function (所有內(nèi)容背稼,內(nèi)容對(duì)應(yīng)索引贰军,數(shù)組本身){})
var arr = ['張三','李四','王五'];
arr.forEach(function (value,index,array) {
console.log(value);
console.log(index);
console.log(array);
});
ES6新增
sort() sort=排序
sort方法用于對(duì)數(shù)組的元素進(jìn)行排序赴精,默認(rèn)是按照字符編碼的順序進(jìn)行排序
如果想按照其他標(biāo)準(zhǔn)進(jìn)行排序冒窍,就需要提供比較函數(shù)蝌衔,該函數(shù)要比較兩個(gè)值,然后返回一個(gè)用于說(shuō)明這兩個(gè)值的相對(duì)順序的數(shù)字贰盗,比較函數(shù)應(yīng)該具有兩個(gè)參數(shù)a和b
若a小于b,在排序后的數(shù)組中a應(yīng)該出現(xiàn)在b之前竹椒,則返回一個(gè)小于0的值
若a等于b童太,則返回0
若a大于b,則返回一個(gè)大于0的值
function sortNumber(a,b) {
return a - b //可能會(huì)有 >0 =0 <0 三種可能,從小排到大
return b - a //從大排到小
}
var arr = [10胸完,20书释,5,1000赊窥,50]爆惧;
arr.sort(); //10,1000,20,5,50
arr.sort(sortNumber); //5,10,20,50,1000
實(shí)現(xiàn)方式(冒泡排序)
var arr = [10,20锨能,5扯再,1000,50]址遇;
function sort(array,fuCompare) {
//控制循環(huán)的次數(shù)
for (var i = 0; i < array.length - 1 ; i++) {
//標(biāo)記 是否完成排序
var sortFlag = true熄阻;
//控制比較次數(shù)
for(var j = 0; j<array.length - 1 - i; j++) {
if(fnCompare(array[j],array[j+1]) > 0) {
sortFlag = false;
//交換位置
var temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
//判斷
if(sortFlag) {
break;
}
}
}
function sortNumber(a,b) {
return b - a;
}
sort(arr,sortNumber);
console.log(arr);
map()
映射(一一對(duì)應(yīng)),[].map()基本用法跟forEach方法類似:array.map(callback,[thisObject]);
但是callback需要有return值(如果沒(méi)有倔约,就會(huì)返回undefined)
var arr = [10秃殉,20,5浸剩,1000钾军,50];
var newArr = arr.map(function (value,index,array) {
return value * 2;
return value > 10 && value * 2;
});
console.log(newArr); //輸出[20,40,10,2000,100]
console.log(newArr); //[false,40,false,2000,100]
filer()
過(guò)濾篩選
callback在這里擔(dān)任的時(shí)過(guò)濾器的角色绢要,當(dāng)元素符合條件吏恭,過(guò)濾器就會(huì)返回true,而filter則會(huì)返回所有符合過(guò)濾條件的元素
var arr = [1,2,3,4,5,6,7,8]
varr newArr = arr.filter(function (value,index,array) {
return value % 2 ===0;
return value % 2 ===0 && value > 5;
});
console.log(newArr); //[2,4,6,8]
console.log(newArr); //[6,8]
every(且)
一假則假
會(huì)返回布爾類型的值
var arr = [11,2,3,4,15];
var result = arr.every(function (value,index) {
return value > 1;
return value > 4;
});
console.log(result); //true
console.log(result); //fales
some(或)
一真為真
var arr = [11,2,3,4,15];
var result = arr.some(function (value,index) {
return value > 4;
});
console.log(result); //true
Math對(duì)象
概念
Math對(duì)象不是構(gòu)造函數(shù)重罪,它具有數(shù)學(xué)常數(shù)和函數(shù)的屬性和方法樱哼,都是以靜態(tài)成員的方式提供
常用方法
Math.PI //圓周率
Math.random() //生成隨機(jī)數(shù)
Math.floor()/Math.ceil() //向下取整/向上取整
Math.round() //取整哀九,四舍五入
Math.abs() //絕對(duì)值
Math.max()/Math.min() //求最大和最小值
Math.sin()/Math.cos() //正弦/余弦
Math.power()/Math.sqrt() //求指數(shù)次冪/求平方根
console.log(Math.PI); //輸出圓周率:3.1415926
Math.ceil(Math.PI);
console.log(Math.ceil(Math.PI)); //
console.log(Math.random()); //0-1之間的隨機(jī)數(shù)
console.log(Math.random()*10); //0-10之間的隨機(jī)數(shù)
Math.random() * (y - x) + x ;
//分解:Math.random() = (0,1)
//8 - 3 = 5
//(0,1) * (8 - 3) + 3 = (3,8)
//(0,1) * 5 + 3 = (3,8)
Math.random() * (8 - 3) + 3 ; //3-8之間的隨機(jī)數(shù)
靜態(tài)成員和實(shí)例成員
靜態(tài)成員:直接使用對(duì)象來(lái)調(diào)用
實(shí)例成員:構(gòu)造函數(shù)中的成員就是實(shí)例成員 實(shí)例也稱為對(duì)象
String對(duì)象
概念
字符串所有的方法,都不會(huì)修改字符串本身(字符串是不可變的)唇礁,操作完成會(huì)返回一個(gè)新的字符串
拼接大量字符串的時(shí)候勾栗,會(huì)有性能問(wèn)題
常用方法
獲取字符串中字符的個(gè)數(shù)
str.length
字符方法
charAt() 獲取指定位置處字符
charCodeAt() 獲取指定位置處字符的ASCII碼
var str = 'i love Mrx';
console.log(str.charAt(3)); //o
//獲取所有字符和ASCII碼
for (var i = 0; i < str.length; i++) {
console.log(str.charAt(i));
console.log(str.charCodeAt(i));
}
字符串操作方法
concat() //拼接字符串,+更常用
substr() //從start位置開(kāi)始盏筐,截取length個(gè)字符
var str = 'i love Mrx.exe';
var newStr = str.substr(2,5);
console.log(newStr); //love
var newStr = str.substr(str.lastIndexOf(.));
console.log(newStr); //.exe
var newStr = str.substr(str.lastIndexOf(.) + 1);
console.log(newStr); //exe
去除空白 trim() 只能去除字符串前后的空白
var str = ' i love Mrx.exe ';
console.log(str.trim()); //去除前后空格
大小寫(xiě)轉(zhuǎn)換
toUpperCase() 轉(zhuǎn)換大寫(xiě)
toLowerCase() 轉(zhuǎn)換小寫(xiě)