下面是收集了一些Javascript中的一些小技巧,会不定时更新,欢迎留言补充。
数字0-6到“一二三四五六日”的对应
Javascript中的日期对象得到星期时是使用getDay()方法,得到的是0-6的数字
要实现的方法是
var chineseWeek = getChineseWeek(3); // chineseWeek为三
比较啰嗦的实现方法有switch
注意:以下实现都省略了空值判断等
var getChineseWeek = function(n) {
var w = '';
switch(n) {
case 0:
w = '日';
break;
case 1:
w = '一';
break;
...
}
return w;
};
第二种可以使用数组
var getChineseWeek = function(n) {
return ['日', '一', '二', '三', '四', '五', '六'][n];
};
第三种使用字符串
var getChineseWeek = function(n) {
return '日一二三四五六'.charAt(n);
};
快速得到标准的时间格式
我们经常有这样的需求,把当前的时间转化为2014-06-23 11:36:41
的形式,通常的实现方式是
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)/
这段正则的意思是,匹配前面是-
或者:
或者空格的并且后面不是数字的单个数字,像2014-6
-12 6
:7
:43这里面的红色数字会被匹配。然后$1
是指匹配到的-
或者:
或者空格,$2
是指匹配到的单个数字,$10$2
即实现了单个数字前面补0的效果。
得到一个数组的随机副本
要求是
var arr = [3, 6, 8, 1, 0, 10, 67, 23];
var arr2 = shuffle(arr); // arr2 => [67, 0, 10, 1, 8, 3, 6, 23]
去百度面试的时候,面试官出过这么一个题目,因为看过underscore的源码,所以写出了underscore的实现方法,如下:
_.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;
};
原理就是获得一个随机索引,根据随机索引取出数组中随机的一个,与最新的一个值进行交换。
然后面试官给出了另外一种实现方式,原理也差不多
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);
};
后来偶然发现了另外一种更牛逼的实现方式
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);
};
获取随机码
随机码是形如这样形式的字符串be0e2bbd329b35ed
,在JavaScript中有广泛的应用。
比如在编写jQuery插件时,为了标识每一个插件实例,常常使用随机码来设置ID。
专业的叫法是uuid
,可以保持唯一性,具有复杂的算法,这里仅仅介绍简单的。
以下列举几种生成方法
第一种
var S4 = function() {
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
};
// 随机程度可以随着S4的调用次数而变化
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];
请自行领悟。
将一个数组插入另一个数组的指定位置
看到这个标题,最先想到的应该是使用数组的splice
方法,但是splice方法接受的参数是需要一个一个写出来的
arrayObject.splice(index, howmany, item1,.....,itemX)
到这里,可以想到使用apply来改变参数的传递方式,最终代码如下:
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));