JavaScript數據類型及語言基礎--ife

//判斷arr是否爲一個數組,返回一個bool值javascript

首先javascript有5大基本數據類型:Undefined,Null,Boolean,Number、String(雙無BNS)和Symbol (ECMAScript 6 新定義)html

還有一個引用數據類型:Object,它包括如下三大類:java

  1. Native Object(原生對象): ECMAScript自己自帶的對象,是在腳本運行環境中程序員建立來使用的,包括:Object(基礎類型)、Array、Date、Function、RegExp;另外還包括三個基本包裝類型:Boolean、Number、String,有了它們三個咱們能夠將基本類型值看成對象來訪問(使用他們的屬性和方法)。git

  2. Build-in Object(內置對象): JavaScript語言提供的不依賴於執行宿主的內建對象,如:Global、Math;內建對象都是Native Object。程序員

  3. 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對象。不會包含函數、正則對象等

思路以下

  1. 題目考的主要是有些對象的使用=直接賦值,並非真正的複製,而是將一個新的變量指向了當前對象,共享同一個地址。在修改原對象時,新對象也會跟着改變。

  2. 通過測試,數字、字符串、布爾、日期、能夠直接賦值,修改不會產生影響。因此就思考了在使用typeof值爲對象或者是原始類型時的狀況。且對象類型爲Date對象時,也使用直接賦值的方式。

  3. 再考慮對象類型爲Array或者Object的狀況。對於結果聲明其類型。

  4. 接着往下走,在遍歷對象時,只考慮其自身的屬性,而不考慮繼承來屬性。若其自身值仍是對象,那麼 就遞歸調用,進一步解析、賦值,不然直接賦值。

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;
}

// 對數組進行去重操做,只考慮數組中元素爲數字或字符串,返回一個去重後的數組

思路以下:

  1. 新建一下新數組

  2. 循環原數組

  3. 判斷新數組內元素,原數組是否含有.含有則跳過

  4. 返回新數組.

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;
}

ife/2015_spring/task0002/

本文參考1

本文參考2

相關文章
相關標籤/搜索