JavaScript經典案例(二)

亦世發表於2018-08-27

13.GO、prototype

function Foo() {
    getName = function () {
        console.log(1);
    }
    return this;
}
Foo.getName = function () {
    console.log(2)
}
Foo.prototype.getName = function () {
    console.log(3);
}
var getName = function () {
    console.log(4);
}
function getName() {
    console.log(5)
}
Foo.getName();              //2
getName();                   //4  GO 執行時賦值為function[4]輸出4
Foo().getName();            //1   Foo執行,getName沒有宣告,所以是全域性的,GO裡getName被重新賦值
getName();                  //1 getName變為function[1]
new Foo.getName();         //2  Foo沒執行,.的優先順序高於new ,所以是new 2 依然是2
new Foo().getName();     // 3 (new Foo()).getName,尋找建構函式裡的getName,本身沒有,從原型找
new new Foo().getName()  // 3  new 3複製程式碼

分析:GO={  Foo:function

                       getName: undefined->function【5】 ->function【4】->function【1】

                    }

/** * 判斷迴文 * */複製程式碼
function checkPlalindrome(str){
    return str === str.split('').reverse().join('');
}
複製程式碼
/** * 陣列去重 * */
Array.prototype.unique = function () {
    var temp = {},
        newArr = [],
        len = this.length;
    for(var i = 0; i < len; i++){
        if(!temp.hasOwnProperty(this[i])){
  //!temp[this[i]] 用hasOwnProperty  是為了去掉陣列中重複的0
            temp[this[i]] = this[i];
            newArr.push(this[i])
        }
    }
    return newArr
}
String.prototype.unique = function () {
    var temp = {},
        newStr = '';
    for(var i=0;i<this.length;i++){
        if(!temp.hasOwnProperty(this[i])){
            temp[this[i]] = this[i];
            newStr += this[i]
        }
    }
    return newStr;
}
var str = '124eeerrrll'
str.unique()
function unique(arr){
    let hasObj = {},
        data = [];
    for (let item of arr){
        if(!hasObj[item]){
            hasObj[item] = true;
            data.push(item)
        }
    }
    return data;
}
// console.log(unique([1,1,2,3,45,8,0,0,6,5,1]))複製程式碼
/** * 字串中第一個不重複的字元 */
function test(str) {
    var temp = {};
    for (var i = 0; i<str.length;i++){
        if(temp.hasOwnProperty(str[i])){
            temp[str[i]]++
        }else {
            temp[str[i]] = 1
        }
    }
    for(var key in temp){
        if(temp[key] === 1){
            return key;
        }
    }
}複製程式碼

判斷資料具體型別(原始值、引用值、包裝類)

function type(target){
    var ret = typeof(target);
    var template = {
        "[object Array]" : "array",
        "[object Object]" : "object",
        "[object Number]" : "number-object",
        "[object Boolean]" : "boolean-object",
        "[object String]" : "string-object"
    }
    if(target === null){
        return "null";
    }else if(ret == 'object'){
        var str = Object.prototype.toString.call(target);
        return template[str];
    }else
        return ret;
}複製程式碼


相關文章