for in 与Object.keys()的区别function test(a, b) { this.a = a; this.b = b; } test.prototype = { c: "c" } var _a = new test("a", 1); console.log(Object.keys(_a));//["a","b"] for (var key in _a) { console.log(key); // a,b,c }总结:Object.keys():返回一个数组,数组值为对象自有的属性,不会包括继承原型的属性for in :遍历对象可枚举属性,包括自身属性,以及继承自原型的属性

在 MySQL 关系型数据库中,往往会存在多种排序算法。通过 MySQL 的源码和官方文档介绍可以得知,它的排序规律可以总结如下:当 order by 不使用索引进行排序时,将使用排序算法进行排序;若排序内容能全部放入内存,则仅在内存中使用快速排序;若排序内容不能全部放入内存,则分批次将排好序的内容放入文件,然后将多个文件进行归并排序;若排序中包含 limit 语句,则使用堆排序优化排序过程。当 order by limit 分页出现数据丢失和重复。而 order by 的 sort 字段没有使用索引(正常情况下,排序的字段也不会使用索引),如果使用了索引,则会进行索引排序。因此可以得出,上面的图二和图三的 SQL 语句使用了堆排序。因为 sort 字段没有索引,所以没走索引排序;并且使用了 limit。导致最终使用了堆排序。如果了解算法的你,应该知道堆排序是不稳定的。这种不稳定性,指的就是多次排序后,各个数的相对位置发生了变化。但是,不是所有的 MySQL 版本都是这样。从 MySQL 5.6 版本开始,优化器在使用 order by limit 时,做了上面的优化,导致排序字段没有

前言在面试的时候,经常会有面试官让你实现一个 Promise,如果参照 A+规范来实现的话,可能面到天黑都结束不了。 说到 Promise,我们首先想到的最核心的功能就是异步链式调用,本篇文章就带你用 20 行代码实现一个可以异步链式调用的 Promise。 这个 Promise 的实现不考虑任何异常情况,只考虑代码最简短,从而便于读者理解核心的异步链式调用原理。代码function Promise(fn) { this.cbs = []; const resolve = (value) => { setTimeout(() => { this.data = value; this.cbs.forEach((cb) => cb(value)); }); } fn(resolve); } Promise.prototype.then = function (onResolved) { return new Promise((resolve) => { this.cbs.push(() =

问题农场有1只母羊,母羊会在第2年,第4年各生下一只母羊,母羊第5年会死亡,20年后有多少只母羊 ?PHP实现代码//定义数组,维护各年龄段的母羊数量 $sheep = array(1,0,0,0,0); for($i=1;$i<=20;$i++){ //每年得到新生产的羊(2岁和4岁的羊会生产新的羊) $new_sheep = $sheep[1] + $sheep[3]; //把新生产的小羊数量放到数组开头,表示只有一年 array_ushift($sheep,$new_sheep); //删除超过5年的老羊 array_pop($new_sheep); } //循环结束后得到各个年龄段的母羊数量,相加得到结果 echo array_sum($new_sheep);本质上是一个出栈入栈的题目