成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Javascript中的一些小trick

ideaa / 2351人閱讀

摘要:下面是收集了一些中的一些小技巧,會不定時更新,歡迎留言補(bǔ)充。專業(yè)的叫法是,可以保持唯一性,具有復(fù)雜的算法,這里僅僅介紹簡單的。以下列舉幾種生成方法第一種隨機(jī)程度可以隨著的調(diào)用次數(shù)而變化第二種原理差不多交換值第一種第二種請自行領(lǐng)悟。

下面是收集了一些Javascript中的一些小技巧,會不定時更新,歡迎留言補(bǔ)充。

數(shù)字0-6到“一二三四五六日”的對應(yīng)

Javascript中的日期對象得到星期時是使用getDay()方法,得到的是0-6的數(shù)字

要實(shí)現(xiàn)的方法是

var chineseWeek = getChineseWeek(3); // chineseWeek為三

比較啰嗦的實(shí)現(xiàn)方法有switch

注意:以下實(shí)現(xiàn)都省略了空值判斷等

var getChineseWeek = function(n) {

    var w = "";
    switch(n) {
        case 0:
            w = "日";
            break;
        case 1:
            w = "一";
            break;
        ...
    }
    return w;
};

第二種可以使用數(shù)組

var getChineseWeek = function(n) {
    return ["日", "一", "二", "三", "四", "五", "六"][n];
};

第三種使用字符串

var getChineseWeek = function(n) {
    return "日一二三四五六".charAt(n);
};
快速得到標(biāo)準(zhǔn)的時間格式

我們經(jīng)常有這樣的需求,把當(dāng)前的時間轉(zhuǎn)化為2014-06-23 11:36:41的形式,通常的實(shí)現(xiàn)方式是

var formatNum = function(n) {
    return n > 10 ? n : "0" + n;
};

var getCurrDateTime = function() {
    var d = new Date(),
        year = d.getFullYear(),
        month = d.getMonth() + 1,
        day = d.getDate(),
        hour = d.getHours(),
        min = d.getMinutes(),
        sec = d.getSeconds();
    return year +
        "-" +
        formatNum(month) +
        "-" +
        formatNum(day) +
        " " +
        formatNum(hour) +
        ":" +
        formatNum(min) +
        ":" +
        formatNum(sec);
};

我們可以使用正則簡化一下

var getCurrDateTime = function() {
    var d = new Date();
    var dt = d.getFullYear() +
        "-" +
        (d.getMonth() + 1) +
        "-" +
        d.getDate() +
        " " +
        d.getHours() +
        ":" +
        d.getMinutes() +
        ":" +
        d.getSeconds();
    return dt.replace(/([-:s])(d{1})(?!d)/g, "$10$2");
};

解析:

/([-:s])(d{1})(?!d)/這段正則的意思是,匹配前面是-或者:或者空格的并且后面不是數(shù)字的單個數(shù)字,像2014-6-12 6:7:43這里面的紅色數(shù)字會被匹配。然后$1是指匹配到的-或者:或者空格,$2是指匹配到的單個數(shù)字,$10$2即實(shí)現(xiàn)了單個數(shù)字前面補(bǔ)0的效果。

得到一個數(shù)組的隨機(jī)副本

要求是

var arr = [3, 6, 8, 1, 0, 10, 67, 23];
var arr2 = shuffle(arr); // arr2 => [67, 0, 10, 1, 8, 3, 6, 23]

去百度面試的時候,面試官出過這么一個題目,因?yàn)榭催^underscore的源碼,所以寫出了underscore的實(shí)現(xiàn)方法,如下:

_.shuffle = function(obj) {
    var rand;
    var index = 0;
    var shuffled = [];
    each(obj, function(value) {
        rand = _.random(index++);
        shuffled[index - 1] = shuffled[rand];
        shuffled[rand] = value;
    });
    return shuffled;
};

原理就是獲得一個隨機(jī)索引,根據(jù)隨機(jī)索引取出數(shù)組中隨機(jī)的一個,與最新的一個值進(jìn)行交換。

然后面試官給出了另外一種實(shí)現(xiàn)方式,原理也差不多

var shuffle = function(array, length) {
    var length = length || array.length,
        newArr = [],
        randomIndex,
        removed;
    array.forEach(function(elem, index) {
        randomIndex = Math.floor(Math.random() * index);
        removed = newArr.splice(randomIndex, 1, elem);
        removed.length && newArr.push(removed[0]);
    });
    return newArr.slice(0, length);
};

后來偶然發(fā)現(xiàn)了另外一種更牛逼的實(shí)現(xiàn)方式

var shuffle = function(array, length) {
    var length = length || array.length;
    var array = array.slice();
    array.sort(function() {
        return Math.random() - 0.5;    
    });
    return array.slice(0, length);
};
獲取隨機(jī)碼

隨機(jī)碼是形如這樣形式的字符串be0e2bbd329b35ed,在JavaScript中有廣泛的應(yīng)用。
比如在編寫jQuery插件時,為了標(biāo)識每一個插件實(shí)例,常常使用隨機(jī)碼來設(shè)置ID。

專業(yè)的叫法是uuid,可以保持唯一性,具有復(fù)雜的算法,這里僅僅介紹簡單的。

以下列舉幾種生成方法

第一種
var S4 = function() {
    return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
};

// 隨機(jī)程度可以隨著S4的調(diào)用次數(shù)而變化
var guid = function() {
    return S4() + S4() + S4() + S4();
};
第二種

原理差不多

Math.random().toString(36).substring(2);
交換值 第一種
var a = 1, b = 2;
a = [b, b = a][0];
第二種
var a = 1, b = 2;
a = [b][b = a, 0];

請自行領(lǐng)悟。

將一個數(shù)組插入另一個數(shù)組的指定位置

看到這個標(biāo)題,最先想到的應(yīng)該是使用數(shù)組的splice方法,但是splice方法接受的參數(shù)是需要一個一個寫出來的

arrayObject.splice(index, howmany, item1,.....,itemX)

到這里,可以想到使用apply來改變參數(shù)的傳遞方式,最終代碼如下:

var a = [1,2,3,7,8,9];
var b = [4,5,6];
var insertIndex = 3;
a.splice.apply(a, Array.prototype.concat(insertIndex, 0, b));

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78169.html

相關(guān)文章

  • Nodejs中的一些trick

    摘要:要達(dá)到想要的效果正確的做法是即用來產(chǎn)生一個立即作用域,保證回調(diào)函數(shù)執(zhí)行的時候最近的原型作用域的就是當(dāng)時循環(huán)的。判斷數(shù)組中是否存在滿足條件的項,只要有一項滿足條件,就會返回。 之前常常因?yàn)椴蛔⒁?,?xí)慣用寫PHP或者Java的方式來寫nodejs,產(chǎn)生了了一些錯誤,這里總結(jié)一些小小的trick,以便于展示nodejs的不同,和平時需要注意的地方。 變量提升 var variable = g...

    tomorrowwu 評論0 收藏0
  • 【譯】讓人傾倒的 11 個 npm trick

    摘要:沒有安裝全局某個項目不影響該命令的使用。該標(biāo)志會安裝,忽略。這會確保開發(fā)所使用的工具及不會進(jìn)入生產(chǎn)環(huán)境。結(jié)果就是,發(fā)布項目時,不得不審查兩個文件是否同步,防止敏感信息的泄露。確保更改默認(rèn)的用戶名,作為用戶名環(huán)境變量的值。 本文轉(zhuǎn)載自:眾成翻譯譯者:文藺鏈接:http://www.zcfy.cc/article/1206原文:https://nodesource.com/blog/ele...

    Tangpj 評論0 收藏0
  • FCC 成都社區(qū)·前端周刊 第 11 期

    摘要:正式發(fā)布已正式發(fā)布,新版本重點(diǎn)關(guān)注工具鏈以及工具鏈在中的運(yùn)行速度問題。文章內(nèi)容包括什么是內(nèi)存,內(nèi)存生命周期,中的內(nèi)存分配,內(nèi)存釋放,垃圾收集,種常見的內(nèi)存泄漏以及如何處理內(nèi)存泄漏的技巧。 1. Angular 6 正式發(fā)布 Angular 6.0.0 已正式發(fā)布,新版本重點(diǎn)關(guān)注工具鏈以及工具鏈在 Angular 中的運(yùn)行速度問題。Angular v6 是統(tǒng)一整體框架、Material ...

    lentrue 評論0 收藏0
  • FCC 成都社區(qū)·前端周刊 第 11 期

    摘要:正式發(fā)布已正式發(fā)布,新版本重點(diǎn)關(guān)注工具鏈以及工具鏈在中的運(yùn)行速度問題。文章內(nèi)容包括什么是內(nèi)存,內(nèi)存生命周期,中的內(nèi)存分配,內(nèi)存釋放,垃圾收集,種常見的內(nèi)存泄漏以及如何處理內(nèi)存泄漏的技巧。 1. Angular 6 正式發(fā)布 Angular 6.0.0 已正式發(fā)布,新版本重點(diǎn)關(guān)注工具鏈以及工具鏈在 Angular 中的運(yùn)行速度問題。Angular v6 是統(tǒng)一整體框架、Material ...

    NusterCache 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<