Skip to content

Instantly share code, notes, and snippets.

@shawndxl
Last active July 21, 2016 08:23
Show Gist options
  • Save shawndxl/e0d7e84ad375d8fccda55abda9879708 to your computer and use it in GitHub Desktop.
Save shawndxl/e0d7e84ad375d8fccda55abda9879708 to your computer and use it in GitHub Desktop.
JS基本功

JS 基本功

Array 数组对象
String 字符串对象
RegExp 正则表达式对象
Functional Programing 函数式编程
immediately-invoked function expression 立即调用函数表达式 / 自执行匿名函数
技巧
  • 返回一个id,作为下次关闭该函数的参数,例如setTimeout()\setInterval\requestAnimationFrame()
var loader = setTimeout(function() {});
clearTimeout(loader);
Array.sort() 使用中的坑
var arr = [
	{
		id: 2,
		stage: 2,
		value: 0,
	},
	{
		id: 3,
		stage: 0,
		value: 1,	
	},
	{
		id: 1,
		stage: 1,
		value: 0,
	},
]

// 要求:优先按照stage排序,顺序为 stage=1>0>2 ,如果stage都为0时,value不为0的排在前边;

// 错误的版本 (这个错误的版本在某些机型是能够返回要求的效果的,但并不能蒙蔽,比如这段代码我在PC上测试能够满足要求,在iphone5s ios8.3中则没有满足要求)
arr.sort(function(a, b) {
    if (b.stage === 0 && a.stage === 0 && !a.value && b.value) {
        return 1;
    }
    return stageRanking[b.stage] - stageRanking[a.stage];
});

// 正确的版本
arr.sort(function(a, b) {
    if (b.stage === 0 && a.stage === 0) {
	    return computePara(b.schedule_value) - computePara(a.schedule_value);
    }
    return stageRanking[b.stage] - stageRanking[a.stage];
});
var stageRanking = {
	0: 1,
  	1: 2,
  	2: 0
};
function computePara(para) {
  if (!para) return 0;
  return 1;
}
  • 原因解析:sort传入的a和b并不一定是先后的关系,所以在排序的时候一定不能把逻辑建立在a和b的前后关系上,而是抛开所有前后关系,建立一个“我给你两个参数,你告诉我谁在前边的通用的公式”即可,而不关心这个参数是从哪来的
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment