//判斷arr是否爲一個數組,返回一個bool值javascript
首先javascript有5大基本數據類型:Undefined,Null,Boolean,Number、String(雙無BNS)和Symbol (ECMAScript 6 新定義)html
還有一個引用數據類型:Object,它包括如下三大類:java
Native Object(原生對象): ECMAScript自己自帶的對象,是在腳本運行環境中程序員建立來使用的,包括:Object(基礎類型)、Array、Date、Function、RegExp;另外還包括三個基本包裝類型:Boolean、Number、String,有了它們三個咱們能夠將基本類型值看成對象來訪問(使用他們的屬性和方法)。git
Build-in Object(內置對象): JavaScript語言提供的不依賴於執行宿主的內建對象,如:Global、Math;內建對象都是Native Object。程序員
Host Object(宿主對象):JavaScript語言提供的任何依賴於宿主環境的對象,全部非Native Object的對象都是宿主對象,如:IE中的window,WScript中的wscript實例,以及任何用戶建立的類。github
因此咱們判斷的數組(Array)就是複雜數據類型Object中的其中一類,咱們須要使用Object自帶的方法來判斷它——Javascript數組類型檢測正則表達式
首先,取得對象的一個內部屬性[[Class]],而後依據這個屬性,返回一個相似於"[object Array]"的字符串做爲結果(看過ECMA標準的應該都知道,[[]]用來表示語言內部用到的、外部不可直接訪問的屬性,稱爲「內部屬性」)。利用這個方法,再配合call,咱們能夠取得任何對象的內部屬性[[Class]],而後把類型檢測轉化爲字符串比較,以達到咱們的目的。spring
function isArray (arr) { return Object.prototype.toString.call(arr) === '[Object Array]'; }
call改變toString的this引用爲待檢測的對象,返回此對象的字符串表示,而後對比此字符串是不是'[object Array]',以判斷其是不是Array的實例。也許你要問了,爲何不直接o.toString()?嗯,雖然Array繼承自Object,也會有toString方法,可是這個方法有可能會被改寫而達不到咱們的要求,而Object.prototype則是老虎的屁股,不多有人敢去碰它的,因此能必定程度保證其「純潔性」。segmentfault
//判斷fn是否爲一個函數,返回一個bool值。數組
function isFunction (fn) { return (typeof fn === 'function'); } // or function isFunction (fn) { return Object.prototype.toString.call(arr) === '[Object Function]'; }
// 使用遞歸來實現一個深度克隆,能夠複製一個目標對象,返回一個完整拷貝
// 被複制的對象類型會被限制爲數字、字符串、布爾、日期、數組、Object對象。不會包含函數、正則對象等
思路以下
題目考的主要是有些對象的使用=直接賦值,並非真正的複製,而是將一個新的變量指向了當前對象,共享同一個地址。在修改原對象時,新對象也會跟着改變。
通過測試,數字、字符串、布爾、日期、能夠直接賦值,修改不會產生影響。因此就思考了在使用typeof值爲對象或者是原始類型時的狀況。且對象類型爲Date對象時,也使用直接賦值的方式。
再考慮對象類型爲Array或者Object的狀況。對於結果聲明其類型。
接着往下走,在遍歷對象時,只考慮其自身的屬性,而不考慮繼承來屬性。若其自身值仍是對象,那麼 就遞歸調用,進一步解析、賦值,不然直接賦值。
function cloneObject(src) { var result ;//返回的複製後的結果。 if (typeof(src)==="object"){ //對象爲日期對象時也直接賦值。 if(Object.prototype.toString.call(src)==="[object Date]"){ result = src; }else{ //判斷對象的類型是Array仍是Object,結果類型更改。 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; }
// 對數組進行去重操做,只考慮數組中元素爲數字或字符串,返回一個去重後的數組
思路以下:
新建一下新數組
循環原數組
判斷新數組內元素,原數組是否含有.含有則跳過
返回新數組.
function uniqArray(arr) { // your implement var result = []; //建立一個新數組。 for (var i = 0, l = arr.length; i < l; i++) { if (result.indexOf(arr[i]) === -1) { //查找是否已經含有該元素 result.push(arr[i]); //添加到新數組 } } return result; //返回新數組 }
// 實現一個簡單的trim函數,用於去除一個字符串,頭部和尾部的空白字符
// 對字符串頭尾進行空格字符的去除、包括全角半角空格、Tab等,返回一個字符串
// 嘗試使用一行簡潔的正則表達式完成該題目
//1.字符串查找 //這裏就是利用兩個循環,找到頭尾第一個不是空格且不是tab符的元素。記錄它們的索引,以後截取字符串。 function simpleTrim(str) { // your implement var result = ""; for (var i = 0, il = str.length; i < il; i++) { //從頭查找 if (str[i] != " " && str[i] != "\t") { break; //查找到第一個不爲空格及tab符的元素 } } for (var j = str.length - 1; j >= 0; j--) { //從尾查找 if (str[j] != " " && str[j] != "\t") { break; } } result = str.slice(i, j + 1); //截取須要的字符串。 return result; } //2.正則 function trim(str) { // your implement var result = ""; result = str.replace(/^\s+|\s+$/g, ""); //使用正則進行字符串替換 return result; }
// 實現一個遍歷數組的方法,針對數組中每個元素執行fn函數,並將數組索引和元素做爲參數傳遞
function each(arr, fn) { // your implement for (var i = 0, l = arr.length; i < l; i++) {//遍歷傳參 fn(arr[i], i); } }
// 獲取一個對象裏面第一層元素的數量,返回一個整數
//使用for in遍歷時,直接獲取到的就是第一層的結果 //排除繼承來的屬性,使用外部變量保存循環次數 function getObjectLength(obj) { var count = 0; for (var i in obj) { if (obj.hasOwnProperty(i)) { count++; } } return count; }