Skip to content
🤔 质量即一切 🧠
❓:process.nextTick()与promise.then()```process.nextTick(function(){ console.log(7);});new Promise(function(resolve){ console.log(3); resolve(); console.log(4);}).then(function(){ console.log(5);});process.nextTick(function(){ console.log(8);});```这段代码运行结果是3,4,7,8,5process.nextTick和Promise都是Microtasks,为什么process.nextTick会先执行?

🧠:process.nextTick 永远大于 promise.then,原因其实很简单。在Node中,_tickCallback在每一次执行完TaskQueue中的一个任务后被调用,而这个_tickCallback中实质上干了两件事:1.nextTickQueue中所有任务执行掉(长度最大1e4,Node版本v6.9.1)2.第一步执行完后执行_runMicrotasks函数,执行microtask中的部分(promise.then注册的回调)所以很明显 process.nextTick > promise.then

❓:为什么js里面 0.1+0.2=0.30000000000000004?```var a =0.1;var b =0.2;log(a+b)//0.30000000000000004```这是什么原因

🧠:本质是因为浮点数的问题。其实不用想的太复杂,你把0.1换算成二进制的形式就知道,它的二进制表示是一个无限循环的数。也就说实际上保存到内存里的0.1是一个近似值。然后一个近似于0.1的二进制数再转回10进制,就会出现这种问题。

❓:JavaScript中typeof原理探究?我们都知道 `typeof(null) === 'object'`,关于原因,在小黄书《你不知道的JavaScript》中有这么一段解释:原理是这样的, 不同的对象在底层都表示为二进制, 在 JavaScript 中二进制前三位都为 0 的话会被判断为 object 类型, null 的二进制表示是全 0, 自然前三位也是 0, 所以执行 typeof 时会返回“object”。我就想问下,不同的对象对应的二进制数是多少位的,具体值又是多少?比如String类型的二进制表示是多少?

🧠:并不完全正确。我在知乎 有哪些明明是 bug,却被说成是 feature 的例子? 有介绍过。javascript 中的 `null`:既是对象,又不是对象,史称「薛定谔的对象」。```typeof null === 'object';null instanceof Object === false```而```null instanceof null```会抛出异常:```Uncaught TypeError: Right-hand side of 'instanceof' is not an object```这是一个历史遗留下来的 feature(or bug?),The history of “typeof null”在 javascript 的最初版本中,使用的 32 位系统,为了性能考虑使用低位存储了变量的类型信息:- 000:对象- 1:整数- 010:浮点数- 100:字符串- 110:布尔有 2 个值比较特殊:- undefined:用 - (−2^30)表示。- null:对应机器码的 NULL 指针,一般是全零。在第一版的 javascript 实现中,判断类型的代码是这么写的:```if (JSVAL_IS_VOID(v)) { // (1) type = JSTYPE_VOID;} else if (JSVAL_IS_OBJECT(v)) { // (2) obj = JSVAL_TO_OBJECT(v); if (obj && (ops = obj->map->ops, ops == &js_ObjectOps ? (clasp = OBJ_GET_CLASS(cx, obj), clasp->call || clasp == &js_FunctionClass) // (3,4) : ops->call != 0)) { // (3) type = JSTYPE_FUNCTION; } else { type = JSTYPE_OBJECT; }} else if (JSVAL_IS_NUMBER(v)) { type = JSTYPE_NUMBER;} else if (JSVAL_IS_STRING(v)) { type = JSTYPE_STRING;} else if (JSVAL_IS_BOOLEAN(v)) { type = JSTYPE_BOOLEAN;}```(1):判断是否为 undefined(2):如果不是 undefined,判断是否为对象(3):如果不是对象,判断是否为数字(4):。。。这样一来,`null` 就出了一个 bug。根据 type tags 信息,低位是 `000`,因此 `null` 被判断成了一个对象。这就是为什么 `typeof null` 的返回值是 `object`。关于 `null` 的类型在 MDN 文档中也有简单的描述:typeof - javascript | MDN在 ES6 中曾有关于修复此 bug 的提议,提议中称应该让 `typeof null === 'null'` http://wiki.ecmascript.org/do...:typeof_null 但是该提议被无情的否决了,自此 `typeof null` 终于不再是一个 bug,而是一个 feature,并且永远不会被修复。这是 JavaScript 最初实现的一个 bug,目前的 JavaScript 引擎已经不这么去实现了,但是这个 bug 却一直流传了下来。至于对象的内部表示,不同的 JavaScript 引擎实现起来都是不一样的,单说说 V8 吧。v8引擎是如何知道js数据类型的? (原文太长我就不贴过来了)

❓:怎么提高组织语言能力和表达能力?求指导下,主要在项目文档的撰写和开会对项目口语表达怎么提高组织语言能力和表达能力?求指导下,主要在项目文档的撰写和开会对项目口语表达

🧠:提高表达能力的核心是理清思路,我用来提高自己表达能力的方法是复述,具体操作是找几部自己比较喜欢的电影,看15min,然后暂停,并且用1min复述这15min的剧情,每天锻炼1h左右(也就是复述4次),一个月左右就能有较为明显的效果了。这个方法我在高中毕业的暑假中用过,持续了一个多月。之后在大学四年中,我参与竞选的演讲都十分成功,现在工作后与领导同事的沟通、组会交流,以及项目沟通都十分顺畅。我比较推荐这个方法,您可以试一下。

❓:git 怎样删除远程仓库的某次错误提交?在网上找到一种方法:在本地把远程的master分支删除,再把reset后的分支内容给push上去本地仓库 彻底回退到某一个版本git reset –hard删除远程的master分支 (注意master前有个:)git push origin :master重新创建远程master分支(这跟我们第1次提交本地代码库给远程仓库的命令一样吧)git push origin master我的问题是除了这种比较暴力的方法,还有别的方法吗?

🧠:假设你有3个commit如下:```commit 3commit 2commit 1```其中最后一次提交`commit 3`是错误的,那么可以执行:```git reset --hard HEAD~1```你会发现,`HEAD is now at commit 2`。然后再使用`git push --force`将本次变更强行推送至服务器。这样在服务器上的最后一次错误提交也彻底消失了。值得注意的是,这类操作比较比较危险,例如:在你的`commit 3`之后别人又提交了新的`commit 4`,那在你强制推送之后,那位仁兄的`commit 4`也跟着一起消失了。

❓:Vue动态面包屑导航怎么实现没有思路,求大神解答补充一下,我的思路是beforeEach获取上一个路由name和即将进入的路由name,然后填加到数组,最后router-link循环,但是不知道从哪下手

🧠:```var routeList = []router.beforeEach((to, from, next) => { var index = routeList.indexOf(to.name) if (index !== -1) { //如果存在路由列表,则把之后的路由都删掉 routeList.splice(index + 1, routeList.length - index - 1) } else { routeList.push(to.name) } to.meta.routeList = routeList next()})```之后在需要用到的页面```beforeRouteEnter(to, from, next) { next(vm=>{ vm.routeList = to.meta.routeList })}```或者在watch里```this.route.meta.routeList```

Released under the MIT License.

has loaded