Blog icon indicating copy to clipboard operation
Blog copied to clipboard

冴羽写博客的地方,预计写四个系列:JavaScript深入系列、JavaScript专题系列、ES6系列、React系列。

Results 143 Blog issues
Sort by recently updated
recently updated
newest added

## 前言 最近我发起了[「冴羽答读者问」](https://www.yuque.com/yayu/ask/dzng83 "「冴羽答读者问」")活动,如果你也有想要提问的问题,欢迎留言,我会按照顺序依此回答。 文章主体写于一年多前,当时我苦于思考人生意义这个问题,于是写下了这篇随笔,正好有同学提到人生意义的问题,就让这篇随笔从我的草稿箱中重见天日,和大家分享我当时的一些思索,现在看来有些地方很是浅薄,但求个别思考能让大家有所启发。 ## 正文 人生的意义是什么?虽然我不是一个哲学家,但也经常思考这个问题,而在过往的两个时期,我对这个问题的答案的渴求尤为强烈。 第一次是在我大四碌碌无为,不想学习,不想工作,不知道未来要做什么,但也不想草率决定的时候。第二次是在工作后,每天如搬砖一样,觉得毫无意义,决定离职却又迫不得已要熬到年终奖的时候。 在一遍又一遍的求解中,我依然没有找到合适的答案,但我也突然意识到,也许我并不是真的想像哲学家一样,探求这个问题的答案,只是想要逃避现实,不想看到周围人都在努力而我还在停步不前,以为找到答案就可以奋起直追。只是当理想与现实发生矛盾的时候,无法劝说自己完成那些无聊乏味的事情,以为找到答案就可以万事心安。只是在安逸的生活中饱受无聊侵袭,以为找到答案就可以缓解焦虑,于是将对现实的逃避,对自由的渴望,对无聊的恐惧,转为了对人生意义这个问题的探求。 所以我才突然意识到,当在不同的背景下,出于不同的动机去思考问题,很可能答案也是不同的。如果脱离当下的环境去思考一个统一的答案,很可能是正确但苍白无力的,但如果结合当下的环境去思考,又有可能是合适但不恒久的。 但当下的痛苦确实是存在的,所以我会希望为自己寻求一个合适的答案,哪怕它只是暂时的。随着人生阶段和环境的变化,也许我会寻求新的答案,但新的答案不一定就是之前截然不同,也有可能是一种延伸和拓展,所以及时的记录自己的思考就显得非常重要,至少不会让你回到起点重新推导。 ## 人生没有意义吗 如果你问“人生的意义是什么”,可能会有大部分人的回答是“人生没有意义”。 确实很有道理,从空间的角度来看,地球也只不过是宇宙中的一粒尘埃而已,在这个狭小的世界上,偶然诞生的人类做的事又能有什么意义?从时间的角度来看,相比于宇宙的亿年,我们不过百年的一生又有什么意义?千万年后,一切又都化为灰烬,你觉得再有意义的东西也都会被遗忘、消失。在宇宙这个层面下的时间、空间中,渺小个体的所做所为是如此的没有意义。 但如果对于人生意义这个问题,只是简单的回答一句没有意义,却感觉又是不够的。如果人生没有任何意义,那你为什么不直接去死呢?既然还活着,说明还是有一些本质的东西在支撑着我们,于是就有了探求意义的需求。 ## 人需要意义吗 可是人们真的需要所谓的“意义”吗?人们也许需要的,其实是“意义感”。 德国社会学家马克斯.韦伯说:「人是挂在自己编织的意义之网上的动物。」这句话就是在阐述或者是在讽刺,人干什么都需要一个意义,可是人为什么总是需要一个意义呢? 我想这可能是跟人的天性有关,诸如好奇、掌控感、对死亡的恐惧等。 在对世界的探索中,人类逐渐知道了因果关系,到了如今的社会,科学的发展让我们深信凡事有因必有果,而知道因果会让我们对事物更有掌控感。那么,人的存在是果,那什么是因呢?处于对消亡的恐惧,想要掌控人生的欲求,让我们开始追求人生的因果。 所以意义更像是人为了自己的生存构建出来的东西,但人又依赖以及需要这种东西。从某种角度来讲,整个社会的运行,在其中赋予了人不同的角色,其本质都是为了创造人生存所必需的意义感,以避免人直接面对存在的虚无。 ## 关于意义 尽管不能直接的回答人生意义这个问题,但分享一些对意义本身的思考,也有助于我们寻找意义。 ### 意义由自己赋予,又受限制自己 前面讲到,人生本没有什么意义,但人是需要意义的。如果这个意义是外界强行赋予的,在遇到意义与现实矛盾的时候,往往会产生怀疑,最终回到起点,重新思考意义本身。所以生活的意义应由自己赋予,但这并不意味着自己赋予的就不会回到起点。我们所处的社会是复杂的,做出的选择不可避免的会受到利益和情感的驱使,这些都可能让我们做出截然不同的选择,进而产生怀疑和重新思考。只能说,由自己赋予的意义,更能坚持本心走下去,毕竟是你自己的生活,你可以做出选择。...

## bind 一句话介绍 bind: >bind() 方法会创建一个新函数。当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this,之后的一序列参数将会在传递的实参前传入作为它的参数。(来自于 MDN ) 由此我们可以首先得出 bind 函数的两个特点: 1. 返回一个函数 2. 可以传入参数 ## 返回函数的模拟实现 从第一个特点开始,我们举个例子: ```js var foo = { value: 1 }; function bar()...

深入系列

## 作用域 作用域是指程序源代码中定义变量的区域。 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。 JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。 ## 静态作用域与动态作用域 因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。 而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。 让我们认真看个例子就能明白之间的区别: ```js var value = 1; function foo() { console.log(value); } function bar() { var value =...

深入系列

为什么两处的__proto__看到的结果不一样 ![image](https://user-images.githubusercontent.com/32636542/171672796-aeab0686-28a9-4483-943c-6fcd7e102012.png)

## 前言 最近我发起了[「冴羽答读者问」](https://www.yuque.com/yayu/ask/dzng83)活动,如果你也有想要提问的问题,欢迎留言,我会按照顺序依此回答。 ## 正文 什么是焦虑? 引用百度百科里的解释: > 焦虑是人对现实或未来事物的价值特性出现严重恶化趋势所产生的情感反映 。与之相反的情感形式是企盼,即企盼是人对现实或未来事物的价值特性出现明显利好趋势所产生的情感反映。 > > 焦虑是指个人对即将来临的、可能会造成的危险或威胁所产生的紧张、不安、忧虑、烦恼等不愉快的复杂情绪状态。 **所以焦虑的客观目的是有益的,作用在于引导人迅速地采取各种措施,紧急调动各种价值资源,以有效地阻止现实或未来事物的价值特性出现严重恶化的这种趋势,使之朝着利好的方向发展。** 试想在远古时期,正是因为人类在残酷的大自然环境下,对食物、居住、猛兽等东西的焦虑,才能让人类及时采取行动,保证人类延续下去。 所以焦虑是一种正常的人类反应,但如果你经常焦虑,很容易因为一些小事感到不安,并伴随着极度紧张、头痛、心悸、心悸、烦躁不安、胃部有坠胀感等症状,很有可能,你患了焦虑症,我更建议你去医院就医。 我在查阅资料的时候,看到很多人推荐这本《精神焦虑症的自救(病理分析卷)》,豆瓣评分 8.2,你也可以参考。 不过大部分人应该还没到这么严重,面对焦虑,我有以下几个建议: 1. **接受,而非逃避或者抗争** 面对焦虑,我们常有两种回应方式。 第一种是逃避,用所谓的“忙碌”来填补自己的内心,只不过不同的人选择“忙碌”的方式不一样。有的人用工作逃避,这种方式最大的好处在于“有理有据”,面对别人的劝说或指责,可以给自己找到看似合理的借口,比如“我这是在工作,在干重要的事情呢”,或者“工作那么忙,哪有时间”,其实内心深处比谁都知道,这不过是自欺欺人的借口。跟工作相似的,还有阅读、家务等,这些都可以给自己找出合理且正向的借口。 有的人则是用奶头乐逃避,听音乐看动漫打游戏,看新闻刷抖音再刷朋友圈,各个软件都点开一遍去除小红点,明明没有动态还总觉得下次点开的时候会有消息,里面的内容自己也知道,但还是会再看一遍,实在没事干了,平时懒得干的事情也会捡起来,整理图片文件夹,换皮肤改字体,疯狂的寻找各种干起来不费力又有一点价值和快乐的事情。 但无论是哪种,一停下来,焦虑的情绪就会立刻涌现,让自己坐立不安,然后又继续逃避,陷入恶性循环之中。 第二种方式是抗争,为了摆脱焦虑的情绪,于是反复思考这些想法和情绪,试图找到解决方案。但是当你焦虑的时候,你越思考,你越觉得这些其实不怎么靠谱的想法像是真的,最后反而让这些情绪和所谓更加牢固,又形成了一个恶性循环。 难道我们就没有其他回应方式了吗?当然是有了,这就是很多书中提到的最核心的方法 —— 接受。然而怎样才算是接受呢? 我觉得这步最重要的就是放弃。放弃抗争,放弃试图控制控制恐惧的努力以及通过不断的自我分析“应该做什么”的想法。放弃逃避,允许意识中焦虑的存在,并愿意与它一起共存,毕竟它的存在客观目的还是帮助我们。...

答读者问

## 前言 最近我发起了[「冴羽答读者问」](https://www.yuque.com/yayu/ask/dzng83)活动,如果你也有想要提问的问题,欢迎留言,我会按照顺序依此回答。 ## 正文 我很少对自己的行为以“是否功利”这个维度进行思考,所以我不知道你是怎样定义功利性学习这个词的。 在传统的认知里,功利性学习是一个贬义词,指的是将学习作为寻求短期利益的工具,就比如为了考完这场试,为了找一份好工作,而不是将学习作为追求有意义生活的一种方式,但是现在越来越多的文章,对功利性学习做了重新定义,指的是从自己的实际需求出发,学习需要用到的内容,很多对功利性学习赞扬的文章多是从这个定义出发。 从这个定义来讲,学习确实是要功利性,因为连我们也经常说,要学以致用,要知行合一,如果一个你学习的东西,带来不了反馈和收益,换句话说,你学习的东西用不上,最终还是会荒废掉。 但从这个定义来思考的话,所有的学习都是功利性的,我学习技术,是为了解决工作中遇到的问题,我读人文社科的书籍,为了开心智、平心气、静心神,让我的生活更加幸福。我们常羡慕的,那些自律的人,他们也并不高尚,反而更显功利,因为他们压抑了日常懒惰颓废的人性,是为了满足获得他人肯定、变得独特的人性,毕竟如果自律不能带来更大的收益,那就不是自律,而是自虐。 这样一想,似乎也有一些道理。这像极了,所有的事情都有一个经济学解释,哪怕是见义勇为,也可以被解释为,其实是为了满足自己想成为英雄的私利。在很长的一段时间里,我都对这样的说法无法释怀,但又不可置否,直到我看到阿根廷文学家博尔赫斯说的这句:“**凡事总有一个经济学的解释。但除此之外,无疑也有其他的解释**”。对事物的理解不能只是单维的,也可以是多维的,关键在于你的思考维度,见义勇为中体现出的人性光辉,也是同样不可置否的。 回到功利性学习,如果所有的学习都是功利性学习的话,那这个回答就有点没意思了,正如,如果所有的人都是富翁,那就没有富翁这个概念了,那我们要回到传统意义上的功利性学习进行回答吗?我倒是觉得也没有必要。 很多时候你可能对自己所谓的“功利”并没有清楚的认知,而我之所以讲到功利性学习的定义,更多的是希望你不要以功利这个词来限定自己。 我学不下去,是因为我这个人“功利”,所以我学不下去也正常,那这是以“功利”作为理由的摆烂。我学不下去,是因为我这个人“功利”,我对此很愧疚,这也有可能是以“功利”作为理由的无意义的自我责备。 功利这个词带有或贬或褒的意味,且定义或狭或广,以功利来定义自己,就像给自己贴上标签。比如给自己贴一个“外向”的标签,当失落的时候,你会对自己的“外向”产生质疑,进而产生更多的质疑,实际上这是没有必要的,**我就是我,不需要标签定义,不需要物质衬托,不需要身份认同**。所以也希望你跳出“功利”这个维度,让我们来思考一些新的问题。 那我们思考什么问题呢?我想说两个,一个是目标,一个是兴趣。 先说目标,相比于功利问题,我觉得你可能更需要优先解决的是目标问题。在我看来,更加根本性的问题是你没有中长期的目标,你只是不想那么碌碌无为下去,所以才去搭建了一个博客,至于要通过搭建博客学习到什么程度,你自己也没有什么规划,只是跟着兴趣来,遇到困难点的地方,因为反正也没有目标,那就绕开好了,所以即便做了下来,也只是简单的了解了一下。 这里关于学习过程中的遗忘多说一句,知识的遗忘是很正常的事情,这是我们大脑为了保护我们不受过量信息干扰的一种机制,但遗忘了并不代表它没学过,做了笔记就是比没做笔记强,在未来需要的时候,学过、做过笔记就是能更快的拾起。 **就像我们阅读,我们并不需要记住那些精彩的段落,我们只需要去读,慢慢的就成为了我们的养分**,而有一天我们需要写文章的时候,最重要的是你表达的那些思想,而对思想的引证资料,你只用在需要的时候再去搜索就好了。而阅读就是为了让我们能有自己的思想,而非人云亦云,记笔记则是为了在我们需要引用的时候,能够快速的检索到。 对于做技术也是一样,我们现在学到的知识虽然会遗忘,但未来有一天你在解决一个更大的问题时,曾经学到的东西绝对会启发或帮助到你。**可怕的不是遗忘本身,而是将遗忘这件事情作为退却的理由**。 再说回目标,我们常见的确定目标的方法是从大到小的细化拆解,即先确定一个人生目标,然后不断拆解,直到当下的目标,但这样的过程,其实第一步就很难,而且不是很现实。因为对一个人生目标感到内心坚定,需要你对自己有较为清晰的认知,需要有大量的输入和思考,需要在实践中不断清晰,这绝不是一时兴起就能定下来的。所以真实情况是,大部分人都是在不断的实践中将人生目标确立出来的,这其中,读书和思考只是能帮助我们更快的找到目标而已。所以尽管当下没有想清楚人生目标,也没有关系,就先定个中短期目标,一年或者两年,只要是根据自己的意愿制定的目标,多少与自己的人生目标有一点关联,只是你当下还没有意识到而已。 确定一个大致的中短期目标后,接下来要做的依然是细化拆解,在获得短期目标后,对于自己要做的事情的边界,多少会清晰一点。就比如我也同样搭建了博客,但我就只是做一个站点而已,接下来还有其他的事情要完成。至于这其中,要学习哪些内容,遇到什么问题学习什么,所以很多地方我也没有追求优雅的解法,能解决就行,毕竟当前的短期目标只是做完这个站点,又不是研究搭建博客的技术。 所以从结果上来说,其实我们俩可能是学了差不多的内容,只是因为我清楚的知道边界,所以我在做完之后,少了些关于自己学习深度的纠结。 接下来说说兴趣,之所以要跳脱“是否功利”的思维,是因为我认为,兴趣才是我们做事出发的依据,我不知道你是否相信这句话,“**你不可能通过一个不快乐的过程到达一个快乐的结局**”。功利主义是很强调“结果”,但我们内心真正想要的,往往是一个“快乐的结果”,所以无论做什么事情,至少它应该是感兴趣的,这样至少过程是伴随着快乐的,你才更有可能到达那个“快乐的结果”。 实际上虽然我写了很多文章,但这些文章也都是从我实际的需求出发,我翻译 TypeScript 是因为我要重温一下 TypeScript,我写博客搭建系列,是因为我翻译完,觉得有必要做一个文档站点。我一开始也没有想到我要做什么,写什么文章,只是一路跟随着自己的兴趣。我想深入学习下 TypeScript,结果发现最新的文档没人翻译,那行吧,我尝试自己翻译一下,翻译到一大半的时候,我才想到,干脆做一个站点方便大家阅读吧,然后才做了站点,并且随着站点的搭建写了 33 篇博客搭建的文章,这个过程是否功利我不知道,我也不想从这个角度来看自己,在我看来,我只是跟着自己的兴趣一路向前走,并且不断分享而已。...

答读者问

## 扁平化 数组的扁平化,就是将一个嵌套多层的数组 array (嵌套可以是任何层数)转换为只有一层的数组。 举个例子,假设有个名为 flatten 的函数可以做到数组扁平化,效果就会如下: ```js var arr = [1, [2, [3, 4]]]; console.log(flatten(arr)) // [1, 2, 3, 4] ``` 知道了效果是什么样的了,我们可以去尝试着写这个 flatten 函数了 ## 递归 我们最一开始能想到的莫过于循环数组元素,如果还是一个数组,就递归调用该方法: ```js...

专题系列

## 前言 最近我发起了[「冴羽答读者问」](https://www.yuque.com/yayu/ask/dzng83)活动,如果你也有想要提问的问题,欢迎留言,我会按照顺序依此回答。 ## 正文 这个问题让我想起可口可乐曾经的首席执行官布莱恩·戴森 (Brian Dyson) 在 1996 年乔治亚理工学院的毕业致词: > 想像人生是一场在空中不停抛接五个球的游戏,这五个球分别是工作、家庭、健康、朋友以及心灵,而你不能让任何一个球落地。 > > 你很快会发现,工作是一个橡皮球,如果它掉下来,会弹回去,而其他四个球是玻璃做的,如果失手,它们有无法挽回的刻痕、损坏,甚至破碎,将不再和以前一样。 想想自己如果要表演杂技,抛接五个球,还真是有一点难度。这不禁让人觉得,平衡人生的这 5 件事情是一件多难的事情,但可恶的是,那些成功者往往做的都很好。 就比如说扎克伯格,作为 Facebook 的 CEO,工作虽然忙碌,但依然坚持跑步、旅行、陪伴家人,一样也没有落下。又比如 Facebook 的 COO 雪柔‧桑德伯格(Sheryl Sandberg),在她的 《Lean In:...

## 写在前面 本文讲解JavaScript各种继承方式和优缺点。 但是注意: 这篇文章更像是笔记,哎,再让我感叹一句:《JavaScript高级程序设计》写得真是太好了! ## 1.原型链继承 ```js function Parent () { this.name = 'kevin'; } Parent.prototype.getName = function () { console.log(this.name); } function Child () { } Child.prototype =...

深入系列

## 前言 TypeScript 的官方文档早已更新,但我能找到的中文文档都还停留在比较老的版本。所以对其中新增以及修订较多的一些章节进行了翻译整理。 本篇整理自 TypeScript Handbook 中 「[Conditional Types](https://www.typescriptlang.org/docs/handbook/2/conditional-types.html)」 章节。 本文并不严格按照原文翻译,对部分内容也做了解释补充。 ## 条件类型(Conditional Types) 很多时候,我们需要基于输入的值来决定输出的值,同样我们也需要基于输入的值的类型来决定输出的值的类型。**条件类型(Conditional types**)就是用来帮助我们描述输入类型和输出类型之间的关系。 ```typescript interface Animal { live(): void; } interface Dog extends Animal { woof():...

TypeScript系列