iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 27
1
Modern Web

大家都在鐵人賽跑JS,這條鹹魚不只翻身還被煎得有點焦了,我們來點實務吧系列 第 27

三本柱大混戰 # 27 JS不能多載?沒關係我們自己寫

  • 分享至 

  • xImage
  •  

雙11到了

讓我們向那群電商網站的工程師致敬

他們的爆肝換得了我們商品的折扣
連不喜歡花錢如我都不小心手滑了一條RAM
便宜一千多塊真的太誇張了

光想一秒內會是幾千甚至幾萬個用戶登入
然後塞到同一個網頁,點同一顆按鈕
那個執行緒安全、伺服器負載就讓人發毛

今天來介紹一下我的JS在哪學的吧

JavaScript 全攻略:克服 JS 的奇怪部分

好像蠻多人有買這門課的,小農順便都把它當英聽在看
其他都是六角學院的課程


今天再來介紹我所收集的最後一篇2019鐵人賽的文章吧

機器學習模型圖書館:從傳統模型到深度學習 系列

最近紅到發火的機器學習
小農數學是爛在公式老是被錯,運算總是算錯
但當python有這些套件時就輕輕鬆鬆過了

另外在udemy上也有一個課程也是相當推薦

机器学习 A-Z (Machine Learning A-Z in Chinese)


好的,今天的插科打諢完了,讓我們繼續正篇吧

直接上閹割版的陣列轉物件吧

 /**
     * @name 純陣列轉換物件陣列
     * @author ChengYang
     * @param ([[物件名稱,對應陣列資料index,處理方法]],arr)
     * @description 第一參數若是一維數組,自動放入遞增序列
     * 若是二維數組,則放入
     * ""單一""參數處理===>
     *         [ObjKey,對應原arr[index],Function(data){return fnData}(可選)]
     * ""複數""參數處理===>
     *         [ObjKey,對應原arr[index],Function(data){return fnData}(可選)]
     * !!可穿插使用,使用方法建example
     * 若資料處以階段該資料不放入新物件,自行在自訂方法中回傳false
     * @example @ (單一參數)bulletin.js:37(複數參數)member_index.html:170
     * 單一參數:Tools.arrToObj([
                        ['msgTitle',0, function clg(data) {
                            console.log(data,data.length);
                            return data;
                        }],
                        ['msg'],
                        ['msgTime']
                    ], arr)
     * 複數參數:Tools.arrToObj([
                            ['name', 0],
                            ['value', 4],
                            ['trend', [4,5], function(data) {
                                return (data[0] - data[1]).toFixed(3)
                            }]
                        ],data)
     */
 arrToObj: function (ObjItem, arr) {
        var rearr = []; //回傳陣列
        arr.forEach(function (el) { //遍歷API的arr
            var newObj = {} //陣列物件成員
            var dontpush = true; //該資料是否放入轉換後物件 true 放入,false不放入
            for (let i = 0; i < ObjItem.length; i++) { //物件放置
                if (typeof (ObjItem[i][1]) != "undefined") {
                     //完整版方法
                    // putindex(i, ObjItem[i][1]);
                } else {
                    newObj[ObjItem[i][0]] = el[index];
                }
            }
            if (dontpush) {
                rearr.push(newObj)
            }
        });
        return rearr;
    }

請原諒小農將完整版隱藏
雖然這整個方法都是小農寫的
但礙於那良心與職業道德,恕無法整個公開
(聽說上班寫的東西,智慧財產就是公司的,我還不希望喝西北風)

但概念簡單說明一下

  1. 我們傳入一個ObjItem的參數
    • (閹割版)參數規則如下
    • [['name', 0],
      ['value', 4],
      ['trend', [4,5],
      function(data) {
      return (data[0] - data[1])
      }]]
    • 說明:我們傳入一個陣列處理參數,第一參數代表key值,第二參數代表對應的每個二維陣列的序列指向位置,第三參數則是對這個處理的方法
    • 實現:我們運用typeof()來辨別所傳入的東西是甚麼,如果是數字,且第三參數為undefined,則直接放入新生成的obj裡,若第三參數typeof()出來為一個function字串,則呼叫方法進行一連串的資料處理
  • 其他設計概念請參考上方註解

其他理論內容我們已經在上一篇一起看過了
在一般情況下

var obj = {}
//等同於
var obj = new Object();

然而當如果看官們已經寫了

function Person(name) {
  this.name = name;
  this.greeting = function() {
    alert('Hi! I\'m ' + this.name + '.');
  };
}

這樣子的方法類別宣告的話
則需要用下面的方式產生兩個完全不同的記憶體位置去做物件生成

var person1 = new Person('Bob');
var person2 = new Person('Sarah');
//呼叫方法
person1.name
person1.greeting()
person2.name
person2.greeting()

其他函數宣告

function f1(){};
var f2 = function(){}

其差別在於f1會做提升(hoisting)而f2不會
何謂提升呢?
以下面程式碼為例

var a='hello';

callfn(a);

function callfn(a){
    console.log(a)
}

這個在於其他語言中或許會錯誤
但我們聊過js的運作模式:把文檔變字符串,然後變程式碼,也就是說可以理解成當語法解析讀到var、let、const時就明白,現在要切一塊地方宣告變數、當讀到function時就會知道這個東西會被提升(hoisting)

然而這段的話的意思就是把上面的程式碼變成下面

function callfn(a){
    console.log(a)
}
var a='hello';
callfn(a);

因此我們簡單看到js的引擎把文件導入處理完後
將所有的實名方法提升自文檔最上面,因此使用方法於宣告前也不會出錯


上一篇
三本柱大混戰 # 26 js的型別與運算子
下一篇
三本柱大混戰 # 28 我學了java,搞不懂js的繼承是怎樣怎麼辦?來看懶人包吧
系列文
大家都在鐵人賽跑JS,這條鹹魚不只翻身還被煎得有點焦了,我們來點實務吧31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言