Code Monkey home page Code Monkey logo

book-excerpts's People

Contributors

astak16 avatar

Watchers

 avatar

book-excerpts's Issues

如何成为学习高手

时间:2023-02-04
专栏:《如何成为学习高手》
作者:高冷冷

  1. 不要用标准框柱自己,不要对自己平头论足,不要追求某种结果,专注做事本身。

  2. 不要给自己安排太多类型的任务,同时对自己要有足够的容错空间

  3. 疲惫之后,换个环境学习,新环境能够激发你的场所神经元的活性

  4. 真勤奋是完成需要思考、需要克服困难的任务

  5. 学的东西,要立刻检测,检测有没有学会

    对于真正的勤奋来说,再功利主义也不为过。

    你要看到反馈,你要立刻看到反馈。

    一切不以检测和输出为目的的努力,都是耍流氓。

  6. 一旦你有了得失心,并且畏惧自己做得不好,担忧会浪费时间、带来失败的结果,你就迷失了。

  7. 做事时,不要想;做完了,再去想。珍惜工作记忆,把它们全部用于做事本身。

  8. 检索式练习:通过提问和主动回想的方式,去巩固知识点。

  9. 必须接受的事实:一开始的学习效率,必然不高。

  10. 学习时专注是最重要的,其他东西不值一提,哪怕方法不够完美

  11. 提升专注力:

    • 互动(让自己成为参与者):做笔记时,划关键词
    • 提问题:带着问题去学习
    • 默念:要有口型,不要只在心里这么想
  12. 我们是否是一个专注的人,取决于我们能否在走神之时,重新专注

    • 走神 -> 重新专注 -> 走神 -> 重新专注
  13. 闭环思维:学习、复习

    • 工具:Anki
    • 学习
      • 不需要把稀碎的知识点制作成卡片,记录关键词即可
    • 复习
      • 对某一块知识掌握不好,重新编辑复习的知识,提醒下次复习时应该关注的重点
      • 针对知识点进行提问,每次复习时,试着主动回想给出答案(检索式学习)
  14. 怎么记忆才能做到信手捏来

    • 用自己的语言把它复述出来
    • 记忆关键词、知识点,然后连点成线
    • 记“少”不记“多”,记录最核心的内容
  15. “组块化记忆”,将零散、独立的知识点,用你能想到的任何方式串联起来

  16. 如何阅读:

    • 不读,跳过不重要的信息(适用于认知类的书籍)
    • 结果导向式阅读(适用于输入和输出)
    • 漫游式阅读(适用于积累素材)
  17. 如何记住读过的书:

    • 标准
      1. 记住某个观点
      2. 在使用的时候能够快速找到原文,并能用到自己的表述中
    • 方法
      • 做粗浅的标记,留下可供追溯的线索
      • 在使用的时候,能够找到原文
  18. 阅读时不做记忆,记忆放在使用阶段

  19. 入门新领域,先找几本综述性的书籍阅读,了解这个领域研究的对象是啥,解决什么问题,有什么样的思维。每一本都要读几遍,对比和综合他们的观点,学会思考底层逻辑,如何得出结论

  20. 回答或者讨论“论述性问题”:要有所创新、有自己的观点。(不要追求标准答案,要有不同)

  21. 要允许自己写出垃圾,否则连垃圾都写不出(先抓核心、重点,先完成,之后再考虑完美)

  22. 要想快速学会新东西,重要的是立刻开始输出

  23. 克服拖延症

    1. 开始做一件事时,先给自己 5 分钟起步时间
    2. 稍微走在计划前面,给自己留下偷懒的资格和空间,当你用你不做事的权利时,你才会更愿意追求主动做事
    3. 替代拖延法,用一个相对简单的任务去代替更难的任务
  24. 在自律和放纵之间做选择,是在一中痛苦和另一种痛苦之间做选择

    1. 用他律代替自律
      • 对别人负责(在“对自己负责”方面,没有足够强的内驱力;在“对别人负责”方面,责任心强的不得了)
      • 让朋友监督,如果没有完成有惩罚
    2. 只在规定的时间里自我管理,其他时间尽情的吃喝玩乐
    3. 你过的太苦,做不到时不要自责,关注自己的真正感受
  25. 如何高度自律

    1. 第一件应该是:难度适中、方便切入的任务
    2. 开始后,把需要完成的一切任务,在整块时间内,连续做完(做 6 小时后就停下来,接下来的时间用来放松和休息,或者做一些轻松的任务)
      • 这 6 小时内做比较有难度的,或者必须要完成的事情
      • 轻松的、感兴趣的、对个人提升有帮助的事情,放在 6 小时以外(不用标准,随心所欲)
  26. 学习时如何不玩手机

    1. 把“无意识”转变为“有意识”
      • 要看手机时,把要做的事情写下来,等任务完成了再看
    2. 再某些堕落的时候,不要苛责自己(自我谅解)
      • 越是自我批评,越是恶性循环
  27. 如何做计划:

    1. 长远计划只要清楚大致方向及内容就好
    2. 只做今天规划,明天干啥,明天再说
  28. 如何完成计划:

    1. 把计划列出来
    2. 按照优先级排序
    3. 从最重要、最紧急的开始做,记录时间(做不完也没事)
    4. 一天/一周/一个月结束后复盘
      • 了解自己的时间都用在了哪
      • 哪些时间没必要做
      • 哪些时间需要加大投入
      • 不需要太细致,弄清楚整体情况和改变的大方向即可
  29. 如何完成复杂、艰难、不喜欢的任务

    • 拆解成具体的小任务
    • 完成小任务,能够不断给自己正向反馈,提高做事效率
  30. 如何每天都高效学习

    • 在一件事情花了太多时间后,可以切换为其他任务
    • 休息是必要的投资
      • 让身体活动起来
      • 让精神沉浸下来
      • 不想任何和学校、工作相关的事情
      • 看电影、聊天、聚餐
      • 出门游玩
  31. 把新知识与旧知识建立联系,学习也具有“复利”效应,你过去的每一次练习,都会积累成你的本金。越早努力越好。

  32. 双加工理论:只要我们积累了大量的练习,“受意识控制的加工”可以转变为“自动化加工”。

    • 受意识控制的加工:学习写字(怎么握笔,先写哪一个笔画等)
    • 自动化加工:拿起笔就写
  33. 对于学习来说,理解和会用是一回事,熟练又是另外一回事,只有通过练习才能做到熟练

超越期待

时间:2022-08-27
书名:《超越期待》
作者:松浦弥太郎

书摘

我想成为那种人,即无论什么时候,当有人让我讲件有意思的事情时,我能立刻拿出一个故事讲30分钟甚至一小时。

在没有什么值得大书特书的经历时,说一些小故事是个不错的选择。
“最近我读了一本非常有意思的书。”
“最近我发现了这样一件事情。”
我经常思考此类话题。
“今天我说一下最近做的超好吃的蛋包饭的事情吧。”
“那今天就谈谈最近在纽约住的酒店吧。”

想法:

适用于开场白和破冰的时候,通过一个故事进入正题,这就需要有大量的积累,在任何场合都能找到适用的故事


比起成为一个优秀的人,做一个有勇气的人更重要,所以,大胆地表达自己的看法吧,这是交流的第一步。

在有很多素未谋面的人聚集的场合,哪怕次数很少,也要让其他人听到你的声音,把自己感受到的事情坦诚地讲出来。即使没有整理好思路也不要害怕,一开始不妨想到什么就说什么。

想法:

就算自己讲错,别人嘲笑你了,又能怎样?

你说的话,做的事,让人家不舒服了,又能怎样?

就算你把全世界的人都得罪了,那你也总结出了经验。

不要有太多心里负担,大胆迈开步子,向前~


即使不必为所有的问题寻找答案,养成做笔记的习惯也是有意义的。新奇的想法产生于对好奇心的记录。

想法:

想到啥就赶紧记下来,不为别的,日后就想看看自己每天都在想啥


自信不是只对自己优秀的地方感到骄傲,而是相信自己即使有缺点也能有所成就。

想法:

接纳自己的缺点,学会和自己和解,就会变得自信


一个人前去最大的好处在于可以坦率地用自己的方式表达真实想法,没有必要为了让对方理解而在措辞上花费太多力气,重要的是让对方在我的解说中感受到热情。

有热情和情绪的碰撞是两回事。热情是面向未来,是想这样做、想变成这样,是关乎希望的存在;而情绪是被过去束缚的东西。如果投入了太多热情,到了几乎看不到周围的程度,适当放松很有必要。

正因为热情无法用金钱购买,也无法用规格衡量,所以才显得尤为珍贵。


在这个世界上,比起将自己擅长的事情变成工作,更多的人是在工作中发现自己擅长的事情。

现在对工作的困惑,一定会在未来某一刻发生改变,这种困惑不会永远持续。这就是所谓的成长。

很多人都希望通过工作获得成长,但工作的意义不仅在于让自己成长。也请好好思考一下,自己可以给所在部门或公司贡献些什么吧。

在工作中感到痛苦时,请试着想象一下十年后的自己。现在觉得痛苦、不熟练的事情,十年后一定会有所变化。

所以,请认真对待平时的每一次努力,无论怎样,无端地放弃努力就等于放弃了自己的人生。


我从来不会怀疑事先做企划是否正确。只要能看到成功的希望,我便会立即采取行动,主动推销自己。这是我做生意最基本的姿态。
比起讨价还价,我更愿意把时间花在思考如何促使对方接受我的方案上,因为这才是生意的根本所在。

执迷于胜负会使人对任何小事斤斤计较,从而导致工作停滞不前。工作绝对不是胜负之争。

正面应对是解决纠纷的很好的办法

如果其他下属中的任何一人质疑“为什么不邀请我”,那你的行为就构成了干扰。无论打招呼还是跟进工作,不平等地对待下属就会发生这样的情况,这跟对方是否容易沟通没有任何关系。

提问的艺术

时间:2023-05-27
书名:《提问的艺术》
作者:安德鲁.索贝尔(Andrew Sobel)/ 杰罗德.帕纳斯(Jerold Panas)

你想具体了解我哪方的情况呢?

当有人提出:“能否向我们介绍一下你们公司的情况”,你可以这样问他:“你想具体了解我们公司哪方面的的情况呢”

当有人问你:“你能介绍一下自己吗”,你可以问他:“你想具体了解我哪方面的情况呢?”

当你被问到一总体性问题,你想针对自己的目标做些简短回答时你可以这样问:

  1. 你对我经历中的哪些部分感兴趣?
  2. 你希望我具体介绍哪些方面的情况?
  3. 在我回答你的问题之前,你是否已经对我们的公司有所了解了?
  4. 如果我先介绍一些像你这样的客户案例来开始我们今天的介绍,你感觉如何?

然后结尾反问:

  1. 这样能回答你的提问了吗?
  2. 你还希望我们谈些什么?

这是你能做到的最好了吗?

  1. 当你要求同事为你完成一项任务或项目时
  2. 当你试着让孩子尽最大的努力来达到更高的要求时
  3. 当你正在为一项任务而工作,无论它是怎样的一个任务,请问一下你自己:“这真的是我能做到的最好了吗?”

然后再问:

  1. 还有提升空间吗?
  2. 有什么办法能让它变得更好些?

接着再问:

  1. 还有什么能阻止你?
  2. 你觉得它值得你尽最大的努力吗?
  3. 这件事最成功的地方是什么?还有提升空间吗?

当你想得到一个清晰而明确的答案时,一定要问一个明确的封闭式问题:“是不是”

用恰当的方式有目的地提出一个封闭式问题:是还是不是,对于提问者来说,是力量和高要求的最好结合

  1. 当你需要弄清对方是否全身心投入时
  2. 当你想找出对方的任何疑虑或犹豫时

然后再问:

  1. 你能够全心投入此事吗?
  2. 你是否愿意做这件事?
  3. 你现在能做出最后的决定吗?

接着再问:

  1. 这件事最能让你兴奋的是什么
  2. 你最大的疑惑或顾虑是什么

避免问的杀手问题

  1. 什么最让你感到惊喜:即使对方诚实而积极地回答了,也未必能给出一个好的答案。如果他说对什么事感到惊喜的话,那意味着他很幼稚,如果他说没什么可惊喜的,那就会被认为自满或者迟钝

这个问题可以这样问题:

  • 在你新工作起步的前 6 个月,你最关注的事情是什么?
  • 对于你的新角色,你是否已经有了一个长期的规划?
  1. 还有什么问题我没有问:问题带有明显的企图
    • 类似的问题还有:我们真的属于同一战壕的...请给我一些建议,如果才能成为一位更有效的销售人员!
    • 是什么让你彻夜难眠

这种问题可以这样问:

  1. 对于这一特殊的挑战,你觉得还有什么相关的问题是我们没有讨论到的吗?
  2. 为了让这件事进展更加顺利,你认为我还应该跟谁进一步谈一谈?

你能告诉我你的计划吗?

想要成为聆听者,需要遵循三个原则:

  1. 谦逊:要坚信一定能从遇见的每个人身上学到东西
  2. 好奇:如果能在任何情况下保持一颗好奇心,你将聆听到更多的东西
  3. 自我意识:你的主观与偏见将阻碍你取更好地聆听他人

什么时候问:

  1. 当告诉别人你认为他们的计划应该是什么样之前
  2. 当你需要了解别人的意图和优先考虑的事是什么时

可以这样问:

  1. 你计划如何去实现它?
  2. 你的策略是什么?
  3. 你的未来将朝什么方向发展,你对此有什么想法?

接着再问:

  1. 为了实现这个目标,你曾经经历了怎样的过程
  2. 哪些事情是你已经决定不再做了的

你希望他们应该多做些什么?

什么时候问:

  1. 当别人抱怨工作时
  2. 当某人遭到别人的挑剔和批评时

然后这样问:

  1. 如果你能让别人做出一件完全不同的事——采取能对行为产生巨大影响的行动的话,你希望那将是什么?
  2. 你希望他们做出什么的改变?

接着再问:

  1. 你为什么认为他们没有在做那些事?
  2. 他们之所有坐错是因为他们缺乏常识和技能,还是因为他们的企业要求他们那么做,或是因为他们根本没有能力做到?

你为什么想要这样做

“为什么” 这个词具有两面性,用错时间或者对象的话,会让人感到不舒服,有批评、挑刺、找茬,会引起对方反感;同时也能成为一个有力的问题,能够让我们停下来反思,并检查我们的行动,从而避免机械地一路向前冲

什么时候问:

  1. 当你真的想了解某个人的动机时
  2. 当某人想去做一件事而你不能肯定是否他们真的需要这么做时
  3. 当你试图弄清楚问题发生的根源时

可以这样问:

  1. 你期望从中得到什么的结果?
  2. 你是如何决定采用这一方法的?
  3. 你为什么认为你应该从这里着手?

接着再问:

  1. 那是为什么?
  2. 你为什么认为它会发生呢?
  3. 你如何看待这件事?

你怎么想

什么时候问:

  1. 当你们在讨论一项面临的困难或未来行动方案时
  2. 当你分享了自己的观点或展示完自己的方案时
  3. 当有人带着问题来找你时

可以这样问:

  1. 我非常珍视你的意见。我能否知道你对这件事的看法?
  2. 你是否愿意分享一下你的观点?

接着再问:

  1. 当你思考这件事时,什么对你的影响最大?
  2. 还有其他任何我没意识到的建议吗?

你当初是如何开始的

什么时候问:

  1. 任何时候,当你邀请他人与你分享他们当初是如何开始他们的事业或人生中的某段经历

可以这样问:

  1. 当对方是一对夫妇时:“你们俩是如何开始你们的爱情故事并终成眷属?”
  2. 当对方是一位艺术家或音乐家时:“谁是你的恩师,你是如何开始学习这门艺术的?”
  3. 对于任何人:“你在哪里长大的?你又是如何最终做到的?”

接着再问

  1. 那时候你是如何决定那么做的?
  2. 你觉得最难学的课程是什么?
  3. 如果那时候失败了,你会如何想?

你是否介意我们从头开始

什么时候问:

  1. 当你们之间的对话开局很糟糕时
  2. 当你和朋友或家人发生徒劳的、伤及感情的争执时

可以这样问:

  1. 我错了。你是否介意我们从头开始?我之前有失公正。
  2. 我们能倒回去吗?我们应该谈点什么?

接着再问:

  1. 谢谢!你是否介意我问你一个问题
  2. 我之所以想从头开始是因为我之前说错话了。能让我再试一次吗?

是什么给予了你人生当中最大的满足

什么时候问:

  1. 当你在工作中与他人建立更多的私人关系时
  2. 当你想更多地了解你的朋友和家人时

可以这样问:

  1. 在你人生中,什么事最让人满意?
  2. 你最满足的...(如一段关系、一次体验、一个工作等)是什么?
  3. 在你的一生中什么样的经历对你影响最大?

接着再问:

  1. 请再多说一点吧。是什么让你特别满足?
  2. 还有其他什么让你觉得特别满足的吗?

你能多跟我讲讲吗

什么时候问:

  1. 任何时候,任何场合
  2. 想鼓励他人进行深度对话和多少一些话时,这是一个快速有力的方法

可以这样问:

  1. 关于这件事,你能在多说一点吗?
  2. 你的意思是...(提醒对方更加细致地确认他们提出的条件。)

接在再问:

  1. 什么时候?
  2. 发生了什么?
  3. 怎样了?
  4. 为什么?

你曾经被问过最难回答的问题是什么

什么时候问

  1. 当你想要探究一个人的内心深处时
  2. 当你想要更多地了解一个人的性格和**观念时

可以这样问:

  1. 你被问到的最有意义的问题是什么?你也问过别人同样的问题吗?
  2. 请告诉我你是否曾经被问过一个真的能把你击倒的问题?
  3. 你是否被问过让你感到尴尬的问题?或者你是否问过让你的交谈对象尴尬的问题

接着再问:

  1. 别人的问题对你的人生产生过什么样的影响?
  2. 后来你能否赶到你信众有了一个正确的答案?
  3. 如果你今天还被问到同样的问题,那你的答案会一样吗?

作为你的领导(同事、朋友、父母...),你是如何看待我的?

什么时候问:

  1. 当你想要知道别人是怎样看待你的领导力时。
  2. 当你想要探究你最亲近的人——你的家人、朋友或同事认为你是谁以及你所代表的是什么时。
  3. 当你稀释涂扫清给你的目标制造障碍的那些人时

可以这样问:

  1. 你认为我代表着什么
  2. 如果让你简短地概述一下我的价值观和原则,你觉得他们应该是什么样的?

接着再问:

  1. 在我所作的一切中什么才是真正关键的?
  2. 还有什么能让我更好地就此事进行沟通并成为行为榜样?
  3. 你为什么那样想?

你一生当中最开心的事哪一天

这个问题对方都会有积极正面的影响

什么时候问:

  1. 但你想要深入了解别人并建立起更加密切的关系时
  2. 当你需要了解对某人性格造成影响的重大事件时

可以这样问:

  1. 你一生当中最伟大的日子是什么?
  2. 在你生命中哪件事给你带来了无与伦比的快乐

接着再问:

  1. 为什么对你而言是如此特别
  2. 是否有哪些事情或日子对你来说很重要

你一生中最大的成就是什么

什么时候问

  1. 当你想和某人建立深厚关系并了解什么对他来说最重要时

可以这样问

  1. 你个人最感到满意的成就是什么?
  2. 你最值得骄傲的成就是什么?
  3. 在你所有的成就中,你认为哪一样是其他人最能记住的?为什么?

有助于建立起私人联系的问题

  1. 你希望被别人记住什么?
  2. 你人生最大的成就是什么?
  3. 什么能带给你人生最大的满足?
  4. 你一生当中最开心的事哪一天?
  5. 你是如何分配你的时间的?你愿意在哪方面多投入一些时间?而在哪方面少花些时间?
  6. 什么时候你不会掺杂其他事情?你是如何度过休闲时光的?

《图解 Google V8》

第一篇

这是《图解 Google V8》第一篇/共三篇:设计**篇

这个专栏的优点是:写的通俗易懂,没有涉及 V8 源码部分,对于前端还是比较友好的,学完之后能够知道写下一段 js 代码后,V8 背后都做了哪些事情

这个专栏的不足之处是:没有对技术进行深入讲解,只讲了这个技术是用来解决什么问题的,以及它是怎么工作的

所以这个专栏比较时候对 V8 还不了解的同学去学习,增加自己的知识面

下面是我自己学习每一章的总结,主要记录我在这章中学到内容,并不是对这章完整的总结

我会分为三篇来写,这是第一篇:设计**篇

如何学习谷歌高性能 JavaScript 引擎 V8?

V8 主要涉及三个技术:编译流水线、事件循环系统、垃圾回收机制

  1. V8 执行 JavaScript 完整流程称为:编译流水线
    编译流水线
    编译流水线涉及到的技术有:
    • JIT
      • V8 混合编译执行和解释执行
    • 惰性解析
      • 加快代码启动速度
    • 隐藏类(Hide Class)
      • 将动态类型转为静态类型,消除动态类型执行速度慢的问题
    • 内联缓存
  2. 事件循环系统
    • JavaScript 中的难点:异步编程
    • 调度排队任务,让 JavaScript 有序的执行
  3. 垃圾回收机制
    • 内存分配
    • 内存回收

01 | V8 是如何执行一段 JavaScript 代码的?

  1. 准备基础环境:
    • 全局执行上下文:全局作用、全局变量、内置函数
    • 初始化内存中的堆和栈结构
    • 初始化消息循环系统:消息驱动器和消息队列
  2. 结构化 JavaScript 源代码
    • 生成抽象语法树(AST
    • 生成相关作用域
  3. 生成字节码:字节码是介于 AST 和机器码的中间代码
    • 解释器可以直接执行
    • 编译器需要将其编译为二进制的机器码再执行
  4. 解释器和监控机器人
    • 解释器:按照顺序执行字节码,并输出执行结果
    • 监控机器人:如果发现某段代码被重复多次执行,将其标记为热点代码
  5. 优化热点代码
    • 优化编译器将热点代码编译为机器码
    • 对编译后的机器码进行优化
    • 再次执行到这段代码时,将优先执行优化后的代码
  6. 反优化
    • JavaScript 对象在运行时可能会被改变,这段优化后的热点代码就失效了
    • 进行反优化操作,给到解释器解释执行

02 | 函数即对象:一篇文章彻底搞懂 JavaScript 的函数特点

V8 内部为函数对象添加了两个隐藏属性:namecode

  • name 为函数名
    • 如果是匿名函数,nameanonymous
  • code 为函数代码,以字符串的形式存储在内存中

当执行到一个函数调用语句时,V8 从函数对象中取出 code 属性值,然后解释执行这段函数代码

什么是闭包:将外部变量和函数绑定起来的技术

参考资料:

  1. The story of a V8 performance cliff in React

03 | 快属性和慢属性:V8 是怎样提升对象属性访问速度的?

V8 在实现对象存储时,没有完全采用字典的存储方式,因为字典是非线性的数据结构,查询效率会低于线性的数据结构

常规属性和索引属性

  • 索引属性(elements):数字属性按照索引值的大小升序排列
  • 常规属性(properties):字符串根据创建时的顺序升序排列

它们都是线性数据结构,分别为 elements 对象和 properties 对象

执行一次查询:先从 elements 对象中按照顺序读出所有元素,然后再从 properties 对象中读取所有的元素

快属性和慢属性

在访问一个属性时,比如:foo.aV8 先查找出 properties,然后在从 properties 中查找出 a 属性

V8 为了简化这一步操作,把部分 properties 存储到对象本身,默认是 10 个,这个被称为对象内属性

线性数据结构通常被称为快属性

线性数据结构进行大量数据的添加和删除,执行效率是非常低的,所以 V8 会采用慢属性策略

慢属性的对象内部有独立的非线性数据结构(字典)

参考资料:

  1. V8 是怎么跑起来的 —— V8 中的对象表示
  2. Fast properties in V8

04 | 函数表达式:涉及大量概念,函数表达式到底该怎么学?

变量提升

js 中有函数声明的方式有两种:

  • 函数声明
    function foo() {
      console.log("foo");
    }
  • 函数表达式
    var foo = function () {
      console.log("foo");
    };

在编译阶段 V8 解析到函数声明和函数表达式(变量声明)时:

  • 函数声明,将其转换为内存中的函数对象,并放到作用域中
  • 变量声明,将其值设置为 undefined,并当道作用域中

因为在编译阶段,是不会执行表达式的,只会分析变量的定义、函数的声明

所以如果在声明前调用 foo 函数:

  • 使用函数声明不会报错
  • 使用函数表达式会报错

在编译阶段将所有的变量提升到作用域的过程称为变量提升

立即执行函数

js 的圆括号 () 可以在中间放一个表达式

中间如果是一个函数声明,V8 就会把 (function(){}) 看成是函数表达式,执行它会返回一个函数对象

如果在函数表达式后面加上(),就被称为立即调用函数表达式

因为函数立即表达式也是表达式,所以不会创建函数对象,就不会污染环境

05 |原型链:V8 是如何实现对象继承的?

  • 作用域链是沿着函数的作用域一级一级来查找变量的
  • 原型链是沿着对象的原型一级一级来查找属性的

js 中实现继承,是将 __proto__ 指向对象,但是不推荐使用,主要原因是:

  • 这是隐藏属性,不是标准定义的
  • 使用该属性会造成严重的性能问题

继承

  1. 用构造函数实现继承:
    function DogFactory(color) {
      this.color = color;
    }
    DogFactory.prototype.type = "dog";
    const dog = new DogFactory("Black");
    dog.hasOwnProperty("type"); // false
  2. ES6 之后可以通过 Object.create 实现继承
    const animalType = { type: "dog" };
    const dog = Object.create(animalType);
    dog.hasOwnProperty("type"); // false

new 背后做了这些事情

  1. 帮你在内部创建一个临时对象
  2. 将临时对象的 __proto__ 设置为构造函数的原型,构造函数的原型统一叫做 prototype
  3. return 临时对象
function NEW(fn) {
  return function () {
    var o = { __proto__: fn.prototype };
    fn.apply(o, arguments);
    return o;
  };
}

__proto__prototypeconstructor 区别

prototype 是函数的独有的;__proto__constructor 是对象独有的

由于函数也是对象,所以函数也有 __proto__constructor

constructor 是函数;prototype__proto__ 是对象

typeof Object.__proto__; // "object"
typeof Object.prototype; // "object"
typeof Object.constructor; // "function"
let obj = new Object();
obj.__proto__ === Object.prototype;
obj.constructor === Object;

objObject 的实例,所以 obj.constructor === Object

obj 的是对象,Object 是函数,所以 obj.__proto__ === Object.prototype

参考资料:

  1. 用自己的方式(图)理解 constructorprototype__proto__ 和原型链
  2. 面试官问:JS 的继承

06 |作用域链:V8 是如何查找变量的?

全局作用域是在 V8 启动过程中就创建了,且一直保存在内存中不会被销毁的,直至 V8 退出

而函数作用域是在执行该函数时创建的,当函数执行结束之后,函数作用域就随之被销毁掉了

因为 JavaScript 是基于词法作用域的,词法作用域就是指,查找作用域的顺序是按照函数定义时的位置来决定的。

词法作用域是静态作用域,根据函数在代码中的位置来确定的,作用域是在声明函数时就确定好了

动态作用域链是基于调用栈的,不是基于函数定义的位置的,可以认为 this 是用来弥补 JavaScript 没有动态作用域特性的

07 |类型转换:V8 是怎么实现 1+“2”的?

V8 会提供了一个 ToPrimitive 方法,其作用是将 ab 转换为原生数据类型

  1. 先检测该对象中是否存在 valueOf 方法,如果有并返回了原始类型,那么就使用该值进行强制类型转换
  2. 如果 valueOf 没有返回原始类型,那么就使用 toString 方法的返回值
  3. 如果 valueOftoString 两个方法都不返回基本类型值,便会触发一个 TypeError 的错误。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.