麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

JavaScript基礎(chǔ)篇(3)之Object、Function等引用類(lèi)型

2024-05-06 16:25:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了JavaScript基礎(chǔ)篇(3)之Object、Function等引用類(lèi)型的相關(guān)資料,需要的朋友可以參考下
 

閱讀目錄

Object類(lèi)型

1、通過(guò)構(gòu)造函數(shù)來(lái)創(chuàng)建
2、通過(guò)字面量表示法來(lái)創(chuàng)建對(duì)象

Array類(lèi)型

同樣Array也有兩種創(chuàng)建方式:
如果我們想要打印數(shù)組中所有的值,直接打印數(shù)組的變量名就可以:
往數(shù)組添值:
棧方法、隊(duì)列方法:
 關(guān)于數(shù)組的排序:
 數(shù)組的一些操作方法:
查找位置方法
迭代方法

歸并方法

Date類(lèi)型

RegExp類(lèi)型

Function類(lèi)型

三種表示法:

方法重載
函數(shù)內(nèi)部屬性(arguments 和 this)

基本包裝類(lèi)型

瀏覽器的內(nèi)置對(duì)象
URI 編碼方法

總結(jié)

我們?cè)凇兑徊讲綄W(xué)習(xí)javascript基礎(chǔ)篇(1):基本概念》中簡(jiǎn)單的介紹了五種基本數(shù)據(jù)類(lèi)型Undefined、Null、Boolean、Number和String。今天我們主要介紹下復(fù)雜數(shù)據(jù)類(lèi)型(即引用數(shù)據(jù)類(lèi)型)

Object類(lèi)型

我們用的最多的引用類(lèi)型就屬object類(lèi)型了,一般用來(lái)存儲(chǔ)和傳輸數(shù)據(jù)是再好不過(guò)的。然,它的兩種創(chuàng)建方式我們是否了解呢?

1、通過(guò)構(gòu)造函數(shù)來(lái)創(chuàng)建

如: var obj = new Object();

在js中的引用類(lèi)型有個(gè)非常靈活的用法,可以動(dòng)態(tài)的附加屬性和賦值。

如:

var obj = new Object();obj.name = "張三";//動(dòng)態(tài)添加屬性并賦值obj.age = 23;alert(obj.name);

2、通過(guò)字面量表示法來(lái)創(chuàng)建對(duì)象

現(xiàn)在大家用得比較多的就是字面量表示法來(lái)創(chuàng)建對(duì)象了。

如:

var obj = { name: "張三", age: 23};alert(obj.age);

和上面的效果是等效的。通過(guò)這樣方式創(chuàng)建感覺(jué)結(jié)構(gòu)更加的清晰,更加有封裝的感覺(jué)。:)

我們還可以這樣用

如:

var obj = {};obj.name = "張三";obj.age = 23;alert(obj.age);

如:

var obj = { "name": "張三",//給屬性加上雙引號(hào) age: 23};alert(obj.name);

是不是感覺(jué)很強(qiáng)大很靈活呢?我在訪問(wèn)屬性的時(shí)候一般都是點(diǎn)出來(lái),但是還有另外的方式。

如:(我們可以使用中括號(hào)的形式來(lái)訪問(wèn)屬性值)

var obj = { "name tow": "張三", age: 23};//alert(obj.name tow);//這里會(huì)報(bào)錯(cuò),屬性不能有空格alert(obj["name tow"]);//這里可以正常彈出

例:

Array類(lèi)型

除了object之外,應(yīng)該屬數(shù)組用的最多了。下面來(lái)羅列下常見(jiàn)用法。

同樣Array也有兩種創(chuàng)建方式:

var arr = new Array(1, 2, 3, 4, 5);//通過(guò)構(gòu)造函數(shù)創(chuàng)建var arr2 = [5, 4, 3, 2, 1];//通過(guò)字面量表達(dá)式來(lái)創(chuàng)建 

上面兩種方式是等效的,我們可以直接通過(guò)下標(biāo)的方式來(lái)訪問(wèn)數(shù)組: alert(arr[2]); 。

如果我們想要打印數(shù)組中所有的值,直接打印數(shù)組的變量名就可以:

var arr2 = [5, 4, 3, 2, 1];//通過(guò)字面量表達(dá)式來(lái)創(chuàng)建var str2 = "";for (var i = 0; i < arr2.length; i++) { str2 += arr2[i] + ","}alert(str2);//打印拼接的字符串  alert(arr2);//直接打印變量名(實(shí)際上會(huì)自動(dòng)調(diào)用數(shù)組的toString方法)

例:

 var arr2 = [5, 4, 3, 2, 1];//通過(guò)字面量表達(dá)式來(lái)創(chuàng)建var str2 = "";for (var i = 0; i < arr2.length; i++) { str2 += arr2[i] + ","}alert(str2);//打印拼接的字符串

例:

 var arr2 = [5, 4, 3, 2, 1];//通過(guò)字面量表達(dá)式來(lái)創(chuàng)建alert(arr2);//直接打印變量名(實(shí)際上會(huì)自動(dòng)調(diào)用數(shù)組的toString方法)

上面直接打印arr2,我們發(fā)現(xiàn)默認(rèn)都是以逗號(hào)分隔的。那么有時(shí)候,我們不想用逗號(hào)怎么辦呢。那你可能可以用到j(luò)oin方法

 var arr2 = [5, 4, 3, 2, 1];//通過(guò)字面量表達(dá)式來(lái)創(chuàng)建alert(arr2.join('_'));//直接打印變量名(實(shí)際上會(huì)自動(dòng)調(diào)用數(shù)組的toString方法)

往數(shù)組添值:

我們可以直接: arr2[4] = 7; arr2[5] = 8; 

還有一種更加巧妙地添值方式: arr2[arr2.length] = 9; arr2[arr2.length] = 10; ,下標(biāo)length剛好是數(shù)組最大長(zhǎng)度的下一個(gè),添加值后length再次動(dòng)態(tài)自動(dòng)累計(jì)。

棧方法、隊(duì)列方法:

什么是棧?(后進(jìn)先出)。什么是隊(duì)列?(先進(jìn)先出),我們?cè)鯓佑脭?shù)組來(lái)模仿這種數(shù)據(jù)結(jié)構(gòu)的訪問(wèn)方式?下面通過(guò)一張圖來(lái)解釋下數(shù)組對(duì)象提供的四個(gè)方法。

JavaScript基礎(chǔ)篇(3)之Object、Function等引用類(lèi)型

從圖可以看出:shift和push、unshift和pop的組合可以實(shí)現(xiàn)棧的數(shù)據(jù)結(jié)構(gòu)訪問(wèn),shitf和pop、shift和unshift的組合可以實(shí)現(xiàn)隊(duì)列的數(shù)據(jù)機(jī)構(gòu)訪問(wèn)方式。 這里需要注意:pop和shift取數(shù)據(jù)的同時(shí),數(shù)組中對(duì)于的值也同時(shí)移除了。

例:

 var arr2 = [5, 4, 3, 2, 1];alert("arr2.pop:" + arr2.pop() + " arr2:" + arr2);

 關(guān)于數(shù)組的排序:

關(guān)于數(shù)組的排序有sort(正)reverse(反)。

先看個(gè)例子,大家猜想下結(jié)果:

var arr2 = [5, 14, 23, 12, 1];alert(arr2.sort());

 然結(jié)果并不是我們想要的:

 var arr2 = [5, 14, 23, 12, 1];alert(arr2.sort());

 為什么會(huì)這樣呢?因?yàn)閟ort不會(huì)直接比較數(shù)字類(lèi)型,而已轉(zhuǎn)為string了再做的比較。那么我們想要比較數(shù)字怎辦?我們可以往sort傳函數(shù),例:

 function mycompare(o1, o2){ return o1 - o2;//如果為正數(shù)則o1大,負(fù)數(shù)則o2大,零則相等。}var arr2 = [5, 14, 23, 12, 1];alert(arr2.sort(mycompare));

 有人會(huì)問(wèn)o1和o2是怎么來(lái)的?這是sort函數(shù)規(guī)定的。這樣說(shuō)大家可能不好接受。下面,我們自己來(lái)模擬下sort的排序,大家就明白了。

var arr2 = [5, 14, 23, 12, 1, 123, 23, 4, 5, 6, 32, 5, 3, 2, 1];arr2.mysort = function (fun) { //*********************具體排序過(guò)程******************* for (var i = 0; i < arr2.length - 1; i++) {  for (var j = 0; j < arr2.length - i; j++) {   if (fun(arr2[j], arr2[j + 1]) > 0) {//這里用我們傳進(jìn)來(lái)的方法判斷是否要排序調(diào)換位置    var temp = arr2[j];    arr2[j] = arr2[j + 1];    arr2[j + 1] = temp;   }  } } //*************************************************** return arr2;} function mycompare(o1, o2) { return o1 - o2;//回調(diào)函數(shù)(具體的比較規(guī)則)}alert(arr2.mysort(mycompare)); var arr2 = [5, 14, 23, 12, 1, 123, 23, 4, 5, 6, 32, 5, 3, 2, 1];arr2.mysort = function (fun) { //*********************具體排序過(guò)程******************* for (var i = 0; i < arr2.length - 1; i++) {  for (var j = 0; j < arr2.length - i; j++) {  if (fun(arr2[j], arr2[j + 1]) > 0) {//這里用我們傳進(jìn)來(lái)的方法判斷是否要排序調(diào)換位置   var temp = arr2[j];   arr2[j] = arr2[j + 1];   arr2[j + 1] = temp;   }  } } //*************************************************** return arr2;}function mycompare(o1, o2) { return o1 - o2;//回調(diào)函數(shù)(具體的比較規(guī)則)}alert(arr2.mysort(mycompare));

當(dāng)然,我們模擬的并不是那么的好,大概就是這么個(gè)意思。

反序就簡(jiǎn)單了:(直接reverse()就可以了)

function mysort(o1, o2){ return o1 - o2;//如果為正數(shù)則o1大,負(fù)數(shù)則o2大,零則相等。}var arr2 = [5, 14, 23, 12, 1];arr2.sort(mysort);arr2.reverse();alert(arr2);

數(shù)組的一些操作方法:
concat創(chuàng)建一個(gè)新的副本,并合并傳進(jìn)來(lái)的參數(shù)

var colors = ["red", "green", "blue"];var colors2 = colors.concat("yellow", ["black", "brown"]);alert(colors); //red,green,bluealert(colors2); //red,green,blue,yellow,black,brow

slice創(chuàng)建一個(gè)新的副本,取數(shù)組的位置數(shù)據(jù)

var colors = ["red", "green", "blue", "yellow", "purple"];var colors2 = colors.slice(1);//從下標(biāo)為1的開(kāi)始,到末尾var colors3 = colors.slice(1, 4);//從下標(biāo)1(包含1)到4(不包含4)alert(colors2); //green,blue,yellow,purplealert(colors3); //green,blue,yellow

splice會(huì)改變?cè)瓟?shù)組數(shù)據(jù),可實(shí)現(xiàn)對(duì)數(shù)組的刪、插和替換

 var colors = ["red", "green", "blue"]; var removed = colors.splice(0, 1); // 刪除第一項(xiàng)(從下標(biāo)0開(kāi)始,刪除1項(xiàng)) alert(colors); // green,blue alert(removed); // red,返回的數(shù)組中只包含一項(xiàng) removed = colors.splice(1, 0, "yellow", "orange"); // 從位置 1 開(kāi)始插入兩項(xiàng)(從下標(biāo)0開(kāi)始,刪除0項(xiàng),并插入后面的參數(shù)數(shù)據(jù)) alert(colors); // green,yellow,orange,blue alert(removed); // 返回的是一個(gè)空數(shù)組 removed = colors.splice(1, 1, "red", "purple"); // 插入兩項(xiàng),刪除一項(xiàng)(從下標(biāo)1開(kāi)始,刪除1項(xiàng)[也就是yellow],并插入后面的參數(shù)數(shù)據(jù)) alert(colors); // green,red,purple,orange,blue alert(removed); // yellow,返回的數(shù)組中只包含一項(xiàng)

查找位置方法

indexOf()和 lastIndexOf(),就是查找在數(shù)組中的位置,和string中的對(duì)應(yīng)方法差不多。

迭代方法

? every():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回 true,則返回 true。
? filter():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回該函數(shù)會(huì)返回 true 的項(xiàng)組成的數(shù)組。
? forEach():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)。這個(gè)方法沒(méi)有返回值。
? map():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組。
? some():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)任一項(xiàng)返回 true,則返回 true。

以上方法都不會(huì)修改數(shù)組中的包含的值。

如:

var numbers = [1,2,3,4,5,4,3,2,1];var everyResult = numbers.every(function(item, index, array){return (item > 2);});alert(everyResult); //false

其中。forEach和map區(qū)別不大,只是一個(gè)有返回值,一個(gè)沒(méi)有。實(shí)際中我們用forEach比較多,下面我們模擬forEach的實(shí)現(xiàn)。

var str = "", str2 = "";var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];numbers.forEach(function (item, index, array) { str += item + "_";});//**************其實(shí)我們完全可以自己模擬實(shí)現(xiàn)*******numbers.myforEach = function (fun) { for (var i = 0; i < numbers.length; i++) {  fun(numbers[i], i, numbers); }}numbers.myforEach(function (item, index, array) { str2 += item + "*";})//***************************************************alert("str:" + str + " str2:" + str2);var str = "", str2 = "";var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];numbers.forEach(function (item, index, array) { str += item + "_";});//**************其實(shí)我們完全可以自己模擬實(shí)現(xiàn)*******numbers.myforEach = function (fun) { for (var i = 0; i < numbers.length; i++) {  fun(numbers[i], i, numbers); }}numbers.myforEach(function (item, index, array) { str2 += item + "*";})//***************************************************alert("str:" + str + " str2:" + str2);

歸并方法

 reduce()和 reduceRight(),這兩個(gè)方法是比較有意思的,以前還真沒(méi)接觸過(guò)。先看例子,再解釋?zhuān)?/p>

var values = [1,2,3,4,5];var sum = values.reduce(function(prev, cur, index, array){ return prev + cur;});alert(sum); //15

也是個(gè)循環(huán),第一次執(zhí)行 prev 是 1, cur 是 2。第二次, prev 是 3(1 加 2 的結(jié)果), cur 是 3(數(shù)組的第三項(xiàng))。這個(gè)過(guò)程會(huì)持續(xù)到把數(shù)組中的每一項(xiàng)都訪問(wèn)一遍,最后返回結(jié)果。reduceRight只是方向相反。

下面我們來(lái)模擬:

var numbers = [1, 2, 3, 4, 5, 3];var sum = numbers.reduce(function (prev, cur, index, array) { return prev + cur;});//***********************模擬實(shí)現(xiàn)reduce**************************numbers.myreduce = function (fun) { for (var i = 0; i < numbers.length; i++) {  var temp = 0;  for (var j = 0; j < i; j++)   temp += numbers[j];  var tempNum = fun(temp, numbers[i], i, numbers); } return tempNum;}//*************************************************var sum2 = numbers.myreduce(function (prev, cur, index, array) { return prev + cur;})alert("sum:" + sum + " sum2:" + sum2); //var numbers = [1, 2, 3, 4, 5, 3];var sum = numbers.reduce(function (prev, cur, index, array) { return prev + cur;});//***********************模擬實(shí)現(xiàn)reduce**************************numbers.myreduce = function (fun) {for (var i = 0; i < numbers.length; i++) { var temp = 0; for (var j = 0; j < i; j++)  temp += numbers[j];   var tempNum = fun(temp, numbers[i], i, numbers);  }  return tempNum;}//*************************************************var sum2 = numbers.myreduce(function (prev, cur, index, array) { return prev + cur;})alert("sum:" + sum + " sum2:" + sum2); //

Date類(lèi)型

我們很多時(shí)候需要測(cè)試一個(gè)函數(shù)的性能,可以取它的執(zhí)行進(jìn)過(guò)時(shí)間:

//取得開(kāi)始時(shí)間var start = Date.now();//調(diào)用函數(shù)doSomething();//取得停止時(shí)間var stop = Date.now(),result = stop – start;

下面列出一些常用方法

getTime() 返回表示日期的毫秒數(shù);與valueOf()方法返回的值相同
setTime(毫秒) 以毫秒數(shù)設(shè)置日期,會(huì)改變整個(gè)日期
getFullYear() 取得4位數(shù)的年份(如2007而非僅07)
getUTCFullYear() 返回UTC日期的4位數(shù)年份
setFullYear(年) 設(shè)置日期的年份。傳入的年份值必須是4位數(shù)字(如2007而非僅07)
setUTCFullYear(年) 設(shè)置UTC日期的年份。傳入的年份值必須是4位數(shù)字(如2007而非僅07)
getMonth() 返回日期中的月份,其中0表示一月, 11表示十二月
getUTCMonth() 返回UTC日期中的月份,其中0表示一月, 11表示十二月
setMonth(月) 設(shè)置日期的月份。傳入的月份值必須大于0,超過(guò)11則增加年份
setUTCMonth(月) 設(shè)置UTC日期的月份。傳入的月份值必須大于0,超過(guò)11則增加年份
getDate() 返回日期月份中的天數(shù)(1到31)
getUTCDate() 返回UTC日期月份中的天數(shù)(1到31)
setDate(日) 設(shè)置日期月份中的天數(shù)。如果傳入的值超過(guò)了該月中應(yīng)有的天數(shù),則增加月份
setUTCDate(日) 設(shè)置UTC日期月份中的天數(shù)。如果傳入的值超過(guò)了該月中應(yīng)有的天數(shù),則增加月份
getDay() 返回日期中星期的星期幾(其中0表示星期日, 6表示星期六)
getUTCDay() 返回UTC日期中星期的星期幾(其中0表示星期日, 6表示星期六)
getHours() 返回日期中的小時(shí)數(shù)(0到23)
getUTCHours() 返回UTC日期中的小時(shí)數(shù)(0到23)
setHours(時(shí)) 設(shè)置日期中的小時(shí)數(shù)。傳入的值超過(guò)了23則增加月份中的天數(shù)
setUTCHours(時(shí)) 設(shè)置UTC日期中的小時(shí)數(shù)。傳入的值超過(guò)了23則增加月份中的天數(shù)
getMinutes() 返回日期中的分鐘數(shù)(0到59)
getUTCMinutes() 返回UTC日期中的分鐘數(shù)(0到59)
setMinutes(分) 設(shè)置日期中的分鐘數(shù)。傳入的值超過(guò)59則增加小時(shí)數(shù)
setUTCMinutes(分) 設(shè)置UTC日期中的分鐘數(shù)。傳入的值超過(guò)59則增加小時(shí)數(shù)
getSeconds() 返回日期中的秒數(shù)(0到59)
getUTCSeconds() 返回UTC日期中的秒數(shù)(0到59)
setSeconds(秒) 設(shè)置日期中的秒數(shù)。傳入的值超過(guò)了59會(huì)增加分鐘數(shù)
setUTCSeconds(秒) 設(shè)置UTC日期中的秒數(shù)。傳入的值超過(guò)了59會(huì)增加分鐘數(shù)
getMilliseconds() 返回日期中的毫秒數(shù)
getUTCMilliseconds() 返回UTC日期中的毫秒數(shù)
setMilliseconds(毫秒) 設(shè)置日期中的毫秒數(shù)
setUTCMilliseconds(毫秒) 設(shè)置UTC日期中的毫秒數(shù)
getTimezoneOffset() 返回本地時(shí)間與UTC時(shí)間相差的分鐘數(shù)。例如,美國(guó)東部標(biāo)準(zhǔn)時(shí)間返回300。在某地進(jìn)入夏令時(shí)的情況下,這個(gè)值會(huì)有所變化

RegExp類(lèi)型

兩種表示法:

var pattern1 = /at/g; var re = new RegExp("cat", "g"); 

后面的參數(shù)代表模式,如:g:表示全局(global)模式、i:表示不區(qū)分大小寫(xiě)(case-insensitive)模式、m:表示多行(multiline)模式

關(guān)于正則了解不是很清楚,后期有機(jī)會(huì)在單獨(dú)學(xué)習(xí)整理正則這塊。

Function類(lèi)型

三種表示法:

function sum (num, num) { return num + num; } var sum = function(num, num){ return num + num; }; var sum = new Function("num", "num", "return num + num"); 

以上三種都是可行的,不過(guò)我們平時(shí)用得比較多的是第一種,第二種也有用,第三種用得比較少,但是最能看出function的本質(zhì),其實(shí)就是一個(gè)Function對(duì)象的實(shí)例。

我們來(lái)看看1和2的區(qū)別。

alert(sum1(1, 2));//彈出值 3alert(sum2(1, 2));//報(bào)異常[sum2 is not a function]function sum1(num1, num2) { return num1 + num2; }var sum2 = function (num1, num2) { return num1 + num2; };

因?yàn)閖s解析器是從上到下的解析,在執(zhí)行sum2的時(shí)候還沒(méi)有定義,所以報(bào)異常。但是sum1比較特殊,是申明式的。在執(zhí)行sum1之前就會(huì)”預(yù)解析“(函數(shù)聲明提升)。相當(dāng)于把sun1的定義提到了最上面(放到源代碼樹(shù)的頂部)。

方法重載

嚴(yán)格來(lái)說(shuō),js中是沒(méi)有方法重載的,不過(guò)我們可以根據(jù)參數(shù)的個(gè)數(shù)來(lái)模擬。(還有,js中函數(shù)的形參我們是不確定類(lèi)型的)

例:
上面并沒(méi)有出現(xiàn)我們預(yù)料中的結(jié)果,因?yàn)榈诙味x的sun1不是實(shí)現(xiàn)的重載,而是直接覆蓋了第一次的定義。下面,我們就簡(jiǎn)單的模擬實(shí)現(xiàn)方法重載:

function sum1(num1, num2, num3) { if (num1 != undefined && num2 != undefined && num3 != undefined) {  return num1 + num2 + num3; } else if (num1 != undefined && num2 != undefined)  return num1 + num2;}alert(sum1(1, 2));alert(sum1(1, 2, 3));

 函數(shù)內(nèi)部屬性(arguments 和 this)

arguments:類(lèi)數(shù)組對(duì)象,包含著傳入函數(shù)中的所有參數(shù)。下面通過(guò)arguments實(shí)現(xiàn)上面的模擬重載:

function sum(num, num, num) { var temp = ; if (arguments.length == ) {  //***********具體實(shí)現(xiàn)其邏輯*********************  for (var i = ; i < arguments.length; i++) {   temp += arguments[i];  } } else {  //***********具體實(shí)現(xiàn)其邏輯*********************  for (var i = ; i < arguments.length; i++) {   temp += arguments[i];  } } return temp;}alert("+=" + sum(, ) + " ++=" + sum(, , )); function sum1(num1, num2, num3) {var temp = 0;if (arguments.length == 3) {//***********具體實(shí)現(xiàn)其邏輯*********************for (var i = 0; i < arguments.length; i++) {temp += arguments[i];}}else {//***********具體實(shí)現(xiàn)其邏輯*********************for (var i = 0; i < arguments.length; i++) {temp += arguments[i];}}return temp;}alert("1+2=" + sum1(1, 2) + " 1+2+3=" + sum1(1, 2, 3));

我們?cè)诘谝黄┪睦锩嬗刑嵋粋€(gè)問(wèn)題:

六、

 var fun = function (num1) {  if (num1 <= 1) {   return 1;  }  else {   return num1 * fun(num1 - 1);  } } var fun2 = fun; fun = function () {  return 1; } alert(fun2(5));//這里彈出什么? 

 不過(guò),并沒(méi)有同學(xué)去解答,有人可能覺(jué)得太簡(jiǎn)單,或是不樂(lè)意懶得去解答。這題的答案是:

 為什么會(huì)是這個(gè)答案呢?好像和我們預(yù)料中的不一樣。下面我們圖解:

JavaScript基礎(chǔ)篇(3)之Object、Function等引用類(lèi)型

我們可能發(fā)現(xiàn)了一個(gè)問(wèn)題,那就是第4步調(diào)用的已經(jīng)不是所在的這個(gè)函數(shù)本身了(也就是沒(méi)有遞歸了),這不是我們想要的。我們要的是,不管外面怎么改變,4處都代表所在的函數(shù)指針。那么我們可以用到arguments的callee方法,例:

 函數(shù)的另一個(gè)內(nèi)部屬性this:

 首先我們看看這樣一個(gè)問(wèn)題:

var color = "red";var o = { color: "blue" };function sayColor() { alert(this.color);}sayColor(); //"red"o.sayColor = sayColor;o.sayColor(); //"blue"

為什么會(huì)有不同的結(jié)果?我們記住一句話,一般情況"哪個(gè)對(duì)象點(diǎn)出來(lái)的方法,this就是哪個(gè)對(duì)象"。上面的例子其實(shí)等效于:

window.color = "red";var o = { color: "blue" };function sayColor() { alert(this.color);}window.sayColor(); //"red"o.sayColor = sayColor;o.sayColor(); //"blue" 

 雖然"哪個(gè)對(duì)象點(diǎn)出來(lái)的方法,this就是哪個(gè)對(duì)象",但是有時(shí)候我們不想要這樣的結(jié)果,我們不想用對(duì)象點(diǎn)或者對(duì)象點(diǎn)出了想this是另外的對(duì)象。那么我們可以使用call:

 傳如的第一個(gè)參數(shù),直接賦值給函數(shù)里面的this。和call類(lèi)似的有apply,區(qū)別看下面:

 var o = { color: "blue" }; var o2 = { color: "red" }; function sayColor(a, b) {  alert(this.color + a + b); } sayColor.apply(o, [1, 2]);//只傳兩個(gè)參數(shù),第一個(gè)是為this賦值的對(duì)象,第二個(gè)是函數(shù)實(shí)參數(shù)組 sayColor.call(o2, 1, 2);//可以傳多個(gè)參數(shù),第一個(gè)是為this賦值的對(duì)象,后面的是函數(shù)實(shí)參用逗號(hào)分割

基本包裝類(lèi)型

 在這個(gè)系列的第一篇中有個(gè)問(wèn)題:

四、

var obj1 = {}; obj1.name2 = "張三";var str1 = "test"; str1.name2 = "李四";alert(obj1.name2 + " " + str1.name2);

 為什么會(huì)是這樣的結(jié)果?因?yàn)閟tr1.name2設(shè)置值的時(shí)候訪問(wèn)的是string的包裝類(lèi),然后再次訪問(wèn)str1.name2之前就把之前那個(gè)包裝類(lèi)已經(jīng)被銷(xiāo)毀。

為什么要有包裝類(lèi)?

因?yàn)榭梢韵癫僮饕脤?duì)象一樣操作基本數(shù)據(jù)類(lèi)型,如: var s1 = "some text"; var s2 = s1.substring(2);

哪些基本類(lèi)型有包裝類(lèi)?

Boolean、Number和String類(lèi)型。

瀏覽器的內(nèi)置對(duì)象

Global(其實(shí)也就是我們平時(shí)用的window)和Math(一些計(jì)算功能)

URI 編碼方法

encodeURI、encodeURIComponent、decodeURI、decodeURIComponent//encodeURI主要對(duì)完整的url進(jìn)行編碼(空格會(huì)編碼成%20)【對(duì)應(yīng)該的解碼decodeURI】alert(window.encodeURI("http://i.cnblogs.com/EditPosts.aspx?postid = 5002381"));//encodeURIComponent會(huì)把url中的所有特殊字符進(jìn)行轉(zhuǎn)碼(所以,我們一般用來(lái)進(jìn)行部分url轉(zhuǎn)碼,如Url中的參數(shù))【對(duì)應(yīng)的解碼decodeURIComponent】alert(window.encodeURIComponent("http://i.cnblogs.com/EditPosts.aspx?postid = 5002381"));eval

這是一個(gè)js中最最最強(qiáng)大的函數(shù)了,相對(duì)與一個(gè)獨(dú)立的解析器。如我文中的操作實(shí)例就是用這個(gè)函數(shù)實(shí)現(xiàn)的。

如:

 <textarea class="test_code" style="width: %;height:px; max-height: px;">//。。。。這里面寫(xiě)js代碼var obj = {}; obj.name = "張三";var str = "test"; str.name = "李四";alert(obj.name + " " + str.name); </textarea> <input type="button" class="test_code_but" onclick="eval($(this).prev().val());" value="運(yùn)行" />

效果圖:

JavaScript基礎(chǔ)篇(3)之Object、Function等引用類(lèi)型

當(dāng)然,你還的引入jqeruy問(wèn)題,博客園中默認(rèn)就已經(jīng)引入了。所以,你不需要再次引入,你測(cè)試的話是看不到alert彈框的,因?yàn)椴┛蛨@禁掉了。我的是用的jquery ui中的Dialog對(duì)話框做的。



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JavaScript/Ajax教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 国产乱淫av片免费观看 | 精品在线观看一区二区 | 亚洲小视频| 免费观看一级淫片 | 性爱视频在线免费 | 孕妇体内谢精满日本电影 | 国产手机国产手机在线 | 9191久久久久视频 | 九九精品在线观看 | 激情综合在线 | 日本网站在线播放 | 成人免费网站在线观看 | sese在线视频 | 一级大黄毛片免费观看 | 国产亚洲自拍一区 | 欧洲精品久久久 | 12av电影 | 亚洲国产精品一区 | 欧美一级片 在线播放 | 亚州综合图片 | 日韩黄色片免费看 | 亚洲少妇诱惑 | 国产成人高清成人av片在线看 | 亚洲成人免费电影 | 日韩中文字幕一区二区三区 | 国产男女爽爽爽爽爽免费视频 | 欧美激情区| xxxx hd video 69 | 毛片免费网 | 一级做a爱片性色毛片 | 黄在线免费 | 热re91久久精品国产99热 | 男男啪羞羞视频网站 | 中文字幕在线播放第一页 | 毛片一区二区三区 | 国产无遮挡一区二区三区毛片日本 | 欧美一级特黄aaaaaaa什 | 草久网| 日韩欧美色综合 | 精品国产96亚洲一区二区三区 | 精品一区二区免费视频视频 |