这一周发现一个前端进阶的知识库github,该库收纳了一个合格前端必要掌握的知识体系,并且该库还在持续更新,知识技术都属于当下最新,非常值得一看
20W字囊括上百个前端面试题的项目开源了
github:https://github.com/xiaomuzhu/front-end-interview
1. Java:控制反转(IoC)与依赖注入(DI)
内容节选:
在我们编码的过程中,通常都需要两个或者更多的类通过彼此的合作来实现业务逻辑,也就是说,某个对象需要获取与其合作对象的引用,如果这个获取的过程需要自己实现,代码的耦合度就会高,维护起来的成本就比较高。
我们来通过实战模拟一下。假如老王是少林寺的主持,他想让小二和尚去扫达摩院的地,代码可以这样实现。
小二类的代码如下所示:
public class Xiaoer {
public void saodi() {
System.out.println("小二我在扫达摩院的地");
}
}
复制代码
老王类的代码如下所示:
public class Laowang {
public void mingling() {
new Xiaoer().saodi();
}
}
复制代码
测试类的代码如下所示:
public class Test {
public static void main(String[] args) {
Laowang laowang = new Laowang();
laowang.mingling();
}
}
复制代码
Laowang 类的 mingling 方法中使用 new 关键字创建了一个 Xiaoer 类的对象——这种代码的耦合度就很高,维护起来的成本就很高,为什么这么说呢?
某一天,达摩院的地又脏了,老王主持想起了小二和尚,可小二和尚去练易筋经了,让谁去扫地呢,老王主持想起了小三和尚,于是 Laowang 类就不得不重新下一个新的命令,于是代码变成了这样:
public class Xiaosan {
public void saodi() {
System.out.println("小三我在扫达摩院的地");
}
}
public class Laowang {
public void mingling() {
new Xiaoer().saodi();
}
public void mingling1() {
new Xiaosan().saodi();
}
}
复制代码
假如小三和尚去挑水了,老王主持没准要下命令给小四和尚去扫达摩院的地。这样下去的话,Laowang 这个类会疯掉的。
老王主持觉得自己堂堂一届高僧,下个扫地的命令竟然这样麻烦,他觉得很不爽…
从博文中Get:
1)控制反转是一种在软件工程中解耦合的思想,把控制权交给了第三方,在运行的时候由第三方决定将具体的依赖对象“注入”到调用类的对象中。
2)依赖注入可以作为控制反转的一种实现方式,将实例变量传入到一个对象中去。
3)通过 IoC 框架,类 A 依赖类 B 的强耦合关系可以在运行时通过容器建立,也就是说把创建 B 实例的工作移交给容器,类 A 只管使用就可以。
2. 公司新来的女实习生问我什么是闭包?
内容节选:
**撩妹守则第一条,女孩子都喜欢童话故事。
那就先来讲一个童话故事~
// 有一个公主
// 她生活在一个充满冒险的奇妙世界里
// 她遇见了她的白马王子,带着她骑着独角兽环游世界
// 与龙搏斗,遇到了会说话的松鼠,以及许多其他幻想的事情。
function princess () {
var adventrures = [];
function princeCharming () {};
var unicorn = {};
var dragons = [];
var squirrel = "Hello!";
// 但她不得不回到她那充满家务和大人们的单调世界。
return {
// 她经常给身边的人讲她作为一个公主的奇妙经历。
story:function () {
return adventures[adventures.length - 1];
}
}
}
// 但他们看到的只是一个小女孩在讲述关于魔法和幻想的故事
var littleGril = princess();
littleGril.story();
// 即使大人们知道她是真正的公主,他们也不会相信所谓的独角兽或龙,因为他们永远看不到它们
// 大人们说它们只存在于小女孩的想象中
// 但我们知道真正的真理
// 里面的小女孩真的是个公主
这个故事来自于stackoverflow的一则回答,看不懂没关系,等阅读完本文后,回头再来看这个故事,你会发现你已经完全了解了我的魅力,咳咳@¥%#…………JavaScript
中闭包的魅力。
从博文中Get:
- 困扰多时的闭包问题终于得到了较能理解的答案。
- 原来JavaScript和Java一样存在GC,并且回收算法是类似的
- 裤子都脱了,博主却告诉我,女实习是假的?!
3. 我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?
内容节选:
首先,我们先来合理的推断一下,当我们在代码中使用String s = “”;的形式来定义String对象的时候,""中字符的个数有没有限制呢?
既然是合理的推断,那就要要足够的依据,所以我们可以从String的源码入手,根据public String(char value[], int offset, int count)的定义,count是int类型的,所以,char value[]中最多可以保存Integer.MAX_VALUE个,即2147483647字符。(jdk1.8.0_73)
但是,实验证明,String s = “”;中,最多可以有65534个字符。如果超过这个个数。就会在编译期报错…
从博文中Get:
一直以为String可以满足任何长度,这是个冷知识,确实个细节。
- String长度的限制是编译期的限制,也就是使用String s= “”;这种字面值方式定义的时候才会有的限制。
- String在运行期有没有限制呢,答案是有的,就是我们前文提到的那个Integer.MAX_VALUE ,这个值约等于4G,在运行期,如果String的长度超过这个范围,就可能会抛出异常
4. [译]React v16.9 新特性
内容概要:
- 重命名 Unsafe 生命周期方法
- 弃用:javascript: URLs
- 弃用 “Factory” 组件
- 用于测试的一部函数 act()
- 修复一些Bug
- 在 组件中调用 findDOMNode() 造成崩溃,已修复
- 保存已删除的子树导致内存泄漏,已修复
- 在 useEffect 中,使用 setState 引起的循环引用,现在会输出错误(这与在 class 组件中的 componentDidUpdate 使用 setState 导致的错误一致)
从博文中Get:
时刻关注流行技术动态,更新自己的知识
- componentWillMount、componentWillReceiveProps、componentWillUpdate 这三个函数在今后的开发中要避免使用,以免给框架升级带来不便
- 可以尝试这使用act()做一些测试
- 可尝试使用 <React.Profiler> 进行性能评估
5. 可靠React组件设计的7个准则之SRP【全文请查看原英文版】
全文链接【英文】:https://dmitripavlutin.com/7-architectural-attributes-of-a-reliable-react-component/
内容概要:
我喜欢React组件式开发方式。你可以将复杂的用户界面分割为一个个组件,利用组件的可重用性和抽象的DOM操作。
基于组件的开发是高效的:一个复杂的系统是由专门的、易于管理的组件构建的。然而,只有设计良好的组件才能确保组合和复用的好处。
尽管应用程序很复杂,但为了满足最后期限和意外变化的需求,你必须不断地走在架构正确性的细线上。你必须将组件分离为专注于单个任务,并经过良好测试。
不幸的是,遵循错误的路径总是更加容易:编写具有许多职责的大型组件、紧密耦合组件、忘记单元测试。这些增加了技术债务,使得修改现有功能或创建新功能变得越来越困难。
编写React应用程序时,我经常问自己:
- 如何正确构造组件?
- 在什么时候,一个大的组件应该拆分成更小的组件?
- 如何设计防止紧密耦合的组件之间的通信?
幸运的是,可靠的组件具有共同的特性。让我们来研究这7个有用的标准(本文只阐述 SRP
,剩余准则正在途中),并将其详细到案例研究中…
从博文中Get:
本篇是只是原文翻译的其中一篇,其他篇也非常实用。
最近刚好准备整理一下组件库,原本本人英文能力有限,原文只能看三分之一,所以,默默等博主更新全部内容,养肥再杀