前面講過统阿,根據(jù)內(nèi)存不同。變量分為:基本數(shù)據(jù)類型和引用類型
對象是某個特定引用的實例姥卢。新對象是使用new操作符卷要,緊跟一個構(gòu)造函數(shù)。
1.Object數(shù)據(jù)類型独榴。
1.
創(chuàng)建Object實例方法僧叉。
//第一種:構(gòu)造函數(shù)創(chuàng)建
var obj = new Object();
obj.age = 12;
//第二種:字面量創(chuàng)建,不會調(diào)用Object構(gòu)造函數(shù)
var person = {
age:12
}
var person1= {};
person.age = 12;
注意:字面量創(chuàng)建棺榔,索引會自動轉(zhuǎn)換為字符串瓶堕。
2.屬性訪問
1.
一般來講,我們都是采用.屬性進行訪問屬性值的症歇。
2.
但是捞烟,我們也可以采用[屬性]進行屬性值訪問。
使用方法區(qū)別:
一般我們使用.屬性当船。但是有些屬性里面包含了空格或者采用變量的方法進行訪問的時候题画,我們就使用[屬性]進行訪問。
2.Array類型
數(shù)組的每一項都可以保存不同的類型的值
1.
創(chuàng)建數(shù)組的方法
//第一種方法:
var color = new Array();
//如果事先知道數(shù)組的大小德频,還可以傳入數(shù)組的大小苍息,或者值
var color1 = new Array(20);//每一個值都是undefined
var color2 = new Array("red", "blue", "green");
//第二種方法
var color3 = ["yellow", "white", "pink"];
//注意不要這樣
var color3 = ["yellow", "white", ];//很容易報錯
2.
length屬性
數(shù)組的length屬性,可以返回數(shù)組的長度壹置。但是這個屬性并不是只讀的竞思,是可以設置的。
var color = ["yellow", "white", "pink"];
color[2]//pink
color.length = 2;
color[2]//undefined
如果length大于數(shù)組的值钞护,后面會添加empty值(undefined)盖喷,如果小于,那樣就會移除數(shù)組的值难咕。數(shù)組是有一定長度的课梳,超出了會影響性能并且發(fā)生異常距辆。
3.
檢測數(shù)組
1.value instanceof Array
之前講過instanceof的原理:左邊的原型鏈上能否找到右面的prototype相對應的值。但是它有局限性暮刃。不同的全局環(huán)境跨算,構(gòu)造函數(shù)的prototype是不相同的。
2.Array.isArray(value)
4.
轉(zhuǎn)換方法
1.所有對象都有toLocalString(),toString(),valueOf()方法椭懊。注意null和undefined沒有這些方法
[1, 2].toString(); //"1,2"
toLocalString(); //會調(diào)用數(shù)組每一項的toLocalString
toString();//會調(diào)用數(shù)組每一項的toString
alert是調(diào)用的toString
2.join方法
在數(shù)組的每一個項之間诸蚕,添加join方法傳入的參數(shù)。
var color = ["yellow", "white", "pink",,,,,];
color.join('||')//"yellow||white||pink||||||||"
3.棧方法氧猬,會返回數(shù)組長度
1.
push方法背犯,在棧的頂部插入
var color = ["yellow", "white", "pink"];
color.push('blue');
color; //["yellow", "white", "pink", "blue"]
2.
pop方法
pop不接受傳值,在棧的頂部彈出
var color = ["yellow", "white", "pink"];
color.pop();
color;//["yellow", "white"];
4.隊列方法
1.
shift
var color = ["yellow", "blue"];
color.shift();//"yellow"
2.
unshift在我看來盅抚,和push的作用是一樣的媳板。
var color = ["yellow", "blue"];
color.unshift('green','black');
color// ["green",'black', "yellow", "blue"]
5.重排序方法
1.
reverse():反轉(zhuǎn)數(shù)組
var color = ["yellow", "blue"];
color.reverse()//["blue", "yellow"]
2.
sort():對數(shù)組進行排序
它是根據(jù)字符串編碼進行排序,因此不能直接使用這個方法泉哈。但是它提供了傳入一個函數(shù)作為參數(shù)蛉幸,便于我們判斷。這個函數(shù)需要傳入兩個參數(shù)丛晦,如果需要反轉(zhuǎn)則返回一個正數(shù)奕纫,否則返回一個負數(shù)。
var a = [2,6,4,7,3];
undefined
a.sort(function(a,b){
if(a>b){
return 1
}else{
return -1
}
})
a;// [2, 3, 4, 6, 7]
//但是我們往往采用減的方法
a.sort(function(a,b){
return a-b;
})//[2, 3, 4, 6, 7]
6.操作方法
1.
concat方法烫沙∑ゲ悖基于當前數(shù)組,創(chuàng)建一個新數(shù)組锌蓄。
在沒有傳參的情況下升筏,只是復制當前數(shù)組并返回副本。如果傳入是一個或者多個數(shù)組瘸爽,會把數(shù)組的每一項您访,添加到當前數(shù)組的副本。不是數(shù)組剪决,會簡單的添加到末尾灵汪。
var a = [2,6,4,7,3];
a.concat('2',[1,2,3,[4,5]],{'name':'alen'});
a;//[2, 6, 4, 7, 3, "2", 1, 2, 3, Array(2), {…}]
2.
slice方法「塘剩基于當前數(shù)組創(chuàng)建一個或者多個數(shù)組享言。接收一個或者兩個參數(shù)。當傳入一個參數(shù)渗鬼,表示返回當前位置開始到最后一個參數(shù)览露。傳入兩個參數(shù),表示返回第一個參數(shù)到第二個參數(shù)之間的數(shù)據(jù)譬胎。
var a = [2,6,4,7,3];
a.slice(1)//[6, 4, 7, 3]
a.slice(1,4)//[6, 4, 7]
3.
splite()方法差牛∶可以插入,刪除多糠,替換等操作累舷。其中可以傳入浩考〖锌祝可以傳入多個參數(shù)(a,b,c,d,e)a代表開始位置,b表示刪除多少項析孽,c,d,f表示在a之后插入的參數(shù)
var a = [2,6,4,7,3];
a.splice(1,1)//返回刪除的項 刪除
a// [2, 4, 7, 3];
a.splice(1,0,10,20)//插入
a//[2, 10, 20, 4, 7, 3]
a.splice(1,1,60)//修改
a//[2, 60, 20, 4, 7, 3]
7.位置方法
1.
indexOf()
2.
lastIndexOf()
都可以接收兩個參數(shù)搭伤,要查找的項目(必須),起始位置(可選)袜瞬。使用===操作符
8.迭代方法
1.
every():每一個返回true則返回true
var a = [2,6,4,7,3];
a.every(function(item,index,array){
return item >= 2
})
//true
2.
filter():返回為true的項怜俐,組成數(shù)組
3.
forEach():運行給定函數(shù),沒有返回值邓尤。
4.
map():調(diào)用結(jié)構(gòu)組成數(shù)組
5.
some():有一個返回true則返回true
9.歸并方法
1.
reduce():從第一項開始迭代
2.
reduceRight():從最后一項開始迭代
這兩個方法都會迭代數(shù)組的所有項拍鲤,構(gòu)建一個最終返回值。都接收4個參數(shù)(a,b,c,d)a表示前一個值汞扎,b表示當前值季稳,c表示,項目索引澈魄,d表示數(shù)組對象
var num = a.reduce(function(pre,cur,index,arr){
return pre+cur
})
num//22
3.Date類型
主要掌握獲取年月日的方法景鼠。可以自行查詢API
4.RegExp
1.創(chuàng)建方法
pattern:表示匹配的方法
flags:匹配模式包含3種模式:
g:全局匹配痹扇,并非在找到一個后就返回
i:不分大小寫模式
m:多行匹配
var expression = / pattern / flags;
var expression = new RexExp(pattern, flags);//注意傳遞的兩個參數(shù)都是字符串
//eg:匹配所有有at的實例
var pattern1 = /at/g;
使用正則表達式字面量和RegExp構(gòu)造函數(shù)創(chuàng)建的正則表達式不一樣铛漓。
在ES3中,正則表達式的字面量會共享一個RexExp實例鲫构。使用構(gòu)造函數(shù)浓恶,每一次都會創(chuàng)建一個實例。
//eg:
var re = null;
i;
for(i=0; i<10; i++){
re = /cat/g;
re.test('catastrophe');
}
for(i=0; i<10; i++){
re = new RegExp('cat', 'g');
re.test('catastrophe');
}
3.每個RegExp實例都有以下屬性
1.
global:是否設置g標值
2.
ignoreCase:是否設置i標值
3.
multiline:是否設置m標值
4.
lastIndex:開始搜索的下一個匹配字符位置结笨。
5.
source:字符串模式
4.RegExp實例方法
1.
exec():接收要匹配的字符串问顷。返回包含第一個匹配項信息的數(shù)組,沒有匹配的情況下返回null禀梳。它有額外的兩個屬性
index:匹配項在字符串中位置
input:應用正則表達式的字符串
//對于這個方法而言
//即使在模式中設置了g標志整胃,他每次都只會返回一個匹配項
//不設置全局標志的情況下
//在同一個字符上多次調(diào)用該方法,都只會返回第一個匹配項
//設置了g標志
//每次調(diào)用都會在字符串中繼續(xù)查找新的匹配項加矛。
//eg:
var text = 'cat, bat, sat, fat';
var pattern1 = /.at/;
var match1 = pattern1.exec(text)
console.log(match1[0]);//cat
var match2 = pattern1.exec(text)
console.log(match2[0]);//cat
var pattern2 = /.at/g;
var match3 = pattern2.exec(text)
console.log(match3[0]);//cat
var match4 = pattern2.exec(text)
console.log(match4[0]);//bat
2.
test()
接受一個字符串作為參數(shù)隘梨。有匹配的情況下,返回true嘴瓤,否則返回false扫外。這里對于上面的/g就不太適用了莉钙。可能是瀏覽器升級的原因筛谚。理論上加上/g不能一直匹配磁玉。
還有一點。構(gòu)造函數(shù)形式使用toString()會轉(zhuǎn)化為字面量形式驾讲。
var pattern = new RegExp('\\[bc]\\]at','g')
pattern.toString()//"/\[bc]\]at/g"
掌握到這種程度已經(jīng)夠用了哈N蒙 !吮铭!
5.Function類型
1.每個函數(shù)都是Function對象的實例时迫。
2.創(chuàng)建函數(shù)的方式
//不能夠在聲明之前使用
var add = function (add1, add2){
return add1+add2;
}
//可以在聲明之前使用
function sum(sum1, sum2){
return sum1+sum2;
}
var sum2 = new Function('sum1', 'sum2', 'return sum1+sum2');//建議不使用這種方法
3.函數(shù)名其實是一個指向函數(shù)對象的指針。不會與函數(shù)名綁定
function add(add1, add2){
return add1+add2;
}
var sum = add(1,2);
console.log(sum);//3
var add2 = add;
add = null;
var sum2 = add2(3,4);
console.log(sum2);//7
4.在js中沒有函數(shù)重載谓晌,可以函數(shù)重寫掠拳。后面的函數(shù)會覆蓋前面的函數(shù)。
5.函數(shù)可以作為參數(shù)或者作為值纸肉。因為函數(shù)名本身就是一個引用溺欧。這個就涉及到閉包。后面繼續(xù)為大家講解柏肪。
6.函數(shù)內(nèi)部屬性
函數(shù)里面有兩個特殊對象姐刁。
1.
arguments:這是一個類數(shù)組對象,保存函數(shù)傳入?yún)?shù)预吆。具有callee屬性龙填。指向當前的函數(shù)。
function factorial(a){
if(a<=1){
return 1;
}else{
return a*arguments.callee(a-1);
}
}
factorial(4)//24
2.
this:函數(shù)執(zhí)行的環(huán)境對象拐叉。誰調(diào)用就指向的誰岩遗。其中函數(shù)caller屬性保存this指向的對象。
arguments.callee.caller//函數(shù)的調(diào)用者凤瘦。
但是不同的瀏覽器可能可能運行結(jié)果不同宿礁,容易出錯。
并且嚴格模式下蔬芥,不能為caller屬性賦值梆靖。
7.函數(shù)屬性和方法
1.
length。表示函數(shù)希望接收的參數(shù)笔诵。
2.
prototype返吻。屬性不可枚舉。
3.
call()//調(diào)用對象乎婿,參數(shù)1测僵,參數(shù)2,參數(shù)3......
4.
apply()//調(diào)用對象,數(shù)組參數(shù)捍靠。
5.
bind()//創(chuàng)建一個函數(shù)實例沐旨,this會綁定到傳給bind()函數(shù)的值
window.color = "red";
var o = {color : "blue"};
function sayColor(){
alert(this.color);
}
var objSayColor = sayColor.bind(o);
objSayColor();//blue
6.基本包裝類型
Boolean,String,Number
這些其實是基本數(shù)據(jù)類型,但是我們發(fā)現(xiàn)可以使用很多方法榨婆。作為基本數(shù)據(jù)類型是沒有屬性的磁携,更不談有什么方法。但是我們?yōu)槭裁茨苁褂眠@些方法呢良风。因為它被包裝了谊迄。
eg
var s1 = "some text";
s1.substring(2)//me text
//其中完成了這樣的過程
//1.創(chuàng)建一個String類型的實例var s1 = new String("some text");
//2.在實例上調(diào)用這個方法s1.substring(2)//me text;
//3.銷毀這個實例s1 = null;
//當然,第二種方法如果不銷毀拖吼,會占用內(nèi)存等問題
//但是第一種方法會自動銷毀鳞上。所以这吻,建議使用第一種
1.
Boolean
基本包裝類型吊档,使用typeof都是object類型。
注意:我們不建議這樣使用還有一個原因
var falseObj = new Boolean(false);
var result = falseObj&&true;//true;
//原因唾糯,對象只要不是null怠硼,轉(zhuǎn)為bool值都是true。
2.
Number
1.里面包含之前講的一些方法移怯。
2.還有toFixd方法
3.toExponential(n)方法n表示數(shù)字部分的位數(shù)
3.
String
它包含了很多方法
var stringValue = 'hello world';
stringValue.charAt(1);//e
stringValue.charCodeAt(1);//101
stringValue[1]//e
stringValue.concat(',' , 'I love you');//hello world,I love you
stringValue.slice(1,4)//ell
stringValue.substring(1,4)//ell
stringValue.substr(0,4)//ello
stringValue.slice(1)//ello world
stringValue.substring(1)//ello world
stringValue.substr(1)//ello world
//但是對于負數(shù)的情況注意
//slice把所有負數(shù)轉(zhuǎn)為正數(shù)香璃,方法:與字符串長度相加
//substr:第一個轉(zhuǎn)為正數(shù),第二個轉(zhuǎn)為0舟误,方法:與字符串長度相加
//substring:所有負數(shù)轉(zhuǎn)為0葡秒。
stringValue.indexOf('o');//4
stringValue.lastIndexOf('o');//7
stringValue.lastIndexOf('o',6);//4 表示6之后的字符串忽略
stringValue.indexOf('o',5);//7 表示從5之后開始查找
var stringValue2 = ' hello world ';
stringValue2.trim();//hello world
stringValue2.toUpperCase()//" HELLO WORLD "
stringValue2.toLowerCase()//" hello world "
//match方法
var stringValue3 = ' hello world ell '
stringValue3.match(/.ell/g);//["hell", " ell"] 有index和lastIndex屬性
//search方法
stringValue3.search(/.ello/g);//4始終從頭開始查找
stringValue3.search(/.ello/g);//4
//replace方法
var stringValue4 = 'cat, bat, hat';
stringValue4.replace(/at/g , 'ond');//"cond, bond, hond"
stringValue4.replace(/at/ , 'ond');//"cond, bat, hat"
7.單體內(nèi)置對象
1.Global對象
2.Math對象