Blog
Blog copied to clipboard
冴羽写博客的地方,预计写四个系列:JavaScript深入系列、JavaScript专题系列、ES6系列、React系列。
30 岁了, 现在开始努力,晚吗? 这让我想起,非洲经济女学家 Dambisa Moyo 的《dead aid》书中的结束语: > “The best time to plant a tree is 20 years ago. The second-best time is now.” “最好的种一棵树的时间是 20 年前,其次是现在”,启示我们不要被年龄和时间束缚,临渊羡鱼,不如退而结网,与其哀怨叹气,不如现在就开始行动起来。 网上也有段子,黄忠六十跟刘备,德川家康七十大天下,姜子牙八十为丞相,佘太君百岁挂帅,孙悟空五百多岁西天取经,白素贞一千多年下山谈恋爱,以戏谑的方式讲述了大器晚成这个道理。 听起来确实是能宽慰人心,什么时候都不算晚,从现在开始做,也就是大器晚成而已。...
fix: new judge is wrong
## 前言 最近我发起了[「冴羽答读者问」](https://www.yuque.com/yayu/ask/dzng83)活动,如果你也有想要提问的问题,欢迎留言,我会按照顺序依此回答。 ## 正文 自从写了「冴羽答读者问」系列后,我收到了朋友赠予的很多称号,“人生导师”、“鸡汤教主”、“情感博主” 等等。对于这些称号,我表示很喜欢,不过也让我产生了一些思考,就比如 “**「哲理」和 「鸡汤」之间的区别是什么呢?** ” 先说 “鸡汤” 这个词,它起源于一个叫做杰克·坎菲尔德的美国人,他的前半生只能说马马虎虎吧,到八十年代后期,他还欠债十四万美元,每天靠吃面条过日子。45 岁生日时,他用一张大纸,画了张一万美元大钞票,挂在墙上,盯着看,有一天受到启发,决定开始做个励志书作家。 书写好了,大约 100 个小故事,都是让人激发志气,有所作为,积极向上的。想到奶奶熬鸡汤给他治百病,于是书名取为《心灵鸡汤》,没有想到竟然热销,第一年就狂销八百万册,后来还分门别类,写了各种各样的鸡汤系列,比如《给豆蔻年华的心灵鸡汤》,《给为人父母的心灵鸡汤》,《给爱宠物者的心灵鸡汤》,《给高尔夫球玩者的心灵鸡汤》等等。 而受《心灵鸡汤》的影响,一些励志性或者启发性文章也被称为“鸡汤文”。 那 “哲理” 呢,它应该是“哲学原理” 的简称,通常是关于人生问题的哲学理论,是人生观的理论形式,主要探讨人生的目的、价值、意义、形态等。它的功能是让人了解宇宙人生的根本原理和道理,对人们的生活起到指引作用。 再结合我们过往 “喝鸡汤” 的经验,我们可以总结哲理与鸡汤的区别有: **在内容上,鸡汤侧重于故事性,往往通过一个正向的小故事来进行引证,得出一个正向的结论,而哲理侧重于逻辑的思辨,强调思考和证明,因此理解起来也会更有难度。** **在作用上,鸡汤喜欢输出情绪,强调心理认同,或励志或暖心或安慰,使人得以精神的慰藉,或让人的负面情绪得以缓解,或给与信心,激发人的正面情绪。而哲理则具有真理性,侧重于引导人们进行正确的认知,因此对人的生活实践有指导性。** 但这些还并不足以让我们区分出鸡汤和哲理,而且判断标准跟人的认知程度也有很多大的关系。一句话,有的人觉得是鸡汤,有的人可能觉得是哲理。同一句话,可能年轻的时候以为是鸡汤,成熟后反而觉得是哲理,反之也有可能。 我想其实也不用区分得那么清楚,只要有用,即便是鸡汤喝一喝也没有什么不好。但我曾有过这样的经历:看过很多成功学书籍后,对这种内容产生了很强的逆反心理,甚至对所有积极的内容,内心都涌现出一种不屑一顾,别人提起时,我还会嘲讽:“怎么就这么喜欢看鸡汤?” 其实回想一下自己之所以会这样,在于鸡汤或哲理再有用,自己不去坚持践行依然没有什么用,我没有坚持下来,于是将自己的失败、无力、自卑归咎于对这些内容的怀疑,多少有点...
## 前言 TypeScript 的官方文档早已更新,但我能找到的中文文档都还停留在比较老的版本。所以对其中新增以及修订较多的章节进行了翻译整理。 我同时搭建了 TypeScript 中文站点: [https://ts.yayujs.com](https://ts.yayujs.com) ,正是因为我亲自翻译过,所以我认为这是国内最好的系统学习 TS 的教程之一。 本篇翻译整理自 TypeScript Handbook 中 「[Everyday Types](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html)」 章节。 欢迎围观[朋友圈](https://yayujs.com)、加入[低调务实优秀中国好青年](https://www.yuque.com/yayu/nice-people/xou8qr)前端社群,一个人走得快,一群人走得远。 ## 类型别名(Type Aliases) 我们已经学会在类型注解里直接使用对象类型和联合类型,这很方便,但有的时候,一个类型会被使用多次,此时我们更希望通过一个单独的名字来引用它。 这就是类型别名(type alias)。所谓类型别名,顾名思义,一个可以指代任意类型的名字。类型别名的语法是: ```typescript type Point = {...
## 前言 最近我发起了[「冴羽答读者问」](https://www.yuque.com/yayu/ask/dzng83)活动,如果你也有想要提问的问题,欢迎留言,我会按照顺序依此回答。 ## 正文 首先真的非常感谢你的肯定,但“优秀”二字让我愧不敢当,在我看来,我并没有做到过什么厉害的事情,只是一路走来,将自己学习到的东西分享出来而已,引用阮一峰老师之前发过的微博:  我也常常觉得,我只不过是做一块垫脚石,力所能及的为社区做一些微小的贡献罢了。 所以虽然我不能回答“如何变得优秀”这个问题,但根据我过往的经历,我倒是可以聊聊,如何快速的改变自己。 能这么早参与这个话题,想必是我群里的同学,那我其实早就给出了答案,2 月 7 日,在今年开工之际,我专门在群里写了我们群的 2022 年规划: > 我常跟大家说快速改变人生的五件事情,分别是 **「早起」、「阅读」、「运动」、「写作」、「冥想」**,大家想必已经发现了,其实我们就是在不断的落实这五件事情。技术的成长绝不是一朝一夕,更要做好长期学习的准备,而在这样的过程中,良好的习惯将会帮助我们更快的进步,但在进步之外,我更希望大家能在这些事情的参与中,收获一份自信,多一份底气,对人生多一份积极,这在我看来,这比技术问题本身更加重要。 这五件事情的具体意义我就不多说了,五件事情来自于周岭的《认知觉醒》这本书,微信读书上可以免费阅读,今天我想讲讲其他的事情,第一个是关于相信。 我在大学的时候,关于“拖延”这个问题,就看过至少十几本书籍,每次在图书馆看这些书籍的时候,笔记记得满满,我也感到浑身充满了力量,决心要做一个好的计划,践行书中的方法,不拖延,改变自己,然而最终还是以失败告终。 多少年后,回想起这段经历,我突然想到,我们所做的技术不就和我们看过的工具书一样吗,他们提供了方法,仿佛你只要这样做,就一定能成功,但方法方法我践行失败,技术技术我学不下去……内心总觉得少了一点什么推动我,这时我才意识到,理性可以让我们设计一个对自己利益最大化的结果,但如果内心不是真的想去这样做,终究会以失败告终,所以能让你改变的开始,是你自己内心真的开始这样想,你真的开始相信。 然而让自己“相信”却不是一件容易的事情,我们并不迷恋权威,我们会发现,最相信的人就是我们自己,我们对于很多事情,无知者无畏,因为你不懂,所以你觉得别人说的都是错的,你觉得只有自己最懂,你觉得这个也不对,那个也不对,就是我对,但是我又说不出我为什么对,总之我就是对,反正你就是不对,大家会发现,很多人都是带有这样一种学习的思路,所以即便我晓之以情,动之以理,把事情的好处写个成千上万条,你自己都没有做到过,你也不会真的内心相信这件事情。 所以我想说的是,在独自思考的时候,可以放下心中对自己的迷之信心,放下自己被同化的害怕,相信这个世界上无数前人总结的经验,如果你觉得别人讲的道理有理有据,而自己暂时无法反驳,碰巧自己对这件事情有兴趣,那就不如相信他们说的是对的,然后笃定地行动。在行动中,保持自己的思考,用行动反复的验证理论,不适则改,最终对这个东西产生自己的思考和理解。只有这个时候,你做的批判才是真正有价值的批判。 第二个是关于氛围,如果你自己不能通过主动的思考去化解心中的戒备,那也许你需要的是,一种氛围。这就像,如果要激发一个小朋友学习吉他的兴趣,最好的方法不是让他去培训班学习吉他,而是带他去音乐家,或者是拿出自己的吉他,在他面前演奏一曲,当你能看到他崇拜眼神的时候,你就知道你成功的做到了。 我们群的问早打卡活动也是一样,而我作为群主有更深切的体会,从小七开始在群里早起打卡以来,我们逐渐发展出了问早打卡这个活动,每周的数据我都有统计,并写在语雀文档里,你可以很明显的发现,最早能做到每周打卡 4 天以上的只有 6 人, 10...
## 前言 在[《JavaScript专题之跟着underscore学防抖》](https://github.com/mqyqingfeng/Blog/issues/22)中,我们了解了为什么要限制事件的频繁触发,以及如何做限制: 1. debounce 防抖 2. throttle 节流 今天重点讲讲节流的实现。 ## 节流 节流的原理很简单: 如果你持续触发事件,每隔一段时间,只执行一次事件。 根据首次是否执行以及结束后是否执行,效果有所不同,实现的方式也有所不同。 我们用 leading 代表首次是否执行,trailing 代表结束后是否再执行一次。 关于节流的实现,有两种主流的实现方式,一种是使用时间戳,一种是设置定时器。 ## 使用时间戳 让我们来看第一种方法:使用时间戳,当触发事件的时候,我们取出当前的时间戳,然后减去之前的时间戳(最一开始值设为 0 ),如果大于设置的时间周期,就执行函数,然后更新时间戳为当前的时间戳,如果小于,就不执行。 看了这个表述,是不是感觉已经可以写出代码了…… 让我们来写第一版的代码: ```js // 第一版...
## async ES2017 标准引入了 async 函数,使得异步操作变得更加方便。 在异步处理上,async 函数就是 Generator 函数的语法糖。 举个例子: ```js // 使用 generator var fetch = require('node-fetch'); var co = require('co'); function* gen() { var r1 = yield...
## 前言 最近我发起了[「冴羽答读者问」](https://www.yuque.com/yayu/ask/dzng83)活动,如果你也有想要提问的问题,欢迎留言,我会按照顺序依此回答。 ## 正文 有一种思维被称为“二元化思维”,有的时候也称“二元对立思维”,简单的来说就是非黑即白,所有的事情只有两种答案,对或者错,成功或者失败,好人或者坏人…… 也许你见过这样的对话,有一个人说:“我们不应该仅仅追求成功”,于是另外一个人嘲讽道:“难道我们要追求失败吗?” 也许你有过这样的经历,一个朋友在你一次需要帮助的时候没有帮你,于是觉得 TA 并不喜欢你,结果开始慢慢的疏远,最终这份距离被对方察觉,双方渐行渐远。 所谓二元化思维,就是思考和解决问题的时候,只看到了事物相反的两面或者两端,于是简单的寻求是或者不是,对或者错,A 或者 B。 在逻辑学中,有一个“排中律”的概念,它的目的在于保持思想自身的明确性,指的是在同一个思维过程中,两种思想不能同假,其中必有一真,即“要么 A 要么非 A”。这很好理解,外星人要么存在,要么不存在,至于是否真的存在,这是科学的事情,不是逻辑的事情。 不过生活中很多人会将“排中律”误用,误认为两者必有真,所以要么是成功,要么是失败。“成功”的另外一面就是“失败”吗?如果按照“排中律”的话,“成功”的另外一面应该是“非成功”才对,那“非成功”就是失败吗? 你肯定知道,很多东西都是有“中间地带”的:学习 JavaScript,在掌握与未掌握之间,你可能是基本掌握,但还未完全掌握。评级一个人是好是坏,你也会渐渐地承认“人”的复杂性,有好的一面,也有坏的一面。 尽管随着心智的成熟,我们的这种二元化思维会越来越少,但很多时候,我们依然会陷入这种二元的极端思维中。刚开始举的例子就是一种,你可能因为没有帮助你,而疏远他人。你可能因为请求被拒绝,而讨厌一个人。你可能因为一个失误而错失成功,于是一直觉得自己很差劲。你可能因为今天一觉睡到 10 点,而觉得今天就废了,于是摆烂度过一天,你可能因为总想着一次写到完美,于是反复遣词造句,最后写到心累放弃。而当反驳他人的时候,“难道要追求失败吗”这种略显杠精的话也可能说的出来。 要么成功,要么失败,要么 0%,要么 100%,要么 A 要么 B,这种思维很可能让我们做出错误的判断。 可是为什么我们会有这种思维呢?我觉得这可能跟我们从小受到的教育有关系。...
## 前言 在上篇[《JavaScript深入之执行上下文栈》](https://github.com/mqyqingfeng/Blog/issues/4)中讲到,当 JavaScript 代码执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution context)。 对于每个执行上下文,都有三个重要属性: * 变量对象(Variable object,VO) * 作用域链(Scope chain) * this 今天重点讲讲创建变量对象的过程。 ## 变量对象 变量对象是与执行上下文相关的数据作用域,存储了在上下文中定义的变量和函数声明。 因为不同执行上下文下的变量对象稍有不同,所以我们来聊聊全局上下文下的变量对象和函数上下文下的变量对象。 ## 全局上下文 我们先了解一个概念,叫全局对象。在 [W3School](http://www.w3school.com.cn/jsref/jsref_obj_global.asp) 中也有介绍: >全局对象是预定义的对象,作为 JavaScript 的全局函数和全局属性的占位符。通过使用全局对象,可以访问所有其他所有预定义的对象、函数和属性。 >在顶层...
## 前言 虽然标题写的是如何判断两个对象相等,但本篇我们不仅仅判断两个对象相等,实际上,我们要做到的是如何判断两个参数相等,而这必然会涉及到多种类型的判断。 ## 相等 什么是相等?在[《JavaScript专题之去重》](https://github.com/mqyqingfeng/Blog/issues/27)中,我们认为只要 `===` 的结果为 true,两者就相等,然而今天我们重新定义相等: 我们认为: 1. NaN 和 NaN 是相等 2. [1] 和 [1] 是相等 3. {value: 1} 和 {value: 1} 是相等 不仅仅是这些长得一样的,还有 1. 1...