家好,很高興又見面了,我是姜茶的編程筆記,我們一起學習前端相關領域技術,共同進步,也歡迎大家關注、點贊、收藏、轉發,您的支持是我不斷創作的動力
在 JavaScript 中,Array.prototype.map 是一個常用的方法,它對數組的每個元素調用提供的函數,并返回一個新數組,包含函數的返回值。為了更好地理解其內部機制,今天我們將從零開始,實現一個自定義的 map 方法,并詳細解析其實現步驟。
首先,我們創建一個 myMap 方法,將其添加到 Array.prototype 上。這個方法接受兩個參數:一個回調函數 callback 和一個可選的 thisArg 參數。callback 函數將對數組的每個元素進行操作,thisArg 是執行回調函數時的 this 值。
Array.prototype.myMap = function(callback, thisArg) {
// 將傳入的數組轉換為對象
const O = Object(this);
// 獲取數組的長度
const len = O.length >>> 0;
// 如果 callback 不是函數,則拋出 TypeError
if (typeof callback !== 'function') {
throw new TypeError(callback + ' is not a function');
}
// 創建一個新的數組,用于存儲映射結果
const result = new Array(len);
// 遍歷數組并應用回調函數
for (let i = 0; i < len; i++) {
// 只有當元素在數組中存在時才進行映射
if (i in O) {
// 調用回調函數,傳遞 thisArg 作為 this 值,并傳遞當前元素、索引、數組本身
result[i] = callback.call(thisArg, O[i], i, O);
}
}
return result;
};
讓我們逐步解析這個實現。
我們首先將 this 轉換為一個對象,以便在方法中使用:
const O = Object(this);
使用 >>> 0 操作符將長度轉換為無符號整數,確保其為正整數:
const len = O.length >>> 0;
如果 callback 不是函數,則拋出一個 TypeError:
if (typeof callback !== 'function') {
throw new TypeError(callback + ' is not a function');
}
我們創建一個與原數組長度相同的新數組,用于存儲映射結果:
const result = new Array(len);
使用 for 循環遍歷數組的每個索引。如果當前索引存在于數組中,則調用回調函數,并將結果存儲在 result 數組中:
for (let i = 0; i < len; i++) {
if (i in O) {
result[i] = callback.call(thisArg, O[i], i, O);
}
}
最后,我們返回存儲映射結果的 result 數組:
return result;
下面是一個示例,展示如何使用自定義的 myMap 方法:
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.myMap(x => x * 2);
console.log(doubled); // 輸出 [2, 4, 6, 8, 10]
在這個示例中,我們將 numbers 數組中的每個元素都乘以 2,并將結果存儲在 doubled 數組中。結果輸出為 [2, 4, 6, 8, 10],這與內置的 Array.prototype.map 方法的行為一致。
通過實現自定義的 map 方法,我們深入理解了 JavaScript 中數組的操作方式。希望你可以更好地掌握 map 方法的內部機制,并提升你的 JavaScript 編程技巧。
如果你有任何問題或建議,歡迎在評論區留言交流!祝你編程愉快!
Object的鍵只能是字符串或者 Symbols,但 Map 的鍵可以是任意值,包括函數、對象、基本類 型。
Map 中的鍵值是有序的,而添加到 Object 對象中的鍵則不是。因此,當對它進行遍歷時,Map 對象是按插入的順序返回鍵值。
可以通過 size 屬性直接獲取一個 Map 的鍵值對個數,而 Object 的鍵值對個數只能手動計算。
Map 可直接進行迭代,而 Object 的迭代需要先獲取它的鍵數組,然后再進行迭代。
Map 在涉及頻繁增刪鍵值對的場景下會有些性能優勢。
new Map([iterable])
let map = new Map([['key1', 'value1'], ['key2', 'value2']]);
Map.prototype.size // 元素數量
Map.prototype.clear() // 移除Map對象的所有鍵/值對 。
Map.prototype.delete(key) // 如果 Map 對象中存在該元素,則移除它并返回 true;否則如果該元素不存在則返回 false
Map.prototype.entries() // 返回一個新的 Iterator 對象,它按插入順序包含了Map對象中每個元素的[key, value] 數組。
Map.prototype.forEach(callbackFn[, thisArg]) // 按插入順序,為 Map對象里的每一鍵值對調用一次callbackFn函數。
Map.prototype.get(key) // 返回鍵對應的值,如果不存在,則返回undefined。
Map.prototype.has(key) // 返回一個布爾值,表示Map實例是否包含鍵對應的值。
Map.prototype.keys() // 返回一個新的 Iterator對象, 它按插入順序包含了Map對象中每個元素的鍵 。
Map.prototype.set(key, value) // 設置Map對象中鍵的值。返回該Map對象。
Map.prototype.values() // 返回一個新的Iterator對象,它按插入順序包含了Map對象中每個元素的值 。
let myMap = new Map();
let keyObj = {},
keyFunc = function () { },
keyString = "a string";
// 添加鍵
myMap.set(keyString, "和鍵'a string'關聯的值");
myMap.set(keyObj, "和鍵keyObj關聯的值");
myMap.set(keyFunc, "和鍵keyFunc關聯的值");
console.log(myMap.size); // => 3
// 讀取值
myMap.get(keyString); // "和鍵'a string'關聯的值"
myMap.get(keyObj); // "和鍵keyObj關聯的值"
myMap.get(keyFunc); // "和鍵keyFunc關聯的值"
myMap.get("a string"); // "和鍵'a string'關聯的值",因為keyString === 'a string'
myMap.get({}); // undefined, 因為keyObj !== {}
myMap.get(function () { }) // undefined, 因為keyFunc !== function () {}
let myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
// 將會輸出兩個log,一個是"0 = zero", 另一個是"1 = one"
for (let [key, value] of myMap) {
console.log(key + " = " + value);
}
// 將會輸出兩個log, 一個是 "0" 另一個是 "1"
for (let key of myMap.keys()) {
console.log(key);
}
// 將會輸出兩個log, 一個是 "zero" 另一個是 "one"
for (let value of myMap.values()) {
console.log(value);
}
// 將會輸出兩個log, 一個是 "0 = zero" 另一個是 "1 = one"
for (let [key, value] of myMap.entries()) {
console.log(key + " = " + value);
}
// 將會輸出兩個logs, 一個是 "0 = zero" 另一個是 "1 = one"
myMap.forEach(function (value, key) {
console.log(key + " = " + value);
})
var kvArray = [["key1", "value1"], ["key2", "value2"]];
// 使用常規的Map構造函數可以將一個二維鍵值對數組轉換成一個Map對象
var myMap = new Map(kvArray);
console.log(myMap.get("key1")); // => value1
// 使用Array.from函數可以將一個Map對象轉換成一個二維鍵值對數組
console.log(Array.from(myMap)); // 輸出和kvArray相同的數組
// 在鍵或者值的迭代器上使用Array.from,進而得到只含有鍵或者值的數組
console.log(Array.from(myMap.keys())); // 輸出 ["key1", "key2"]
console.log(Array.from(myMap.values())); // 輸出 ["value1", "value2"]
Sitemaps(網站地圖)協議使你能夠告知搜索引擎網站中可供抓取的網址。
最簡便的方式就是,使用Sitemaps協議的Sitemaps就是列有某個網站所有網址的XML文件。
Sitemaps協議此可高度擴展,因此可適用于各種大小的網站。它還能夠使網站管理員提供有關每個網址的其他信息(上次更新的時間、更改的頻率、與網站中其他網址相比它的重要性等),以便搜索引擎可以更智能地抓取該網站。
Sitemaps協議補充而不是取代搜索引擎已用來發現網址的基于抓取的機制。通過向搜索引擎提交一個Sitemaps(或多個Sitemaps),可幫助搜索引擎更好地抓取你的網站。
網站地圖文件原本是方便訪問用戶更好的了解站點的構架而設置的,它能幫助用戶便捷得查詢得到所需的信息。
網站地圖,又稱站點地圖,它就是一個頁面,上面放置了網站上所有頁面的鏈接。大多數人在網站上找不到自己所需要的信息時,可能會將網站地圖作為一種補救措施。搜索引擎蜘蛛非常喜歡網站地圖。
網站地圖是一個網站所有鏈接的容器。很多網站的連接層次比較深,蜘蛛很難抓取到,網站地圖可以方便搜索引擎蜘蛛抓取網站頁面,通過抓取網站頁面,清晰了解網站的架構,網站地圖一般存放在根目錄下并命名為sitemaps,為搜索引擎蜘蛛指路,增加網站重要內容頁面的收錄。網站地圖就是根據網站的結構、框架、內容,生成的導航網頁文件。
大多數人都知道網站地圖對于提高用戶體驗有好處:它們為網站訪問者指明方向,并幫助迷失的訪問者找到他們想看的頁面。對于SEO,網站地圖的好處就更多了:
1.為搜索引擎蜘蛛提供可以瀏覽整個網站的鏈接簡單的體現出網站的整體框架出來給搜索引擎看;
2.為搜索引擎蜘蛛提供一些鏈接,指向動態頁面或者采用其他方法比較難以到達的頁面;
3.作為一種潛在的著陸頁面,可以為搜索流量進行優化;
4.如果訪問者試圖訪問網站所在域內并不存在的URL,那么這個訪問者就會被轉到“無法找到文件”的錯誤頁面,而網站地圖可以作為該頁面的“準”內容。
1、WEB界面形式
它作為構成網站的諸多頁面之一,以純文本的超級鏈接形式為最佳表現形式,用戶和搜索引擎機器人都可以識別。傳統網站用來方便用戶,現在更主要是幫助搜索引擎找到深層次的頁面
2、XML文本形式
不易于絕大多數訪問用戶理解閱讀,專為搜索引擎機器人而準備。可在ROBOTS.TXT文件中進行描述,目前,包裹谷歌在內的四大搜索引擎均支持sitemaps協議。
1.網站包含大量動態網頁;
2.網站包含大量使用圖片,Flash或者Ajax(特效網頁)的網頁;
3.網站為新網站且指向該網站的鏈接不多;
4.網站有大量內容頁存檔,這些內容頁彼此之間沒有很好地鏈接,或根本沒有鏈接。
第一種方式:網站地圖自動生成器
在這里大家可以選擇一個自己熟悉的網站生成一個網站地圖xml文件,生成的速度比較慢,所以選擇不要太大的網站。生成的xml文件應該借助ftp協議上傳到自己網站的根目錄下。
第二種方式:Site Map Builder .NET
注意:【安裝方式:先安裝.NET Framework 1.1,然后安裝Site Map Builder .NET 】
第三種方式:XENU.EXE工具生成.html的地圖
1、運行XENU.EXE文件,先單擊“options”菜單,取消除“Valid text Url”外的其他多選按鈕前的“√”,如果不取消則會結果中出現更多的選項。
2、然后選擇“File”菜單下的“Check Url”命令,在第一個輸入框里輸入你的網址,最后單擊“確定”。
3、過一段時間,系統會提示你檢查完畢;
4、這時選擇“File”菜 單下的“Report”命令,系統會自動打開一個IE窗口,這就是生成的靜態頁面了。
5、最后,將此文件保存,并根據自己的要求,在DreamWeaver 或者FrontPage里面把這個靜態頁面修改一下即可。
第四種方式:站長工具
使用百度統計_站長工具_sitemap。(robotx協議也可以在這里生成)。
大型站點,往往具有較為龐大的注冊用戶和其他數據庫信息,為了更合理的展現,我們需要進行各種分類,整理成目錄,以確保用戶和搜索引擎均能較快的找到所需信息。
1)企業類信息常用分類方式:行業分類,地區分類,首字母分類,企業規模和性質分類。
2)會員信息常用分類方式:興趣分類,地區分類,首字母分類,性別分類。
網站目錄與網站地圖的區別:網站地圖以信息本身為索引主體,而網站目錄以信息類型為索引主體,不是同一個概念。
【袁帥論道】袁帥,互聯網數據分析運營實踐者,智能一體化會展活動運營服務平臺會點網事業合伙人/運營負責人。CEAC國家信息化計算機教育認證:網絡營銷師,SEM搜索引擎營銷師,SEO工程師。中國電子商務協會認證:中國電子商務職業經理人,暢銷書《互聯網銷售寶典》聯合出品人之一。中國國際貿易促進委員會:今日會展會員聯盟VIP個人會員,全經聯園區委秘書處成員,中國低碳智慧園區聯盟理事,周五咖啡媒體人俱樂部發起合伙人。互聯網數據官(iCDO)原創作者,互聯網營銷官CMO原創作者,執牛耳媒體特約撰稿人。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。