摘要:判斷是否為一個(gè)函數(shù),返回一個(gè)值。使用遞歸來實(shí)現(xiàn)一個(gè)深度克隆,可以復(fù)制一個(gè)目標(biāo)對象,返回一個(gè)完整拷貝被復(fù)制的對象類型會(huì)被限制為數(shù)字字符串布爾日期數(shù)組對象。經(jīng)過測試,數(shù)字字符串布爾日期可以直接賦值,修改不會(huì)產(chǎn)生影響。再考慮對象類型為或者的情況。
//判斷arr是否為一個(gè)數(shù)組,返回一個(gè)bool值
首先javascript有5大基本數(shù)據(jù)類型:Undefined,Null,Boolean,Number、String(雙無BNS)和Symbol (ECMAScript 6 新定義)
還有一個(gè)引用數(shù)據(jù)類型:Object,它包括以下三大類:
Native Object(原生對象): ECMAScript本身自帶的對象,是在腳本運(yùn)行環(huán)境中程序員創(chuàng)建來使用的,包括:Object(基礎(chǔ)類型)、Array、Date、Function、RegExp;另外還包括三個(gè)基本包裝類型:Boolean、Number、String,有了它們?nèi)齻€(gè)我們可以將基本類型值當(dāng)作對象來訪問(使用他們的屬性和方法)。
Build-in Object(內(nèi)置對象): JavaScript語言提供的不依賴于執(zhí)行宿主的內(nèi)建對象,如:Global、Math;內(nèi)建對象都是Native Object。
Host Object(宿主對象):JavaScript語言提供的任何依賴于宿主環(huán)境的對象,所有非Native Object的對象都是宿主對象,如:IE中的window,WScript中的wscript實(shí)例,以及任何用戶創(chuàng)建的類。
所以我們判斷的數(shù)組(Array)就是復(fù)雜數(shù)據(jù)類型Object中的其中一類,我們需要使用Object自帶的方法來判斷它——Javascript數(shù)組類型檢測
首先,取得對象的一個(gè)內(nèi)部屬性[[Class]],然后依據(jù)這個(gè)屬性,返回一個(gè)類似于"[object Array]"的字符串作為結(jié)果(看過ECMA標(biāo)準(zhǔn)的應(yīng)該都知道,[[]]用來表示語言內(nèi)部用到的、外部不可直接訪問的屬性,稱為“內(nèi)部屬性”)。利用這個(gè)方法,再配合call,我們可以取得任何對象的內(nèi)部屬性[[Class]],然后把類型檢測轉(zhuǎn)化為字符串比較,以達(dá)到我們的目的。
function isArray (arr) { return Object.prototype.toString.call(arr) === "[Object Array]"; }
call改變toString的this引用為待檢測的對象,返回此對象的字符串表示,然后對比此字符串是否是"[object Array]",以判斷其是否是Array的實(shí)例。也許你要問了,為什么不直接o.toString()?嗯,雖然Array繼承自O(shè)bject,也會(huì)有toString方法,但是這個(gè)方法有可能會(huì)被改寫而達(dá)不到我們的要求,而Object.prototype則是老虎的屁股,很少有人敢去碰它的,所以能一定程度保證其“純潔性”。
//判斷fn是否為一個(gè)函數(shù),返回一個(gè)bool值。
function isFunction (fn) { return (typeof fn === "function"); } // or function isFunction (fn) { return Object.prototype.toString.call(arr) === "[Object Function]"; }
// 使用遞歸來實(shí)現(xiàn)一個(gè)深度克隆,可以復(fù)制一個(gè)目標(biāo)對象,返回一個(gè)完整拷貝
// 被復(fù)制的對象類型會(huì)被限制為數(shù)字、字符串、布爾、日期、數(shù)組、Object對象。不會(huì)包含函數(shù)、正則對象等
思路如下
題目考的主要是有些對象的使用=直接賦值,并不是真正的復(fù)制,而是將一個(gè)新的變量指向了當(dāng)前對象,共享同一個(gè)地址。在修改原對象時(shí),新對象也會(huì)跟著改變。
經(jīng)過測試,數(shù)字、字符串、布爾、日期、可以直接賦值,修改不會(huì)產(chǎn)生影響。所以就思考了在使用typeof值為對象或者是原始類型時(shí)的情況。且對象類型為Date對象時(shí),也使用直接賦值的方式。
再考慮對象類型為Array或者Object的情況。對于結(jié)果聲明其類型。
接著往下走,在遍歷對象時(shí),只考慮其自身的屬性,而不考慮繼承來屬性。若其自身值還是對象,那么 就遞歸調(diào)用,進(jìn)一步解析、賦值,否則直接賦值。
function cloneObject(src) { var result ;//返回的復(fù)制后的結(jié)果。 if (typeof(src)==="object"){ //對象為日期對象時(shí)也直接賦值。 if(Object.prototype.toString.call(src)==="[object Date]"){ result = src; }else{ //判斷對象的類型是Array還是Object,結(jié)果類型更改。 result = (Object.prototype.toString.call(src)==="[object Array]")? [] : {}; for (var i in src){ if (src.hasOwnProperty(i)) { //排除繼承屬性 if (typeof src[i] === "object") { result[i] = cloneObject(src[i]); //遞歸賦值 } else { result[i] = src[i]; //直接賦值 } } } } }else{ //對于原始類型直接賦值。 result = src; } return result; }
// 對數(shù)組進(jìn)行去重操作,只考慮數(shù)組中元素為數(shù)字或字符串,返回一個(gè)去重后的數(shù)組
思路如下:
新建一下新數(shù)組
循環(huán)原數(shù)組
判斷新數(shù)組內(nèi)元素,原數(shù)組是否含有.含有則跳過
返回新數(shù)組.
function uniqArray(arr) { // your implement var result = []; //創(chuàng)建一個(gè)新數(shù)組。 for (var i = 0, l = arr.length; i < l; i++) { if (result.indexOf(arr[i]) === -1) { //查找是否已經(jīng)含有該元素 result.push(arr[i]); //添加到新數(shù)組 } } return result; //返回新數(shù)組 }
// 實(shí)現(xiàn)一個(gè)簡單的trim函數(shù),用于去除一個(gè)字符串,頭部和尾部的空白字符
// 對字符串頭尾進(jìn)行空格字符的去除、包括全角半角空格、Tab等,返回一個(gè)字符串
// 嘗試使用一行簡潔的正則表達(dá)式完成該題目
//1.字符串查找 //這里就是利用兩個(gè)循環(huán),找到頭尾第一個(gè)不是空格且不是tab符的元素。記錄它們的索引,之后截取字符串。 function simpleTrim(str) { // your implement var result = ""; for (var i = 0, il = str.length; i < il; i++) { //從頭查找 if (str[i] != " " && str[i] != " ") { break; //查找到第一個(gè)不為空格及tab符的元素 } } for (var j = str.length - 1; j >= 0; j--) { //從尾查找 if (str[j] != " " && str[j] != " ") { break; } } result = str.slice(i, j + 1); //截取需要的字符串。 return result; } //2.正則 function trim(str) { // your implement var result = ""; result = str.replace(/^s+|s+$/g, ""); //使用正則進(jìn)行字符串替換 return result; }
// 實(shí)現(xiàn)一個(gè)遍歷數(shù)組的方法,針對數(shù)組中每一個(gè)元素執(zhí)行fn函數(shù),并將數(shù)組索引和元素作為參數(shù)傳遞
function each(arr, fn) { // your implement for (var i = 0, l = arr.length; i < l; i++) {//遍歷傳參 fn(arr[i], i); } }
// 獲取一個(gè)對象里面第一層元素的數(shù)量,返回一個(gè)整數(shù)
//使用for in遍歷時(shí),直接獲取到的就是第一層的結(jié)果 //排除繼承來的屬性,使用外部變量保存循環(huán)次數(shù) function getObjectLength(obj) { var count = 0; for (var i in obj) { if (obj.hasOwnProperty(i)) { count++; } } return count; }
ife/2015_spring/task0002/
本文參考1
本文參考2
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/81667.html
摘要:的一些規(guī)則新特性應(yīng)該基于以及。將支持某些特性。作用聲明幫助瀏覽器正確地顯示網(wǎng)頁。標(biāo)簽位于文檔的頭部,不包含任何內(nèi)容。標(biāo)簽的屬性定義了與文檔相關(guān)聯(lián)的名稱值對。每個(gè)列表項(xiàng)始于標(biāo)簽。第二天:給自己做一個(gè)在線簡歷吧 最后的驗(yàn)證,提出了幾個(gè)問題,嘗試解答一下 HTML是什么,HTML5是什么 HTML的定義摘抄自w3school的HTML 簡介 HTML 是用來描述網(wǎng)頁的一種語言。 HTML 指...
摘要:類型選擇器又名元素選擇器類型選擇器又名元素選擇器在標(biāo)準(zhǔn)中,元素選擇器又稱為類型選擇器。個(gè)位在整個(gè)選擇器中每包含一個(gè)元素選擇器或偽元素就在該列中加分。第四天,背景邊框列表鏈接和更復(fù)雜的選擇器 背景,邊框,列表,鏈接相關(guān)屬性 背景 MDN 背景 W3School 背景 元素的背景是指,在元素內(nèi)容、內(nèi)邊距和邊界下層的區(qū)域。 屬性 描述 background-color 為背景設(shè)置...
原生javascript中,用cssText如何重寫內(nèi)聯(lián)css注意:前面的分號是為了兼容ie,加號是為了不清除已有的內(nèi)聯(lián)樣式代碼: Element.style.cssText += ;width:100px;height:100px;top:100px;left:100px; 自定義一個(gè)方法來實(shí)現(xiàn)追加className的效果代碼如下代碼: function addClass(element,val...
摘要:向已被訪問的鏈接添加樣式。讓背景圖片大小水平方向擴(kuò)大一倍,這樣才有移動(dòng)與變化的空間。不足及改進(jìn)總結(jié)來看,自己做得不夠,雖然也花了時(shí)間,不過能看出有敷衍的成分在。 一、前言 百度的前端技術(shù)學(xué)院IFE,2016年就聽說了,當(dāng)時(shí)自己也報(bào)名,還組成隊(duì)伍了,不過自己一個(gè)任務(wù)也沒完成就結(jié)束了,遺憾... 關(guān)注了IFE,知道2017年2月有新的一期培訓(xùn),于是一直在等著報(bào)名,然后開始做里面發(fā)布的任務(wù)(...
摘要:向已被訪問的鏈接添加樣式。讓背景圖片大小水平方向擴(kuò)大一倍,這樣才有移動(dòng)與變化的空間。不足及改進(jìn)總結(jié)來看,自己做得不夠,雖然也花了時(shí)間,不過能看出有敷衍的成分在。 一、前言 百度的前端技術(shù)學(xué)院IFE,2016年就聽說了,當(dāng)時(shí)自己也報(bào)名,還組成隊(duì)伍了,不過自己一個(gè)任務(wù)也沒完成就結(jié)束了,遺憾... 關(guān)注了IFE,知道2017年2月有新的一期培訓(xùn),于是一直在等著報(bào)名,然后開始做里面發(fā)布的任務(wù)(...
閱讀 3100·2021-09-22 15:54
閱讀 3988·2021-09-09 11:34
閱讀 1772·2019-08-30 12:48
閱讀 1164·2019-08-30 11:18
閱讀 3437·2019-08-26 11:48
閱讀 921·2019-08-23 17:50
閱讀 2123·2019-08-23 17:17
閱讀 1246·2019-08-23 17:12