├── 0
├── 0.1.4.md
├── 0.1.5.md
├── 0.1.6.md
├── 0.1.1.md
├── 0.1.3.md
└── 0.1.2.md
├── 1
├── 1.2.7.md
├── 1.5.4.md
├── 1.2.14.md
├── 1.1.2.md
├── 1.4.5.md
├── 1.2.11.md
├── 1.5.3.md
├── 1.2.6.md
├── 1.3.3.md
├── 1.2.12.md
├── 1.2.5.md
├── 1.4.2.md
├── 1.4.3.md
├── 1.4.4.md
└── 1.3.4.md
├── 2
├── 2.1.2.md
├── 2.0.md
├── 2.2.2.md
├── 2.1.6.md
├── 2.1.4.md
├── 2.1.3.md
└── 2.1.7.md
├── 3
├── 3.2.1.md
├── 3.1.2.md
└── 3.1.1.md
├── 4
├── 4.3.2.md
├── transition
│ ├── ease.png
│ ├── chrome.png
│ ├── ease-in.png
│ ├── linear.png
│ ├── ease-out.png
│ ├── steps-end.png
│ ├── ease-in-out.png
│ └── steps-start.png
├── si-.1.1-shen-ru-li-jie-webpack-da-bao.md
└── 4.2.1.md
├── 5
├── 5.3.2.md
├── 5.2.3.md
├── 5.3.1.md
├── 5.1.6.md
├── 5.2.2.md
├── 5.1.1.md
└── 5.1.5.md
├── 6
├── 6.4.1.md
├── 6.1.0.md
├── 6.3.3.md
├── 6.1.3.md
├── 6.1.4.md
├── 6.1.2.md
├── 6.3.2.md
├── 6.2.5.md
└── 6.2.3.md
├── 7
├── 7.1.6.md
├── 7.1.7.md
├── 7.1.9.md
├── 7.1.10.md
├── 7.1.11.md
├── 7.1.12.md
├── 7.1.13.md
├── 7.1.4.md
├── 7.1.8.md
├── 7.2.1.md
├── 7.1.14.md
├── 7.1.3.md
├── 7.1.5.md
├── 7.1.1.md
└── 7.1.2.md
├── 9
└── 9.1.md
├── 10
├── 10.2.md
├── 10.1-1.md
└── 10.1.md
├── _config.yml
├── .gitbook
└── assets
│ ├── 1.3.1.6.png
│ ├── 1.5.2.1.jpg
│ ├── 2.1.1.0.png
│ ├── 2.1.1.4.jpg
│ ├── 6.1.0.jpeg
│ ├── 6.2.3.6.png
│ ├── 9.1.1.jpg
│ ├── 9.1.2.1.jpg
│ ├── 9.1.2.2.jpg
│ ├── 9.1.3.1.jpg
│ ├── 9.1.3.2.jpg
│ ├── 9.1.4.1.jpg
│ ├── 9.1.5.1.jpg
│ ├── 9.1.7.1.jpg
│ ├── 9.1.8.1.jpg
│ ├── baidu.jpeg
│ ├── bobma.jpg
│ ├── image.png
│ ├── 1.2.6.4.1.png
│ ├── 1.5.2.3.1.jpg
│ ├── 1.5.2.3.2.jpg
│ ├── 1.5.2.4.1.jpg
│ ├── 2.1.1.0.1.png
│ ├── 3.1.1.3.1.jpg
│ ├── 5.3.1.1.1.png
│ ├── 6.3.1.0.1.png
│ ├── 6.3.1.2.1.png
│ ├── 6.3.1.2.2.png
│ ├── 6.3.1.2.3.png
│ ├── 6.3.1.2.4.png
│ ├── 6.3.1.2.5.png
│ ├── 6.3.1.3.1.png
│ ├── 7.1.14.1.png
│ ├── copyright.png
│ ├── image (1).png
│ ├── image (5).png
│ ├── image (6).png
│ ├── image (7).png
│ ├── image (8).png
│ ├── image (9).png
│ ├── 2.1.1.4-Heap.gif
│ ├── edan-qrcode.png
│ ├── image (11).png
│ ├── image (12).png
│ ├── image (13).png
│ ├── image (14).png
│ ├── image (15).png
│ ├── image (16).png
│ ├── image (17).png
│ ├── image (18).png
│ ├── image (19).png
│ ├── image (20).png
│ ├── image (21).png
│ ├── image (22).png
│ ├── image (24).png
│ ├── image (25).png
│ ├── image (26).png
│ ├── image (27).png
│ ├── image (28).png
│ ├── image (29).png
│ ├── image (30).png
│ ├── image (31).png
│ ├── image (32).png
│ ├── image (33).png
│ ├── image (35).png
│ ├── image (37).png
│ ├── image (38).png
│ ├── image (39).png
│ ├── image (42).png
│ ├── john-resig.jpg
│ ├── wechatimg21.png
│ ├── 2.1.1.1-Bubble.gif
│ ├── 2.1.1.10-Radix.gif
│ ├── 2.1.1.5-Merge.gif
│ ├── 2.1.1.6-Quick.gif
│ ├── 2.1.1.7-Shell.gif
│ ├── 2.1.1.9-Bucket.gif
│ ├── cover20200504.jpg
│ ├── cover20200619.jpg
│ ├── image (1) (1).png
│ ├── image (14) (1).png
│ ├── image (19) (1).png
│ ├── image (33) (1).png
│ ├── image (35) (1).png
│ ├── image (37) (1).png
│ ├── image (5) (1).png
│ ├── image (6) (1).png
│ ├── image (7) (1).png
│ ├── monotone-stack.gif
│ ├── 2.1.1.2-Selection.gif
│ ├── 2.1.1.3-Insertion.gif
│ ├── 2.1.1.8-Counting.gif
│ ├── image (1) (1) (1).png
│ ├── image (6) (1) (1).png
│ ├── image (7) (1) (1).png
│ ├── makai_greatwall.png
│ ├── image (14) (1) (1).png
│ └── image (35) (1) (1).png
├── code
├── 1.2.1-2.js
├── 1.2.1-3.js
├── 1.2.1-4.js
└── 1.2.1-1.js
├── LICENSE.md
├── 0.0.1.md
└── SUMMARY.md
/7/7.1.6.md:
--------------------------------------------------------------------------------
1 | # 柒.1.6 命令模式
--------------------------------------------------------------------------------
/7/7.1.7.md:
--------------------------------------------------------------------------------
1 | # 柒.1.7 组合模式
--------------------------------------------------------------------------------
/7/7.1.9.md:
--------------------------------------------------------------------------------
1 | # 柒.1.9 享元模式
--------------------------------------------------------------------------------
/7/7.1.10.md:
--------------------------------------------------------------------------------
1 | # 柒.1.10 职责链模式
--------------------------------------------------------------------------------
/7/7.1.11.md:
--------------------------------------------------------------------------------
1 | # 柒.1.11 中介者模式
--------------------------------------------------------------------------------
/7/7.1.12.md:
--------------------------------------------------------------------------------
1 | # 柒.1.12 装饰者模式
--------------------------------------------------------------------------------
/7/7.1.13.md:
--------------------------------------------------------------------------------
1 | # 柒.1.13 状态模式
--------------------------------------------------------------------------------
/7/7.1.4.md:
--------------------------------------------------------------------------------
1 | # 柒.1.4 迭代器模式
--------------------------------------------------------------------------------
/7/7.1.8.md:
--------------------------------------------------------------------------------
1 | # 柒.1.8 模板方法模式
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/4/4.3.2.md:
--------------------------------------------------------------------------------
1 | # 肆.3.2 适用于前端开发者的20个VSCode插件
2 |
3 |
--------------------------------------------------------------------------------
/4/transition/ease.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/4/transition/ease.png
--------------------------------------------------------------------------------
/4/transition/chrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/4/transition/chrome.png
--------------------------------------------------------------------------------
/4/transition/ease-in.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/4/transition/ease-in.png
--------------------------------------------------------------------------------
/4/transition/linear.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/4/transition/linear.png
--------------------------------------------------------------------------------
/.gitbook/assets/1.3.1.6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/1.3.1.6.png
--------------------------------------------------------------------------------
/.gitbook/assets/1.5.2.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/1.5.2.1.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.0.png
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.4.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/6.1.0.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/6.1.0.jpeg
--------------------------------------------------------------------------------
/.gitbook/assets/6.2.3.6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/6.2.3.6.png
--------------------------------------------------------------------------------
/.gitbook/assets/9.1.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/9.1.1.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/9.1.2.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/9.1.2.1.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/9.1.2.2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/9.1.2.2.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/9.1.3.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/9.1.3.1.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/9.1.3.2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/9.1.3.2.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/9.1.4.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/9.1.4.1.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/9.1.5.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/9.1.5.1.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/9.1.7.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/9.1.7.1.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/9.1.8.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/9.1.8.1.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/baidu.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/baidu.jpeg
--------------------------------------------------------------------------------
/.gitbook/assets/bobma.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/bobma.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image.png
--------------------------------------------------------------------------------
/4/transition/ease-out.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/4/transition/ease-out.png
--------------------------------------------------------------------------------
/4/transition/steps-end.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/4/transition/steps-end.png
--------------------------------------------------------------------------------
/.gitbook/assets/1.2.6.4.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/1.2.6.4.1.png
--------------------------------------------------------------------------------
/.gitbook/assets/1.5.2.3.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/1.5.2.3.1.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/1.5.2.3.2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/1.5.2.3.2.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/1.5.2.4.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/1.5.2.4.1.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.0.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.0.1.png
--------------------------------------------------------------------------------
/.gitbook/assets/3.1.1.3.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/3.1.1.3.1.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/5.3.1.1.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/5.3.1.1.1.png
--------------------------------------------------------------------------------
/.gitbook/assets/6.3.1.0.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/6.3.1.0.1.png
--------------------------------------------------------------------------------
/.gitbook/assets/6.3.1.2.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/6.3.1.2.1.png
--------------------------------------------------------------------------------
/.gitbook/assets/6.3.1.2.2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/6.3.1.2.2.png
--------------------------------------------------------------------------------
/.gitbook/assets/6.3.1.2.3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/6.3.1.2.3.png
--------------------------------------------------------------------------------
/.gitbook/assets/6.3.1.2.4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/6.3.1.2.4.png
--------------------------------------------------------------------------------
/.gitbook/assets/6.3.1.2.5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/6.3.1.2.5.png
--------------------------------------------------------------------------------
/.gitbook/assets/6.3.1.3.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/6.3.1.3.1.png
--------------------------------------------------------------------------------
/.gitbook/assets/7.1.14.1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/7.1.14.1.png
--------------------------------------------------------------------------------
/.gitbook/assets/copyright.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/copyright.png
--------------------------------------------------------------------------------
/.gitbook/assets/image (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (5).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (5).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (6).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (6).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (7).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (7).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (8).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (8).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (9).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (9).png
--------------------------------------------------------------------------------
/4/transition/ease-in-out.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/4/transition/ease-in-out.png
--------------------------------------------------------------------------------
/4/transition/steps-start.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/4/transition/steps-start.png
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.4-Heap.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.4-Heap.gif
--------------------------------------------------------------------------------
/.gitbook/assets/edan-qrcode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/edan-qrcode.png
--------------------------------------------------------------------------------
/.gitbook/assets/image (11).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (11).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (12).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (12).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (13).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (13).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (14).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (14).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (15).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (15).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (16).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (16).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (17).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (17).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (18).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (18).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (19).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (19).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (20).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (20).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (21).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (21).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (22).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (22).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (24).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (24).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (25).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (25).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (26).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (26).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (27).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (27).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (28).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (28).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (29).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (29).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (30).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (30).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (31).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (31).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (32).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (32).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (33).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (33).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (35).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (35).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (37).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (37).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (38).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (38).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (39).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (39).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (42).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (42).png
--------------------------------------------------------------------------------
/.gitbook/assets/john-resig.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/john-resig.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/wechatimg21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/wechatimg21.png
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.1-Bubble.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.1-Bubble.gif
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.10-Radix.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.10-Radix.gif
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.5-Merge.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.5-Merge.gif
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.6-Quick.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.6-Quick.gif
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.7-Shell.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.7-Shell.gif
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.9-Bucket.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.9-Bucket.gif
--------------------------------------------------------------------------------
/.gitbook/assets/cover20200504.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/cover20200504.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/cover20200619.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/cover20200619.jpg
--------------------------------------------------------------------------------
/.gitbook/assets/image (1) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (1) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (14) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (14) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (19) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (19) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (33) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (33) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (35) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (35) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (37) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (37) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (5) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (5) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (6) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (6) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (7) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (7) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/monotone-stack.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/monotone-stack.gif
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.2-Selection.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.2-Selection.gif
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.3-Insertion.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.3-Insertion.gif
--------------------------------------------------------------------------------
/.gitbook/assets/2.1.1.8-Counting.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/2.1.1.8-Counting.gif
--------------------------------------------------------------------------------
/.gitbook/assets/image (1) (1) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (1) (1) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (6) (1) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (6) (1) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (7) (1) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (7) (1) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/makai_greatwall.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/makai_greatwall.png
--------------------------------------------------------------------------------
/.gitbook/assets/image (14) (1) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (14) (1) (1).png
--------------------------------------------------------------------------------
/.gitbook/assets/image (35) (1) (1).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/coffe1891/frontend-hard-mode-interview/HEAD/.gitbook/assets/image (35) (1) (1).png
--------------------------------------------------------------------------------
/code/1.2.1-2.js:
--------------------------------------------------------------------------------
1 | //IIFE
2 | (function(){
3 | console.log("我是立即运行的匿名函数");
4 | })();
5 |
6 | (function(){
7 | console.log("我也是立即运行的匿名函数");
8 | }());
--------------------------------------------------------------------------------
/6/6.4.1.md:
--------------------------------------------------------------------------------
1 | # 陆.4.1 什么是响应式编程?
2 |
3 | **响应式编程简称RP(Reactive Programming)**,是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
4 |
5 | //todo
6 |
7 |
--------------------------------------------------------------------------------
/3/3.2.1.md:
--------------------------------------------------------------------------------
1 | # 叁.2.1 React Hooks究竟是什么?
2 |
3 | ## 参考文献
4 |
5 | {% hint style="info" %}
6 | [React Hooks 新手筆記](https://medium.com/@z3388638/react-hooks-%E6%96%B0%E6%89%8B%E7%AD%86%E8%A8%98-8c9f1cccd142)
7 | {% endhint %}
8 |
9 |
--------------------------------------------------------------------------------
/5/5.3.2.md:
--------------------------------------------------------------------------------
1 | # 伍.3.2 RxJS
2 |
3 | [RxJS](https://rxjs-cn.github.io/)是使用Observables 的响应式编程的库,它使编写异步或基于回调的代码更容易。随着深入你会发现它采用了订阅者模式,其中也带有纯函数的思想。
4 |
5 | ## 01.统一同步与异步
6 |
7 | ## 02.统一获取与订阅
8 |
9 | ## 03.统一现在与未来
10 |
11 |
--------------------------------------------------------------------------------
/code/1.2.1-3.js:
--------------------------------------------------------------------------------
1 | //函数调用自身称为递归,函数名为“func”
2 | (function func(i){
3 | console.log("函数名为"+func.name+",第"+i+"次调用")
4 | if(i<3){//递归出口
5 | func(++i);
6 | }
7 | })(1);
8 | //函数名为func,第1次调用
9 | //函数名为func,第3次调用
10 | //函数名为func,第3次调用
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | 
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
2 |
--------------------------------------------------------------------------------
/10/10.2.md:
--------------------------------------------------------------------------------
1 | # 拾.2 2020年前端技术展望
2 |
3 | ## 01.Serverless
4 |
5 | 阿里云针对ServerLess推出了一个新产品叫**函数计算**。
6 |
7 | 函数计算的免运维特性与前端工程师天然互补,工程师只需编写业务代码即可快速搭建云原生的 Web 应用,有效提高上线迭代效率,降低运维成本。
8 |
9 | 可以使用函数计算构建 Serverless Web 应用:
10 |
11 | * **搭建 Web 网站:** 比如搭建基于 Wordpress、Express 等框架的站点;
12 | * **提供 Web API:**为前后端分离的架构提供后端数据支撑,比如提供获取天气 API 查看实时天气;
13 | * **Web 后端:**作为 IOT、移动后端等验证和处理 API 请求。
14 |
15 | ## 02.lowCode & noCode
16 |
17 |
--------------------------------------------------------------------------------
/code/1.2.1-4.js:
--------------------------------------------------------------------------------
1 | //函数调用自身称为递归,函数名为“func”
2 | (function (i){
3 | //"use strict" //取消注释则为严格模式,会报错
4 | console.log("函数名为"+func.name+",第"+i+"次调用")
5 | if(i<3){//递归出口
6 | arguments.callee(++i);
7 | }
8 | })(1);
9 | //函数名为func,第1次调用
10 | //函数名为func,第3次调用
11 | //函数名为func,第3次调用
12 |
13 |
14 | //该函数与后面的箭头函数等效
15 | (function(i){
16 | console.log(i);
17 | })(1);
18 | //箭头函数
19 | ((i)=>{
20 | console.log(i);
21 | })(1);
--------------------------------------------------------------------------------
/4/si-.1.1-shen-ru-li-jie-webpack-da-bao.md:
--------------------------------------------------------------------------------
1 | # 肆.1.1 深入理解Webpack打包
2 |
3 | ## 参考文献
4 |
5 | {% hint style="info" %}
6 | [手写webpack核心原理,再也不怕面试官问我webpack原理](https://mp.weixin.qq.com/s/TTIRDG15T3l5VDm8SrUZWg)
7 | {% endhint %}
8 |
9 | {% hint style="info" %}
10 | [Let's Write a JavaScript Library in ES6 using Webpack and Babel](https://www.loginradius.com/engineering/blog/write-a-javascript-library-using-webpack-and-babel/)
11 | {% endhint %}
12 |
13 | {% hint style="info" %}
14 | [Webpack构建library时的踩坑经历](https://developer.aliyun.com/article/465323)
15 | {% endhint %}
16 |
17 |
--------------------------------------------------------------------------------
/code/1.2.1-1.js:
--------------------------------------------------------------------------------
1 | //函数的声明形态
2 | function func(){
3 | console.log("函数的声明形态")
4 | }
5 |
6 | //函数的表达式形态
7 | let func0 =function(){
8 | console.log("函数的表达式形态");
9 | }
10 |
11 | //函数的嵌套形态
12 | let func1 = function(){
13 | console.log("函数的嵌套形态");
14 | let func2 = function(){
15 | console.log("func2嵌套在func1里")
16 | }
17 | func2();
18 | }
19 |
20 | // 函数的闭包形态
21 | let func3 = function(){
22 | return function(){
23 | console.log("我是以闭包形态存在的函数");
24 | }
25 | }
26 | //所有的函数都通一对括号“()”调用执行
27 | func();
28 | func0();
29 | func1();
30 | func3()();
--------------------------------------------------------------------------------
/7/7.2.1.md:
--------------------------------------------------------------------------------
1 | # 柒.2.1 MVC的前世今生
2 |
3 | 如果要理解MVC,得先知道MVC是解决软件工程范畴内的问题。那么什么是软件工程?援引百度百科的解释:
4 |
5 | > 软件工程是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的学科。它涉及程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等方面。
6 |
7 | 因此,前面讲的十四种设计模式,也是属于软件工程范畴内的;更进一步,本书似乎也是在尝试尽可能多地讲软件工程。
8 |
9 | 严格来讲,MVC不属于设计模式,它比设计模式的粒度更粗,层级更高一些,更专注于“解决构建、维护”等软件工程领域的问题。
10 |
11 | 至于MVC的起源,由谁发明的,由谁率先应用的,由谁发扬光大……记住这些没有卵用,并不会让你在实践中把MVC用的更好。那本篇为什么要用“前世今生”来命题呢?这里的“前世今生”,不是简单的基于历史时间线做记录,而是想从软件的构建与维护的角度,来剖析MVC出现之前的和之后带来的改变,方便读者更深入的理解MVC。
12 |
13 | ## 柒.2.1.1 MVC出现之前
14 |
15 | //todo
16 |
17 | ## 柒.2.1.2 MVC出现之后
18 |
19 | //todo
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/6/6.1.0.md:
--------------------------------------------------------------------------------
1 | # 陆.1.0 导读:SOLID
2 |
3 | 
4 |
5 | ## 01. 认识SOLID
6 |
7 | SOLID原则是我们心爱的[Bob叔\(Uncle Bob\)](https://sites.google.com/site/unclebobconsultingllc/)提出的,是面向对象编程的基本设计原则。
8 |
9 | “SOLID”是五条设计原则英文首字母的组合,如下:
10 |
11 | > * **S – Single Responsibility Principle 单一职责原则**
12 | > * **O – Open-Closed Principle 开放封闭原则**
13 | > * **L – Liskov Substitution Principle 里氏替换原则**
14 | > * **I – Interface Segregation Principle 接口隔离原则**
15 | > * **D – Dependency Inversion Principle 依赖倒置原则**
16 |
17 | JavaScript程序员掌握SOLID要相对其他语言更难一些。为什么呢?因为JavaScript是一门非常“松散类型”的语言,有些人认为它是函数式语言,有些人认为它是面向对象的语言,还有很多人认为两者都是。
18 |
19 | ## 02. 掌握SOLID的必要性
20 |
21 | 根据我的经验,你会很少想在JavaScript中使用类以及多层次的继承等OOP有关的特性,但是掌握SOLID的原理,对我们开发基于JavaScript的软件仍有十分重要的指导意义。
22 |
23 | 尽管起初SOLID是为了指导类和接口的创建,但我还是将SOLID定义扩展到JavaScript函数和模块上,以方便前端工程师朋友们掌握并应用到实际工作中去。
24 |
25 |
--------------------------------------------------------------------------------
/6/6.3.3.md:
--------------------------------------------------------------------------------
1 | # 陆.3.3 Pointfree无参数风格编程
2 |
3 | [上一篇](6.3.2.md#quan-bu-ke-li-hua-de-mu-de-shi-shen-me-ne)讲到了一个Pointfree的例子。
4 |
5 | ## 什么是Pointfree
6 |
7 | Pointfree仍是一种新事物,仍还在快速演绎变化中,因此笔者不会刻意为这种编程风格下定义,而是通过列举更多的例子,可以让读者了解什么是Pointfree。
8 |
9 | ```javascript
10 | //todo
11 | ```
12 |
13 | ## Pointfree的用处到底是什么?
14 |
15 | Pointfree 风格需要一定的时间才能习惯。可能并不需要所有的地方都没有参数。有时候知道某些 Ramda 函数需要多少参数,也是很重要的。
16 |
17 | 但是,一旦习惯了这种方式,它将变得非常强大:可以以非常有趣的方式将很多小的 pointfree 函数组合起来。
18 |
19 | Pointfree 风格的优点是什么呢?人们可能会认为,这只不过是为了让函数式编程变得“好看一点”的学术活动而已。然而,我认为还是有一些优点的,即使需要花一些时间来习惯这种方式也是值得的:
20 |
21 | * 它让编程更简单、精练。虽然这并不总是一件好事,但大部分情况下是这样的。
22 | * 它让算法更清晰。通过只关注正在组合的函数,我们可以在没有参数的干扰下,更好地了解发生了什么。促使我们更专注于正在做的转换的本身,而不是正被转换的数据。
23 | * 它可以帮助我们将函数视为可以作用于不同数据的通用构建模块,而非对特定类型数据的操作。如果给数据一个名字,我们的思想便会被禁锢在:"需要在哪里使用我们的函数";如果去掉参数,便会使我们更有创造力。
24 |
25 | ## 参考文献
26 |
27 | {% hint style="info" %}
28 | [Thinking in Ramda: Pointfree Style](https://randycoulman.com/blog/2016/06/21/thinking-in-ramda-pointfree-style/)
29 | {% endhint %}
30 |
31 |
--------------------------------------------------------------------------------
/5/5.2.3.md:
--------------------------------------------------------------------------------
1 | # 伍.2.3 Pointfree无参数风格编程
2 |
3 | [上一篇](5.2.2.md#quan-bu-ke-li-hua-de-mu-de-shi-shen-me-ne)讲到了一个Pointfree的例子。
4 |
5 | ## 01.什么是Pointfree
6 |
7 | Pointfree仍是一种新事物,仍还在快速演绎变化中,因此笔者不会刻意为这种编程风格下定义,而是通过列举更多的例子,可以让读者了解什么是Pointfree。
8 |
9 | ```javascript
10 | //todo
11 | ```
12 |
13 | ## 02.Pointfree的用处到底是什么?
14 |
15 | Pointfree 风格需要一定的时间才能习惯。可能并不需要所有的地方都没有参数。有时候知道某些 Ramda 函数需要多少参数,也是很重要的。
16 |
17 | 但是,一旦习惯了这种方式,它将变得非常强大:可以以非常有趣的方式将很多小的 pointfree 函数组合起来。
18 |
19 | Pointfree 风格的优点是什么呢?人们可能会认为,这只不过是为了让函数式编程变得“好看一点”的学术活动而已。然而,我认为还是有一些优点的,即使需要花一些时间来习惯这种方式也是值得的:
20 |
21 | * 它让编程更简单、精练。虽然这并不总是一件好事,但大部分情况下是这样的。
22 | * 它让算法更清晰。通过只关注正在组合的函数,我们可以在没有参数的干扰下,更好地了解发生了什么。促使我们更专注于正在做的转换的本身,而不是正被转换的数据。
23 | * 它可以帮助我们将函数视为可以作用于不同数据的通用构建模块,而非对特定类型数据的操作。如果给数据一个名字,我们的思想便会被禁锢在:"需要在哪里使用我们的函数";如果去掉参数,便会使我们更有创造力。
24 |
25 | ## 参考文献
26 |
27 | {% hint style="info" %}
28 | [Thinking in Ramda: Pointfree Style](https://randycoulman.com/blog/2016/06/21/thinking-in-ramda-pointfree-style/)
29 | {% endhint %}
30 |
31 |
--------------------------------------------------------------------------------
/0/0.1.4.md:
--------------------------------------------------------------------------------
1 | # 零.1.4 准备一份好的简历
2 |
3 | 一线互联网企业从来不缺简历,尤其现在普通前端工程师可批量生产的时代。一份工作经常能收到几百上千份简历,HR每天要筛选大量的简历,是相当费时费力的。因此我们要准备一份好的简历,这样才能从简历海洋里面脱颖而出,并争取到宝贵的面试机会。
4 |
5 | 那么什么样的简历才算好的简历呢?笔者从多年的面试(被面试和面试别人都有)经验中总结如下:
6 |
7 | ## 01.简历大纲结构清晰
8 |
9 | 花几分钟了解一下Word/WPS的大纲模式,"章、节、条、款、例",在大纲模式下,先把简历文档按这样的层级编排一下。
10 |
11 | ## 02.具体内容少而精确
12 |
13 | 发挥你上学时写作文的能力,言简意赅甚至咬文嚼字地把重点描述清楚。
14 |
15 | ## 03.精通的技术写成熟悉,熟悉的写成了解
16 |
17 | 在中国,往往是谦受益、满招损。
18 |
19 | 精通某类技术,别表现得太得意自满。因为总有比我们技术更好的考官,当我们表现出自信满满的时候,绝大多数考官往往会想要挫一下我们的锐气,试探一下我们的技术上限,所以往往会挑我们最自信的领域出题,而且题目难度和我们表现出的自信成正比。如果一个难题回答得不好,往往会前功尽弃,给很大的负面评分。所以,对自己精通的技术,不妨谦虚一点写成熟悉,这样回答考官的技术问题,反而能给对方意外惊喜。
20 |
21 | 同理,只是熟悉的技术,写成了解,少一些节外生枝的麻烦。
22 |
23 | 如果只是了解的技术,干脆就别写了。不然随便问几个稍微有点点深度的问题却答不上来,会让考官认为我们的简历写得太浮夸,从而对我们的印象大打折扣。
24 |
25 | ## 04.尽可能放上自己的博客、个人主页、开源项目链接
26 |
27 | 当我们学会了总结、归纳之后,学一样东西往往是很快的。写博客、搭建个人主页,参加GitHub开源项目,就是归纳、总结、分享的过程。
28 |
29 | 在个人简历里面放上自己的博客、个人主页、开源项目链接,能让用人方更深刻地了解我们的学习方法论,让用人单位知道我们除了自己有良好的学习能力之外,还具有强大的分享能力,能分享给同事们很多新技能,推动整个团队的整体职业素养变得更好!
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/10/10.1-1.md:
--------------------------------------------------------------------------------
1 | # 拾.1 成为一个好的程序员远比找份好工作重要
2 |
3 | ## 拾.1.1 为什么很多程序员写到一定阶段,就失去了对coding的兴趣?
4 |
5 | 我觉得是因为没有追求优雅地去coding,写的东西缺乏美感。
6 |
7 | 而我看过了一些高龄的老外coder的博客,读他们的代码,看他们的文字,发现居然是在欣赏艺术品,整个过程几乎没有枯燥的感觉。
8 |
9 | 这里面深层次的原因,是因为什么?
10 |
11 | 我觉得,是因为很长一段时间,我们在面向工作编程。
12 |
13 | 明白这点之后,我们要做的正确的事,应该是面向“成为一个更好的程序员”去编程。
14 |
15 | [www.recurse.com](http://www.recurse.com) 不知道是否有朋友了解,纽约一个程序员互助组织。它的创立初衷和我的想法一致:程序员应该让自己成为一个好的程序员。
16 |
17 | 至于好的工作,那是成为好程序员之后的附属品。
18 |
19 | ## 拾.1.2 要不要重复造轮子?
20 |
21 | 经常听到“不要重复造轮子”的话。
22 |
23 | 的确,这可以让程序员成为一个效率高的员工,但不会有助于成为一个更好技术水平的程序员。
24 |
25 | 长期停留在调用api的阶段,时间久了,会失去对coding的热爱。
26 |
27 | 这某种程度上解释了为什么那么多程序员会在40岁之前转行,因为不够爱。而不够爱,是因为一开始认知就错了。
28 |
29 | 想办法争取机会造轮子吧(比如去做中台),如果你真的爱并且想coding到八十岁的话。
30 |
31 | ## 拾.1.3 作为前浪的老程序员真的缺少舞台吗?
32 |
33 | 有一些互联网软件工程师朋友和我倾诉,说到一定年纪明显感到来自后浪的竞争压力。
34 |
35 | 是的,后浪推前浪,一代接一代迭代演化前行,前浪们一定会感受后浪明显的推背力。然而,并不意味着前浪就没有舞台了。其实,这次新冠疫情加速全行业的数字化,体力旺盛的后浪源源不断进入行业,而资深工程师、技术专家又是现在企业急需的,大量的有深度的问题需要这些资深专家解决。所以,只要前浪们不要陷入体力竞争的死胡同,在多年的职业生涯中积累了技术的广度之后,再努力一步把自己的技能往纵深发展,成为垂直领域资深中的资深,到那时,coding到八十岁是一个美好又可实现的理想。
36 |
37 | 岂曰无衣?加油,前浪们。
38 |
39 |
--------------------------------------------------------------------------------
/0.0.1.md:
--------------------------------------------------------------------------------
1 | # 零.0.1 前言·写给有缘人
2 |
3 | ## 01. coding 到 80 岁
4 |
5 | 作为一个老程序员,coding已经成为生命的一部分,coding到八十岁是我的理想,而JavaScript是我挚爱的语言!
6 |
7 | 自从2010年出版个人第一本互联网技术书籍后,便再也没有时间可以写系统性论述技术的著作。因为后来加入奇虎360和百度这两家一线互联网公司,从事前端与手机客户端技术性工作,并主持研发了亿级用户的手机APP,这期间相当繁忙。
8 |
9 | 在接受了一线互联网企业的再锻造与重塑之后,编程工作就像打游戏一样,让我觉得快乐与充实。每天都能“通关”,解决掉一个又一个问题,与优秀的聪明的睿智的热心的同事们一起协同合作,创造一个又一个生动有趣的产品,成就感是满满的……而且最重要的,在这个过程中居然还能赚到不少钱,让我作为一个程序员能够体面地生活并做自己喜欢的事,这实在是太美妙了!
10 |
11 | ## 02. 求知之路,道阻且长
12 |
13 | 而在进入360和百度之前,记得那年是2011年,创业公司彻底倒闭,我失业了。实在没办法,为了谋生存必须找一份有稳定收入的工作。当时是计划入职一线互联网公司,做自己感兴趣的前端\(Front-End\)coding。因为从大学出来后和师兄们折腾创业,虽有一些技术积累但是不够系统化,而且缺乏职业化的工作经历,求职时是有点尴尬的,一线互联网公司似乎不太乐意接受这种情况,面试之旅已然进入Hard模式。面对逆境,我希望通过用扎实的技术功底和丰富的实战经验来打动雇主。
14 |
15 | 在复习/学习期间,我查阅了大量国内外文档资料,发现原始资料相对少,原始的资料论文式偏多的,对英语阅读能力有非常大的挑战。而国内的资料大多数有错漏、不完整:首先是翻译问题非常大,术语翻译错误、译文表意模棱两可、原文内容翻译不完整,让人看了更加迷惑不解;国内网上的文章,绝大多数缺乏系统化论述,知识点分散零碎,而且很多有代码错误……各种原因,对自己的学习过程造成了不少困扰。
16 |
17 | ## 03. 感同身受,写给有缘人
18 |
19 | 综上,感同身受求知之不易,因此多年后\(2019年\)有了闲暇便立即着手整理并分享本书,把当前前端核心知识要点梳理一遍,供前端工程师朋友们复习与进阶参考。
20 |
21 | 如果我能通过自身努力最终能达成入职一线互联网公司的目标,那么更年轻、更健康和更聪明的程序员朋友们只会做得更好。加油吧,奥力给!本书还正在持续更新中,许多章节会陆续“点亮”的 🧡 。
22 |
23 |
--------------------------------------------------------------------------------
/10/10.1.md:
--------------------------------------------------------------------------------
1 | # 拾.1 成为一个好的程序员远比找份好工作重要
2 |
3 | ## 拾.1.1 为什么很多程序员写到一定阶段,就失去了对coding的兴趣?
4 |
5 | 我觉得是因为没有追求优雅地去coding,写的东西缺乏美感。
6 |
7 | 而我看过了一些高龄的老外coder的博客,读他们的代码,看他们的文字,发现居然是在欣赏艺术品,整个过程几乎没有枯燥的感觉。
8 |
9 | 这里面深层次的原因,是因为什么?
10 |
11 | 我觉得,是因为很长一段时间,我们在面向工作编程。
12 |
13 | 明白这点之后,我们要做的正确的事,应该是面向“成为一个更好的程序员”去编程。
14 |
15 | [www.recurse.com](http://www.recurse.com) 不知道是否有朋友了解,纽约一个程序员互助组织。它的创立初衷和我的想法一致:程序员应该让自己成为一个好的程序员。
16 |
17 | 至于好的工作,那是成为好程序员之后的附属品。
18 |
19 | ## 拾.1.2 要不要重复造轮子?
20 |
21 | 经常听到“不要重复造轮子”的话,尤其团队迫切需要提升ROI\(投入产出比\)的情况下。
22 |
23 | 的确,这可以让程序员成为一个做事足够快ROI足够高的员工,但不会太多地有助于其成为一个更好技术水平的程序员。
24 |
25 | 长期停留在调用api的阶段,时间久了,会失去对coding的热爱。
26 |
27 | 这某种程度上解释了为什么那么多程序员会在40岁之前转行,因为不够爱。而不够爱,是因为一开始认知就错了。
28 |
29 | 想办法争取机会造轮子吧,比如去做中台,如果你真的爱并且想coding到八十岁的话。
30 |
31 | ## 拾.1.3 作为前浪的老程序员真的缺少舞台吗?
32 |
33 | 有一些互联网软件工程师朋友和我倾诉,说到一定年纪明显感到来自后浪的竞争压力。
34 |
35 | 是的,后浪推前浪,一代接一代迭代演化前行,前浪们一定会感受后浪明显的推背力。然而,并不意味着前浪就没有舞台了。其实,这次新冠疫情加速全行业的数字化,体力旺盛的后浪源源不断进入行业,而资深工程师、技术专家又是现在企业急需的,大量的有深度的问题需要这些资深专家解决。所以,只要前浪们不要陷入体力竞争的死胡同,在多年的职业生涯中积累了技术的广度之后,再努力一步把自己的技能往纵深发展,成为垂直领域资深中的资深,到那时,coding到八十岁是一个美好又可实现的理想。
36 |
37 | 岂曰无衣?加油,前浪们。
38 |
39 |
--------------------------------------------------------------------------------
/2/2.1.2.md:
--------------------------------------------------------------------------------
1 | # 贰.1.2 链表
2 |
3 | \(单\)链表的JavaScript数据结构如下:
4 |
5 | ```javascript
6 | let Node = {//链表中的一个结点
7 | val : 1891, //结点的值
8 | next: node //一个指针指向下一个结点。若结点为链表的尾端,则next的值是null
9 | }
10 | ```
11 |
12 | ## 01.反转链表
13 |
14 | ### 迭代法
15 |
16 | ```javascript
17 | var reverseList = function(head/*Node*/) {
18 | if(!head || !head.next) return head;
19 | var prev = null, curr = head;
20 | while(curr) {
21 | // 用于临时存储 curr 后继节点
22 | var next = curr.next;
23 | // 反转 curr 的后继指针
24 | curr.next = prev;
25 | // 变更prev、curr
26 | // 待反转节点指向下一个节点
27 | prev = curr;
28 | curr = next;
29 | }
30 | head = prev;
31 | return head;
32 | }
33 | ```
34 |
35 | ### 尾递归法
36 |
37 | ```javascript
38 | var reverseList = function(head/*Node*/) {
39 | if(!head || !head.next) return head;
40 | return reverse(null, head);
41 | };
42 |
43 | var reverse = function(prev, curr) {
44 | if(!curr) return prev;
45 | var next = curr.next;
46 | curr.next = prev;
47 | return reverse(curr, next);
48 | };
49 | ```
50 |
51 | ## 02.回形链表
52 |
53 |
--------------------------------------------------------------------------------
/0/0.1.5.md:
--------------------------------------------------------------------------------
1 | # 零.1.5 不卑不亢,不疾不徐地说话
2 |
3 | 如果没有丰富的工作经验和阅历,新手前端工程师在面对一线互联网企业的面试官时,多少都是有一点自卑心理的,容易把自己摆在弱势,以表现出诚恳态度、或减少对方的麻烦,来争取对方的好感、获取信息。这不能说完全错误,因为确实有些好虚荣、地位不高的面试官喜欢听人这样说。但说老实话,他们所负责招聘的职位,往往不会重要,他们所在的公司,多半不会大有前途。
4 |
5 | 但是你面试的是一线互联网企业,这是真正的大企业,公司的领导层是聪明睿智的一批人。**睿智的人让别人最舒服的一点,就是让你无需顾及他的自尊心;而让别人觉得最可怕,就是你那点小套路人家早看穿了。** 所以,你用弱势的态度自居,过分谨慎小心地说话,是较难获得对方好感的。
6 |
7 | ## 零.1.5.1 保持自信但不傲慢
8 |
9 | ### 自信的表现
10 | - **眼神交流**:与面试官保持适度的眼神接触,不要躲闪
11 | - **语速适中**:说话不疾不徐,给面试官思考的时间
12 | - **姿态自然**:坐姿端正但不僵硬,手势自然得体
13 | - **声音清晰**:音量适中,语速均匀,发音清晰
14 |
15 | ### 避免傲慢
16 | - **不要打断**:等面试官说完再回答
17 | - **承认不足**:遇到不会的问题,诚实承认并表达学习意愿
18 | - **尊重对方**:即使不认同面试官的观点,也要礼貌表达
19 |
20 | ## 零.1.5.2 语言表达技巧
21 |
22 | ### 回答问题的结构
23 | 1. **直接回答**:先给出明确的答案
24 | 2. **解释原因**:说明为什么这样认为
25 | 3. **举例说明**:用具体例子支撑观点
26 | 4. **总结归纳**:简要总结要点
27 |
28 | ### 避免的语言陷阱
29 | - **过度谦虚**:"我可能不太行"、"我试试看吧"
30 | - **推卸责任**:"这不是我的错"、"别人没告诉我"
31 | - **模糊表达**:"大概"、"可能"、"差不多"
32 |
33 | ## 零.1.5.3 情绪管理
34 |
35 | ### 保持冷静
36 | - **深呼吸**:面试前做几次深呼吸,稳定情绪
37 | - **积极暗示**:告诉自己"我能行"、"我准备充分"
38 | - **转移注意力**:如果紧张,可以观察周围环境
39 |
40 | ### 应对压力
41 | - **承认紧张**:如果面试官看出你紧张,可以诚实承认
42 | - **寻求支持**:面试前可以和朋友模拟练习
43 | - **调整期望**:把面试当作学习机会,而不是生死考验
44 |
45 | ## 零.1.5.4 结语
46 |
47 | 面试中的语言表达不仅仅是技巧问题,更是心态和自信的体现。保持不卑不亢的态度,既能展现你的专业素养,也能让面试官感受到你的自信和能力。记住,你是在和未来的同事交流,而不是在乞求工作机会。
48 |
49 |
--------------------------------------------------------------------------------
/0/0.1.6.md:
--------------------------------------------------------------------------------
1 | # 零.1.6 "有什么问题要问我吗",如何回答?
2 |
3 | 这个问题几乎是标准问题,一般公司都会问到,一线互联网公司尤其会以该问题结束这一轮面试。
4 |
5 | 有数据显示,面试中面试官讲话时间的占比越高,面试的成功率就越高。因为他愿意把公司展现给你,表现出来的自然是一种积极、愿意配合的态度。反之,如果他只是一味的听你说做自我介绍,听你讲你之前的工作经验,那你成功的几率将会大大降低。
6 |
7 | 所以,当面试官提出这个终极问题:"你还有什么问题要问我吗?",一定要记住:不是问什么问题都是OK的,更重要的是不能盲目的去提问一些死记硬背的问题,因为这不但不会有加分项,更有可能把面试上半部分的好印象也都抵消了。
8 |
9 | ## 零.1.6.1 一定要提问
10 |
11 | 综合而言,一定要提问,显得你准备充分,应变能力强,千万不可放弃这个机会。可以往以下几个方向提问(提的问题不要和本书写的一样,应稍作变化):
12 |
13 | ### **1.为什么要招人?**_**`(对方是HR、leader)`**_
14 |
15 | 对工作岗位的真实性做深入了解,显得你是在认真的关注这个工作机会。
16 |
17 | ### 2.这个岗位具体会做哪些事情,会与哪些人合作?
18 |
19 | 进一步对工作岗位进行深入了解,以及对将来的合作伙伴有更多提前认知,同时给面试官一些尽情表达的机会,显得你是非常关心这个工作机会。
20 |
21 | ### **3.咱们公司的企业文化是什么样的?**_`(对方是HR、leader)`_**
22 |
23 | 一线互联网公司最亮眼的就是企业文化了,很多人都是因为了解到该公司文化,内心第一时间有了共鸣,然后才被感召而去应聘、入职的,面试官当初也很可能会有这个共鸣在里面,所以一般会巴拉巴拉非常自豪地和你讲解一番。面试官得到了充分的表达机会,充分表示出了积极意愿,充分的被倾听,心理上会对你有更多的好感。然后你正好也听听更专业的表述,看这种企业文化是否真正让你内心共鸣了呢?
24 |
25 | ### **4.咱们团队目前面对的最大挑战/困难是什么?**
26 |
27 | 抓住机会深入了解团队目前的困难、痛点,利用入职前的空档期,提前做好预习与准备,以便顺利入职之后快速产出。
28 |
29 | ### **5.如果我能加入这个团队,你对我有什么期望?**
30 |
31 | ### **6.期望我的加入带来哪些改变?**_`(对方是leader)`_**
32 |
33 | 如果你应聘的岗位要带人的话,比如架构师、技术负责人、技术经理等带有管理性质的岗位,则可以更进一步提出这个问题。
34 |
35 | ## 零.1.6.2 结语
36 |
37 | 总之,**问太肤浅的问题,会让你显得格局小。** 太细节、太琐碎的,比如作息制度、报销制度,是否管午饭,是否经常加班,团队有几个女生,有没有健身房……等等类似太具体的问题,还是留在该公司将offer发给你之后、入职已经胜券在握的时候再去问HR吧。
38 |
39 | ###
40 |
41 |
--------------------------------------------------------------------------------
/9/9.1.md:
--------------------------------------------------------------------------------
1 | # 玖.1 一线互联网公司前端团队官方公众号
2 |
3 | ## 玖.1.1 奇虎360
4 |
5 | ### 奇舞周刊
6 |
7 | 
8 |
9 | 这是360的官方前端团队“奇舞团”的微信公众号,几乎都是精品文章。直接搜公众号名(本段标题加粗黑字部分)就可找到(以下同)。
10 |
11 | ## 玖.1.2 阿里巴巴
12 |
13 | ### 淘系前端团队
14 |
15 | 
16 |
17 | 这个是淘宝的前端团队,有很多开源产品介绍,介绍的技术比较前卫。
18 |
19 | ### 钉钉大前端团队
20 |
21 | 
22 |
23 | 这个公众号比较新,目前文章不多,招聘启事蛮多的。钉钉属于比较有潜力的产品,因此看好这个前端团队的发展前景。
24 |
25 | ## 玖.1.3 腾讯
26 |
27 | ### 腾讯IMWeb前端团队
28 |
29 | 
30 |
31 | 这个是腾讯官方支持的前端公众号,IMWeb前端社区,汇聚众多前端开发爱好者。关注可听精致大咖直播课,看前沿干货推文,带你修炼前端开发内功!
32 |
33 | ### QQ音乐前端团队
34 |
35 | 
36 |
37 | 有一些Flutter和React介绍,可以看出这个团队是web和native端技术都有使用的,跨平台研发的前端团队。
38 |
39 | ## 玖.1.4 字节跳动
40 |
41 | ### 字节跳动技术团队
42 |
43 | 
44 |
45 | 技术范围比较广,有前端技术,内容讲解都比较深入。
46 |
47 | ## 玖.1.5 百度
48 |
49 | ### FEX团队
50 |
51 | 
52 |
53 | 这是我老东家的前端团队的官方公众号,FEX技术周刊做得很有特色,强烈推荐。
54 |
55 | ## 玖.1.6 快手
56 |
57 | //暂时还没找到,有人知道的话麻烦评论分享一下
58 |
59 | ## 玖.1.7 美团
60 |
61 | ### 美团技术团队
62 |
63 | 
64 |
65 | 9000+工程师,如何支撑中国领先的生活服务电子商务平台?3.2亿消费者、500万商户、2000多个行业、几千亿交易额背后是哪些技术?这里是美团、大众点评、美团外卖、美团大零售等技术团队的对外窗口,每周推送技术文章、活动及招聘信息等。
66 |
67 | ## 玖.1.8 网易
68 |
69 | ### 严选技术团队
70 |
71 | 
72 |
73 | 网易严选技术团队致力于分享电商业态下的技术干货,严选好物,用心生活;这里是网易严选技术、产品的对外窗口,每周推送技术文章、团队活动、招聘信息等内容。
74 |
75 |
--------------------------------------------------------------------------------
/2/2.0.md:
--------------------------------------------------------------------------------
1 | # 贰.0 本章导读
2 |
3 | ## 贰.0.1 为什么要学习数据结构和算法?
4 |
5 | 数据结构和算法是编程的内功,对于编程能力提高和职场之路进阶至关重要。
6 |
7 | 深厚的内功可以有效保障写出的代码性能良好,可以提前预估代码运行达到预期目的,提高工作产出,也能让学习其他编程语言和框架变得事半功倍。
8 |
9 | 而且现状是,数据结构和算法如今已经是国内外一线互联网公司面试的必考知识点。
10 |
11 | ## 贰.0.2 会调框架API和CRUD还不够
12 |
13 | 如果仅仅满足实现日常开发中调调框架API和做做CRUD(Creat,Read,Update,Delete,也即数据库增删改查),那确实大多数时候不太用要数据结构和算法知识,但长期这样下去,就会沦落为吃青春饭的coder(俗称“码农”),到一定年龄之后体力速度跟不上,便会遭受就业排挤。
14 |
15 | 并不是说调框架API和CRUD就代表低水平,实际上复杂的软件都是可以分解成若干个简单的子模块来组成,每一个子模块里边做的事情可能也就是调用API然后CRUD,但是这些子模块组合在一起是可以实现很复杂业务逻辑或者说流程。
16 |
17 | 互联网前端领域这几年发展非常快,很多非科班的学生也都进入了这个行业。在转行的时候,大家考虑的都是经济效益。那么放在最重要的就是熟悉一门编程语言、会调一些框架的API、然后会一些数据库CRUD操作,以遍快速找到工作,因此不会有太多时间去专注学习数据结构和算法。的确,一些中小型企业也无需求简单的话,可以应付。
18 |
19 | 但是,当你进入一线互联网企业,项目越来越大越来越复杂,就会发现不是所有的项目都是调API和CRUD就可以搞定了。比如说一些广告后台、搜索、排序推荐的系统,还是有一些数据结构的;再比如说搜索引擎里边,最后对召回的结果要进行合并,很典型的合并k个有序的数组算法;再比如说热搜词的实时统计,你怎么实现?直接调前端框架API?直接拿数据库进行增删改查?那不行的。
20 |
21 | ## 贰.0.3 为什么面试官都喜欢问数据结构和算法呢?
22 |
23 | 因为数据结构和算法最能体现前端工程师的编程基本功。
24 |
25 | 基本功扎实的人,无论是做业务实现还是去做算法,都不太会差到哪里去。我们以前在百度招人的时候都有一个标准,就说招进来的这个人至少要排到team里面前50%。只有这样招进来的人才能够让我们的team更加强大,不能招一个很差的人来拉低平均水平。怎么评判这个人能够在team里面排到前50%呢?其实是有很多标准的,比如说算法数据结构就是里边很重要的一部分;其次,他的逻辑思维能力,系统设计能力,他的职业素养等等。但是算法和数据结构占的比重还是最大的。
26 |
27 | 如果连数据结构和算法都不会,有没有什么影响?有的,要知道程序员这个群体也是有金字塔结构的。如果连基本的算法和数据结构都不会,基本上属于比较底层的程序员。比较底层的程序员就意味着比较低的薪酬待遇。同样是出售脑力劳动和时间,你比别人少赚。
28 |
29 | 所以就算是从薪资待遇的角度来讲,也要重视数据结构与算法。
30 |
31 | ## 贰.0.4 结语
32 |
33 | 如果想在前端领域有长足的发展,就扎实学好数据结构和算法,需要成长为领域专家,从coder升级到架构师甚至更高阶的技术专家,成为有思想、有策略、有创新能力的前端精英。由于数据结构与算法内容庞大,一本书根本写不下,所以本章只挑选一些我认为相对更有用的内容放入。
34 |
35 |
36 |
37 |
38 |
39 |
--------------------------------------------------------------------------------
/7/7.1.14.md:
--------------------------------------------------------------------------------
1 | # 柒.1.14 适配器模式
2 |
3 | 适配器模式(Adapter Pattern)又称包装器模式,将一个类(对象)的接口(方法、属性)转化为用户需要的另一个接口,解决类(对象)之间接口不兼容的问题。
4 |
5 | 主要功能是进行转换匹配,目的是复用已有的功能,而不是来实现新的接口。也就是说,访问者需要的功能应该是已经实现好了的,不需要适配器模式来实现,适配器模式主要是负责把不兼容的接口转换成访问者期望的格式而已。
6 |
7 | ## 1. 适配器模式生活实例
8 |
9 | 现实生活中我们会遇到形形色色的适配器,最常见的就是转接头了,比如不同规格电源接口的转接头、iPhone 手机的 3.5 毫米耳机插口转接头、DP/miniDP/HDMI/DVI/VGA 等视频转接头、电脑、手机、ipad 的电源适配器,都是属于适配器的范畴。 在类似场景中,这些例子有以下特点:
10 |
11 | * 旧有接口格式已经不满足现在的需要;
12 | * 通过增加适配器来更好地使用旧有接口。
13 |
14 | ## 2. 适配器模式的实现
15 |
16 | 电源适配器的例子,一开始我们使用的中国插头标准:
17 |
18 | 但是我们出国旅游了,到了日本,需要增加一个日本插头到中国插头的电源适配器,来将我们原来的电源线用起来:
19 |
20 | 
21 |
22 | 访问者需要目标对象的某个功能,但是这个对象的接口不是自己期望的,那么通过适配器模式对现有对象的接口进行包装,来获得自己需要的接口格式。
23 |
24 | ```javascript
25 | var chinaPlug = {
26 | name: 'china plug',
27 | chinaPlug() {
28 | console.log(this.name);
29 | }
30 | }
31 |
32 | var japanPlug = {
33 | name: 'japan plug',
34 | japanPlug() {
35 | console.log(this.name);
36 | }
37 | }
38 |
39 | function japanPlugAdapter(plug) {
40 | return {
41 | // 改变chinaPlug调用接口,不影响之前的调用接口
42 | chinaPlug() {
43 | return plug.japanPlug();
44 | }
45 | }
46 | }
47 | chinaPlug.chinaPlug();
48 | japanPlugAdapter(japanPlug).chinaPlug();
49 | ```
50 |
51 | ## 3. 适配器模式的优缺点
52 |
53 | ### 适配器模式的优点:
54 |
55 | * 已有的功能如果只是接口不兼容,使用适配器适配已有功能,可以使原有逻辑得到更好的复用,有助于避免大规模改写现有代码;
56 | * 可扩展性良好,在实现适配器功能的时候,可以调用自己开发的功能,从而方便地扩展系统的功能;
57 | * 灵活性好,因为适配器并没有对原有对象的功能有所影响,如果不想使用适配器了,那么直接删掉即可,不会对使用原有对象的代码有影响。
58 |
59 | ### 适配器模式的缺点:
60 |
61 | * 会让系统变得零乱,明明调用 A,却被适配到了 B,如果系统中这样的情况很多,那么对可阅读性不太友好。如果没必要使用适配器模式的话,可以考虑重构,如果使用的话,可以考虑尽量把文档完善。
62 |
63 |
--------------------------------------------------------------------------------
/0/0.1.1.md:
--------------------------------------------------------------------------------
1 | # 零.1.1 一线互联网公司有什么不同?
2 |
3 | ## 零.1.1.1 **首先,是"规模大,设施全,极具包容性"**
4 |
5 | 一线互联网公司的规模少则数千人,多则几万十来万人。办公室场地也超级大,成片的工位一望无际,办公场所内部设施齐全。以百度大厦为例,办公、吃饭、洗澡、睡眠、洗衣、健身、购物、娱乐……一应俱全,我在百度工作的时候,就曾经一个月在百度大厦里开心工作生活,不需要回家。
6 |
7 | 包容性在自己身上就得到了体现。我听力不好,加入360和百度这2个大集体后,丝毫不影响日常工作的合作和沟通。大家协作性、包容性意识都很强,会尽全力互相配合,也比较有爱。这些大集体内还有很多奇奇怪怪的人,绝大多数都能自由地发挥出自己的特长,就像夜空中的点点繁星,各自自在地闪耀着光芒。
8 |
9 | 
10 |
11 | ## 零.1.1.2 **其次,是"分工细,技术要求广度,但更重要的是深度"**
12 |
13 | 这里的工种划分十分细致。从产品的创意讨论、原型设计,到交互设计,然后到Photoshop图片、Fireworks切图制作HTML/CSS静态页面,然后到写JavaScript前端业务逻辑,再到配置Linux服务器,安装数据库,建库,写后端API,Web服务器架设,安全防卫,日常业务测试,打包上线……都有专业的人员把关。在这里,你可以很快地成长为某个领域的专家,而且随着时间增长,随着参与项目数量增加、规模增大,你会不断得到锻炼,逐渐成为专家中的专家。
14 |
15 | 而我在创业的时候,就没有太明确的分工概念。因为初创公司钱不多,所以能招到的人少,事情多的时候,恨不得一个人搞定所有,遂被成功锤(zhe)炼(mo)成多面手,美其名曰"全栈工程师"😭。
16 |
17 |
18 | ## 零.1.1.3 **有鲜明的文化特征**
19 |
20 | 比如百度的同学文化,字节跳动的极客文化,阿里巴巴的侠客文化,都是很有意思的文化。因此,衡量一家互联网公司是否是一线公司的标准之一,就是看它有没有鲜明的文化特征。
21 |
22 |
23 | ## 零.1.1.4 **钟爱名校和高学历人才**
24 |
25 | 985和211毕业生是很受一线互联网公司欢迎的。虽然为了政治正确,这些公司口头上也说"学历不限,能力第一",但是如果你是985或者211毕业的,会加分的。当然,即使你不是985、211毕业生,也不是硕士博士,也没关系的,仍有非常非常多的不知名大学毕业、甚至辍学的朋友们在这些一线互联网企业做出了卓越的成绩。我在百度期间,就曾经为自己的团队不限学历地招聘了一个尚未毕业的专科生加入,而且他的表现确实惊艳。由此可见,能力才是第一位的。
26 |
27 |
28 | ## 零.1.1.5 **嗯嗯,开的薪资待遇高出一大截**
29 |
30 | 为了争夺人才实现公司正向循环发展,在薪酬竞赛中长期由这些一线互联网公司领跑,中小型互联网公司长期被压制,只能望其项背。目前同样的职业技能水平要求,字节跳动、快手、腾讯、饿了么、阿里巴巴等一线互联网大公司所开的年薪,几乎是其他中小型互联网公司的2倍甚至更高。
31 |
32 | ## 零.1.1.6 本篇结语
33 |
34 | 综上,在非一线互联网公司苦练3~5年之后,进入一线公司深造,把技术深度锤炼出来,是每一个有理想、有追求的前端工程师的必由之路。强烈推荐每个前端工程师,如果有条件、有机会的话,一定要入职一线互联网公司工作,体验那种多人大规模协作打造惊世产品的乐趣。这样的职业生涯,才是基本美满的。
35 |
36 |
--------------------------------------------------------------------------------
/1/1.2.7.md:
--------------------------------------------------------------------------------
1 | # 壹.2.7 同步和异步,阻塞和非阻塞
2 |
3 | 本篇文章其实是讲编程全领域通行的概念,之所以单独拎出来写在本书,是因为笔者发现绝大多数前端工程师对这块儿的概念理解得不太严谨。
4 |
5 | 在实际的开发中,我们经常会听到同步、异步,阻塞、非阻塞这些编程概念,可能都会比较懵,然后就各种查网上似是而非的资料,结果越查越迷糊,大部分文章都千篇一律,没有说到本质上的区别。所以下次再碰到这些概念,印象还是比较模糊,尤其是在一些场景下同步与阻塞,异步与非阻塞感觉没什么区别,但其实这四个术语描述的事物还真不是一回事。
6 |
7 | 下面我们来慢慢探讨他们之间的区别与联系,在这之前,我们还会经常看到下面的组合术语:
8 |
9 | * 同步+阻塞
10 | * 同步+非阻塞
11 | * 异步+阻塞
12 | * 异步+非阻塞
13 |
14 | 在当什么是同步和异步,阻塞与非阻塞的概念还没弄清楚之前,更别提上面这些组合术语了,只会让你更加困惑。
15 |
16 | ## 壹.2.7.1 同步和异步
17 |
18 | **同步和异步其实指的是,请求发起方对消息结果的获取是主动发起的,还是等被动通知的。**
19 |
20 | 如果是请求方主动发起的,一直在等待应答结果(同步阻塞),或者可以先去处理其他的事情,但要不断轮询查看发起的请求是否有应答结果(同步非阻塞 )因为不管如何都要发起方主动获取消息结果,所以形式上还是同步操作。
21 |
22 | 如果是由服务方通知的,也就是请求方发出请求后,要么在一直等待通知(异步阻塞),要么就先去干自己的事了(异步非阻塞),当事情处理完成之后,服务方会主动通知请求方,它的请求已经完成,这就是异步。异步通知的方式一般是通过状态改变,消息通知,或者回调函数来完成,大多数时候采用的都是回调函数。
23 |
24 | 
25 |
26 | ## 壹.2.7.2 阻塞和非阻塞
27 |
28 | 阻塞和非阻塞在计算机的世界里面,通常指的是针对IO的操作,如网络IO和磁盘IO等。
29 |
30 | 那么什么是阻塞和非阻塞呢?简单的说就是我们调用了一个函数之后,在等待这个函数返回结果之前,当前的线程是处于挂起状态,还是运行状态,如果是挂起状态,就意味着当前线程什么都不能干,就等着获取结果,这就叫同步阻塞,如果仍然是运行状态,就意味当前线程是可以的继续处理其他任务,但要时不时的去看下是否有结果了,这就是同步非阻塞。
31 |
32 | 
33 |
34 | ## 壹.2.7.3 场景举例
35 |
36 | 同步,异步,阻塞和非阻塞,会组合成上面提到过的四种结果:
37 |
38 | 举个例子,比如我们去照相馆拍照,拍完照片之后,商家说需要30分钟左右才能洗出来照片。
39 |
40 | ### 1. 同步+阻塞
41 |
42 | 这个时候如果我们一直在店里面啥都不干,一直等待商家面前等待它洗完照片,这个过程就叫同步阻塞。
43 |
44 | ### 2. 同步+非阻塞
45 |
46 | 当然大部分人很少这么干,更多的是大家拿起手机开始看电视,看一会就会问老板洗完没,老板说没洗完,然后我们接着看,再过一会接着问,直到照片洗完,这个过程就叫同步非阻塞。
47 |
48 | ### 3. 异步+阻塞
49 |
50 | 因为店里生意太好了,越来越多的人过来拍,店里面快没地方坐了,老板说你把你手机号留下,我一会洗好了就打电话告诉你过来取,然后你去外面找了一个长凳开始躺着睡觉等待老板打电话,啥不都干,这个过程就叫异步阻塞。
51 |
52 | ### 4.异步+非阻塞
53 |
54 | 当然实际情况是,大家可能会直接先去逛街或者吃饭做其他的活动,店老板来了电话就去取照片,这样一来两不耽误,这个过程就叫异步非阻塞。
55 |
56 | ## 壹.2.7.4 小结
57 |
58 | 只有严谨地理解了同步、异步,阻塞、非阻塞的概念,才能更好地理解JavaScript的事件处理机制以及Eventloop,我们下一篇见。
59 |
60 |
--------------------------------------------------------------------------------
/0/0.1.3.md:
--------------------------------------------------------------------------------
1 | # 零.1.3 该岗位负责做什么的,岗位所属部门在什么位置,上升空间多大?
2 |
3 | 在面试一线互联网公司之前,除了了解公司背景,还需要深入了解目标岗位的具体情况。这包括岗位职责、部门架构和职业发展路径。
4 |
5 | ## 零.1.3.1 深入了解岗位职责
6 |
7 | ### 前端工程师岗位职责
8 | - **基础开发工作**:HTML/CSS/JavaScript开发,页面布局和交互实现
9 | - **框架应用**:Vue、React、Angular等主流框架的使用和优化
10 | - **工程化**:Webpack、Vite等构建工具的使用,代码规范和质量控制
11 | - **性能优化**:页面加载速度优化,用户体验提升
12 | - **跨端开发**:移动端适配,小程序开发等
13 | - **团队协作**:与产品、设计、后端等角色的沟通配合
14 |
15 | ### 高级前端工程师额外职责
16 | - **技术方案设计**:复杂业务场景的技术选型和架构设计
17 | - **团队管理**:指导初级工程师,技术分享和培训
18 | - **技术预研**:新技术调研和团队技术栈升级
19 |
20 | ## 零.1.3.2 部门架构和位置
21 |
22 | ### 常见的前端部门组织架构
23 | ```
24 | 技术部
25 | ├── 前端组
26 | │ ├── 基础架构组(负责公共组件、工具库)
27 | │ ├── 业务开发组(负责具体产品线)
28 | │ └── 移动端组(负责移动端开发)
29 | ├── 后端组
30 | ├── 测试组
31 | └── 运维组
32 | ```
33 |
34 | ### 部门在公司中的位置
35 | - **产品导向型**:前端组直接向产品负责人汇报
36 | - **技术导向型**:前端组向技术总监汇报
37 | - **混合模式**:前端组在技术部门下,但参与产品决策
38 |
39 | ## 零.1.3.3 职业发展上升空间
40 |
41 | ### 技术发展路径
42 | 1. **初级前端工程师**(0-2年)
43 | - 掌握基础技能,能独立完成简单页面开发
44 | - 薪资范围:8K-15K
45 |
46 | 2. **中级前端工程师**(2-5年)
47 | - 熟练使用主流框架,能解决复杂技术问题
48 | - 薪资范围:15K-30K
49 |
50 | 3. **高级前端工程师**(5-8年)
51 | - 技术专家,能设计技术方案,指导团队
52 | - 薪资范围:30K-50K
53 |
54 | 4. **前端架构师**(8年以上)
55 | - 负责技术架构设计,技术决策
56 | - 薪资范围:50K-80K+
57 |
58 | 5. **技术总监/CTO**(10年以上)
59 | - 负责整个技术团队的管理和公司技术战略
60 | - 薪资范围:80K-200K+
61 |
62 | ### 管理发展路径
63 | - **技术组长**:负责小团队的技术指导
64 | - **前端经理**:负责前端团队的管理和业务对接
65 | - **技术总监**:负责多个技术团队的管理
66 |
67 | ## 零.1.3.4 如何了解这些信息
68 |
69 | ### 面试前准备
70 | 1. **查看招聘JD**:仔细阅读岗位描述和任职要求
71 | 2. **搜索公司信息**:了解公司的组织架构和技术栈
72 | 3. **咨询内部员工**:通过人脉了解真实情况
73 | 4. **查看技术博客**:了解公司的技术文化和项目
74 |
75 | ### 面试中询问
76 | - "这个岗位具体负责哪些业务线?"
77 | - "团队规模有多大,如何分工协作?"
78 | - "公司的技术栈是什么,有什么技术规划?"
79 | - "这个岗位的晋升机制是怎样的?"
80 |
81 | ## 零.1.3.5 结语
82 |
83 | 了解岗位职责、部门位置和上升空间,不仅能帮助你在面试中表现更好,也能让你对未来的职业发展有更清晰的规划。选择适合自己的岗位和公司,比盲目追求大公司更重要。
84 |
85 |
--------------------------------------------------------------------------------
/1/1.5.4.md:
--------------------------------------------------------------------------------
1 | # 壹.5.4 HTTP和HTTPS的区别在哪里
2 |
3 | ## HTTP和HTTPS的基本概念
4 |
5 | **HTTP**:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。
6 |
7 | **HTTPS**:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入[SSL](https://link.juejin.cn?target=https%3A%2F%2Fso.csdn.net%2Fso%2Fsearch%3Fq%3DSSL%26spm%3D1001.2101.3001.7020)层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
8 |
9 | HTTPS协议的主要作用可以分为两种:
10 | 1. 一种是建立一个信息安全通道,来保证数据传输的安全
11 | 2. 另一种就是确认网站的真实性
12 |
13 | ## 二者的区别
14 |
15 | HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。
16 |
17 | 简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。
18 |
19 | HTTPS和HTTP的区别主要如下:
20 |
21 | 1. **HTTPS协议需要到CA申请证书**,一般免费证书较少,因而需要一定费用
22 | 2. **HTTP是超文本传输协议**,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议
23 | 3. **HTTP和HTTPS使用的是完全不同的连接方式**,用的端口也不一样,前者是80,后者是443
24 | 4. **HTTP的连接很简单,是无状态的**;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全
25 |
26 | ## HTTPS的特点
27 |
28 | ### 优点
29 |
30 | 1. **使用HTTPS协议可认证用户和服务器**,确保数据发送到正确的客户机和服务器
31 | 2. **HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议**,要比HTTP协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性
32 | 3. **HTTPS是现行架构下最安全的解决方案**,虽然不是绝对安全,但它大幅增加了中间人攻击的成本
33 | 4. **谷歌曾在2014年8月份调整搜索引擎算法**,并称"比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高"
34 |
35 | ### 缺点
36 |
37 | 1. **HTTPS协议握手阶段比较费时**,会使页面的加载时间延长近50%,增加10%到20%的耗电
38 | 2. **HTTPS连接缓存不如HTTP高效**,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响
39 | 3. **SSL证书需要钱**,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用
40 | 4. **SSL证书通常需要绑定IP**,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗
41 | 5. **HTTPS协议的加密范围也比较有限**,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行
42 |
43 | ## 实际应用建议
44 |
45 | ### 何时使用HTTP
46 | - 内部网络环境
47 | - 不涉及敏感信息的网站
48 | - 对性能要求极高的场景
49 |
50 | ### 何时使用HTTPS
51 | - 涉及用户隐私的网站(如电商、银行)
52 | - 需要用户登录的网站
53 | - 对安全性要求较高的应用
54 | - 希望获得更好的搜索引擎排名
55 |
56 | ## 结语
57 |
58 | 虽然HTTPS相比HTTP有一些性能上的损失,但在当今网络安全日益重要的环境下,使用HTTPS已经成为最佳实践。对于大多数网站来说,安全性的提升远大于性能的轻微损失。随着技术的不断发展,HTTPS的性能开销也在逐渐减小。
59 |
60 |
--------------------------------------------------------------------------------
/2/2.2.2.md:
--------------------------------------------------------------------------------
1 | # 贰.2.2 分治法、动态规划与贪心算法的区别
2 |
3 | 分治法,动态规划、贪心算法三者之间有类似之处,比如都需要将问题划分为一个个子问题,然后通过解决这些子问题来解决最终问题,但其实这三者之间的区别还是很大的。
4 |
5 | ## **分治法**
6 |
7 | 分治法\(Divide-and-Conquer\) : 将原问题划分成n个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。
8 |
9 | 分治模式在每一层递归上都有三个步骤:
10 |
11 | * 分解\(Divide\):将原问题分解成一系列子问题;
12 | * 解决\(Conquer\):递归地解决各个子问题。若子问题足够小,则直接求解。
13 | * 合并\(Combine\):将子问题的结果合并成原问题的解。
14 |
15 | 合并排序\(Merge Sort\)是一个典型分治法的例子。其对应的直观的操作如下:
16 |
17 | 分解: 将n个元素分成各含n/2个元素的子序列;
18 |
19 | 解决:用合并排序法对两个子序列递归地排序;
20 |
21 | 合并:合并两个已排序的子序列以得到排序结果。
22 |
23 | ## **动态规划**
24 |
25 | 动态规划算法的设计可以分为如下4个步骤:
26 |
27 | * 描述最优解的结构
28 | * 递归定义最优解的值
29 | * 按自底向上的方式计算最优解的值
30 | * 由计算出的结果构造一个最优解
31 |
32 | 分治法是指将问题划分成一些独立的子问题,递归的求解各子问题,然后合并子问题的解而得到原问题的解。与此不同,动态规划适用于子问题独立且重叠的情况,也就是各子问题包含公共的子子问题。在这种情况下,若用分治法则会做许多不必要的工作,即重复地求解公共的子问题。动态规划算法对每个子子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案。
33 |
34 | 适合采用动态规划方法的最优化问题中的两个要素:最优子机构和重叠子问题。
35 |
36 | 最优子机构:如果问题的一个最优解中包含了子问题的最优解,则该问题具有最优子机构。
37 |
38 | 重叠子问题:适用于动态规划求解的最优化问题必须具有的第二个要素是子问题的空间要很小,也就是用来求解原问题的递归算法反复地解同样的子问题,而不是总是在产生新的子问题。对两个子问题来说,如果它们确实是相同的子问题,只是作为不同问题的子问题出现的话,则它们是重叠的。
39 |
40 | In a word, 分治法 —— 各子问题独立;动态规划 —— 各子问题重叠。
41 |
42 | 算法导论: **动态规划要求其子问题既要独立又要重叠,这看上去似乎有些奇怪。虽然这两点要求听起来可能矛盾的,但它们描述了两种不同的概念,而不是同一个问题的两个方面。如果同一个问题的两个子问题不共享资源,则它们就是独立的。对两个子问题俩说,如果它们确实是相同的子问题,只是作为不同问题的子问题出现的话,是重叠的,则它们是重叠**
43 |
44 | ## **贪心算法**
45 |
46 | 对许多最优化问题来说,采用动态规划方法来决定最佳选择有点“杀鸡用牛刀”了,只要采用另一些更简单有效的算法就行了。贪心算法是使所做的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生出一个全局最优解。贪心算法对大多数优化问题来说能产生最优解,但也不一定总是这样的。
47 |
48 | 贪心算法只需考虑一个选择(亦即,贪心的选择);在做贪心选择时,子问题之一必须是空的,因此只留下一个非空子问题。
49 |
50 | 贪心算法与动态规划与很多相似之处。特别地,贪心算法适用的问题也是最优子结构。贪心算法与动态规划有一个显著的区别,就是贪心算法中,是以自顶向下的方式使用最优子结构的。贪心算法会先做选择,在当时看起来是最优的选择,然后再求解一个结果子问题,而不是先寻找子问题的最优解,然后再做选择。
51 |
52 | 贪心算法是通过做一系列的选择来给出某一问题的最优解。对算法中的每一个决策点,做一个当时看起来是最佳的选择。这一点是贪心算法不同于动态规划之处。在动态规划中,每一步都要做出选择,但是这些选择依赖于子问题的解。因此,解动态规划问题一般是自底向上,从小子问题处理至大子问题。贪心算法所做的当前选择可能要依赖于已经做出的所有选择,但不依赖于有待于做出的选择或子问题的解。
53 |
54 | **因此,贪心算法通常是自顶向下地做出贪心选择,不断地将给定的问题实例归约为更小的问题。贪心算法划分子问题的结果,通常是仅存在一个非空的子问题。**
55 |
56 |
--------------------------------------------------------------------------------
/6/6.1.3.md:
--------------------------------------------------------------------------------
1 | # 陆.1.3 开放封闭原则
2 |
3 | ## 01.官方定义
4 |
5 | 开闭原则,英文缩写**OCP**,全称 **Open Closed Principle**。
6 |
7 | 原始定义:
8 |
9 | > Software entities \(classes, modules, functions\) should be open for extension but closed for modification。
10 |
11 | 严谨的翻译:
12 |
13 | > 软件实体(包括类、模块、功能等)应该对扩展开放,但是对修改关闭。
14 |
15 | ## **02.原理解释**
16 |
17 | ### 对扩展开放
18 |
19 | 模块对扩展开放,就意味着需求变化时,可以对模块扩展,使其具有满足那些改变的新行为。换句话说,模块通过扩展的方式去应对需求的变化。
20 |
21 | ### 对修改关闭
22 |
23 | 模块对修改关闭,表示当需求变化时,关闭对模块源代码的修改,当然这里的“关闭”应该是尽可能不修改的意思,也就是说,应该尽量在不修改源代码的基础上面扩展组件。
24 |
25 | ## **03.为什么要“开”和“闭”**
26 |
27 | 一般情况,我们接到需求变更的通知,通常方式可能就是修改模块的源代码,然而修改已经存在的源代码是存在很大风险的,尤其是项目上线运行一段时间后,开发人员发生变化,这种风险可能就更大。所以,为了避免这种风险,在面对需求变更时,我们一般不修改源代码,即所谓的对修改关闭。不允许修改源代码,我们如何应对需求变更呢?答案就是我们下面要说的对扩展开放。
28 |
29 | 通过扩展去应对需求变化,就要求我们必须要面向接口编程,或者说面向抽象编程。所有参数类型、引用传递的对象必须使用抽象(接口或者抽象类)的方式定义,不能使用实现类的方式定义;通过抽象去界定扩展,比如我们定义了一个接口A的参数,那么我们的扩展只能是接口A的实现类。
30 |
31 | ## **04.总结**
32 |
33 | 有一个经验可以快速检验代码是否遵守了该原则:如果我必须打开你某个模块的js文件并进行修改具体代码才能增强该模块的功能,则你写的这个模块无法通过“开放封闭原则”的检验。
34 |
35 | ```javascript
36 | //iceCreamMaker.js
37 | let iceCreamFlavors = ['chocolate', 'vanilla'];//口味
38 | let iceCreamMaker = {
39 | makeIceCream(flavor) {
40 | if (iceCreamFlavors.indexOf(flavor) > -1) {
41 | console.log('您选的口味有货,马上给您做冰激凌。');
42 | } else {
43 | console.log('哎呀,您选的口味我们没有。');
44 | }
45 | },
46 | };
47 | export default iceCreamMaker;
48 | ```
49 |
50 | 如你所见,上面这段代码,不编辑`iceCreamFlavor`数组就无法添加冰淇淋口味!我们来改进一下:
51 |
52 | ```javascript
53 | //iceCreamMaker.js
54 | let iceCreamFlavors = ['chocolate', 'vanilla'];//口味
55 | let iceCreamMaker = {
56 | makeIceCream(flavor) {
57 | if (iceCreamFlavors.indexOf(flavor) > -1) {
58 | console.log('您选的口味有货,马上给您做冰激凌。');
59 | } else {
60 | console.log('哎呀,您选的口味我们没有。');
61 | }
62 | },
63 | //增加口味
64 | addFlavor(flavor) {
65 | iceCreamFlavors.push(flavor);
66 | },
67 | };
68 | export default iceCreamMaker;
69 | ```
70 |
71 | 现在,我们可以在代码中的任何位置调用addFlavor函数,以便添加美味的冰淇淋口味,而无需打开编辑iceCreamMaker.js文件。 确实是可靠的\(solid\)JavaScript,😋 !
72 |
73 | **总之,开放封闭原则可提高软件的可维护性与代码的重用性。**
74 |
75 |
--------------------------------------------------------------------------------
/5/5.3.1.md:
--------------------------------------------------------------------------------
1 | # 伍.3.1 什么是响应式编程?
2 |
3 | **响应式编程简称RP(Reactive Programming)**,是一种面向**异步**(asynchronous)**数据流**(Data Stream)的编程范式。其实,这并不是什么新东西,而是新瓶装旧酒,把编程中常用的[发布-订阅模式](../7/7.1.5.md)发扬光大,然后形成一整套可供我们高效解决问题的编程范式。
4 |
5 | ## 01.什么是数据流(Data Stream\)
6 |
7 | 接上面说的,其实数据流也不是新东西。举个例子,我们在浏览器中单击一个按钮,这个点击事件\(event\)就是一个真正的异步数据流(asynchronous data stream),以下简称流。在这个流里面,你可以观察一些对象,也可以做一些响应处理,总之随你喜好。
8 |
9 | 而且,我们可以把任意东西包装成流,而不限于点击事件、或者鼠标滑过事件。流无处不在,信手拈来,任意东西都可以成为流:变量、用户的操作、属性、缓存、数据结构等等。譬如:假想你的微博首页是一个流,那么你就可以监听它的变化,并且根据需要采取阅读与否的决定(做出响应)。
10 |
11 | 最重要的是,我们将获得令人惊叹的功能工具箱,这个工具箱里面有一系列函数,可以帮助我们组合、创建、过滤这些流。是的,这时候函数式编程就派上用场了。如果不了解函数式编程,可以看本书之前的相关章节。
12 |
13 | 流可以用作另一流的输入, 甚至多个流也可以用作另一个流的输入。 您可以合并两个流。 您可以过滤流以获得另一个只包含您感兴趣的事件的流。您可以将数据值从一个流映射到另一个新流。
14 |
15 | 既然流对于响应式(Reactive)如此重要,那么,让我们从熟悉的“单击按钮”这个事件流开始细致地研究它们。接下来我们看一个图,因为看起来像一颗颗弹珠,通常这类型的图叫弹珠图。
16 |
17 | 
18 |
19 | 如上图,水平从左至右的箭头线表示时间线。流是**按时间顺序排列的一系列进行中的事件**, 它可以含有三种不同的东西:
20 |
21 | * 一个值(是某种类型的)。也就是上图的各色弹珠。
22 | * 一个错误(也可能没有)。也就是上图的红叉。
23 | * 一个“完成”信号(也可能没有)。也就是上图中时间线上的竖线。 例如,当包含该按钮的当前窗口或视图关闭时,可以认为流发出了“完成”信号。
24 |
25 | 接下来,让我们做点有趣的事情:创建从原始点击事件流转换而来的新点击事件流。
26 |
27 | ## 02.流的转换
28 |
29 | 在[函数式编程](5.2.1.md#07-han-zi-functor)我们介绍过带有map方法的函子(比如Array就是函子,实现了map方法)。map方法接受一个函数,让该函数处理函子里面的数据,输出另一个函子。这段说得比较学术化,但其实说白了,就是将原数据通过map转换一下,得到一个新的数据,如此而已。
30 |
31 | 针对流,我们也可以类似的这么做。输入一个流,通过map(等)函数处理一下,变成一个新的流。
32 |
33 | //todo
34 |
35 | ## 03.“我为什么要考虑通过响应式编程解决问题?”
36 |
37 | 上面介绍了一些响应式编程的技术特征,那么响应式编程的必要性是什么呢?可以先简单讲一下。后面再以实例展开叙述。
38 |
39 | 响应式编程提升了代码的抽象层次,让我们可以专注于处理业务逻辑,而不必关注太多细枝末节的事情:比如服务器端数据变化后,前端变量值的实时获取、及时更新其他有关的变量、以及界面的再次渲染。使用响应式编程会让这些细碎的事情变得更简单。
40 |
41 | 在与大量数据事件相关的、UI事件高度交互的现代Web应用程序和移动应用程序中,响应式编程的好处更加明显。10年前,与网页的交互基本上是向后端提交一个form表单,后端处理好之后,再向前端执行“粗暴的”渲染逻辑以呈现变化。现代的应用程序已经变得更加实时:修改单个表单字段可以自动触发到后端的保存,对某些内容的“点赞”可以实时反映给其他已连接的用户……等等。
42 |
43 | 如今,现代应用程序具有各种实时事件,可以为用户带来高度交互的体验。我们需要适当处理这些问题的工具,而响应式编程就是一个不错的选项。
44 |
45 | ## 参考文献
46 |
47 | {% hint style="info" %}
48 | [https://gist.github.com/staltz/868e7e9bc2a7b8c1f754](https://gist.github.com/staltz/868e7e9bc2a7b8c1f754)
49 | {% endhint %}
50 |
51 |
--------------------------------------------------------------------------------
/6/6.1.4.md:
--------------------------------------------------------------------------------
1 | # 陆.1.4 里氏替换原则
2 |
3 | ## 01.什么是里氏替换原则
4 |
5 | 里氏替换原则\(Liskov Substitution Principle LSP\)面向对象设计的基本原则之一。
6 |
7 | > 里氏替换原则中说,任何基类可以出现的地方,子类一定可以出现。
8 |
9 | LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
10 |
11 | 我们一般对里氏替换原则 LSP 的解释为:
12 |
13 | > **子类对象能够替换父类对象,而程序逻辑不变。**
14 |
15 | ## 02.里氏替换原则的两种含义:
16 |
17 | ### 1\).含义一
18 |
19 | 里氏替换原则是针对继承而言的,如果继承是为了实现代码重用,也就是为了共享方法,那么共享的父类方法就应该保持不变,不能被子类重新定义。子类只能通过新添加方法来扩展功能,父类和子类都可以实例化,而子类继承的方法和父类是一样的,父类调用方法的地方,子类也可以调用同一个继承得来的,逻辑和父类一致的方法,这时用子类对象将父类对象替换掉时,当然逻辑一致,相安无事。
20 |
21 | ### 2\).含义二
22 |
23 | 如果继承的目的是为了多态,而多态的前提就是子类覆盖并重新定义父类的方法,为了符合LSP,我们应该将父类定义为抽象类,并定义抽象方法,让子类重新定义这些方法,当父类是抽象类时,父类就是不能实例化,所以也不存在可实例化的父类对象在程序里。也就不存在子类替换父类实例(根本不存在父类实例了)时逻辑不一致的可能。
24 |
25 | 不符合LSP的最常见的情况是,父类和子类都是可实例化的非抽象类,且父类的方法被子类重新定义,这一类的实现继承会造成父类和子类间的强耦合,也就是实际上并不相关的属性和方法牵强附会在一起,不利于程序扩展和维护。
26 |
27 | 在面向对象编程领域,根据我的经验可以总结一句话 :**“** **尽量不要从可实例化的父类中继承,而是要使用基于抽象类和接口的继承”。**
28 |
29 | ## **03.JavaScript代码示例**
30 |
31 | 在JavaScript领域,因为JavaScript实在太“宽松”了,几乎想怎么写就怎么写,所以并不是特别好演示里氏替换原则。这里用一个简单的例子来粗浅地演示一下:
32 |
33 | ```javascript
34 | //父类
35 | class Shape {
36 | get area() {
37 | return 0;
38 | }
39 | }
40 |
41 | //子类
42 | class Rectangle extends Shape {
43 | constructor(length, width) {
44 | super();
45 | this.length = length;
46 | this.width = width;
47 | } get area() {
48 | return this.length * this.width;
49 | }
50 | }
51 | //子类
52 | class Square extends Shape {
53 | constructor(length) {
54 | super();
55 | this.length = length;
56 | } get area() {
57 | return this.length ** 2;
58 | }
59 | }
60 | //子类
61 | class Circle extends Shape {
62 | constructor(radius) {
63 | super();
64 | this.radius = radius;
65 | } get area() {
66 | return Math.PI * (this.radius ** 2);
67 | }
68 | }
69 |
70 | //这里是父类hape的数组,但是数组具体的项存放的是子类的实例
71 | const shapes = [
72 | new Rectangle(1, 2),
73 | new Square(1, 2),
74 | new Circle(2),
75 | ]
76 |
77 | for (let s of shapes) {
78 | //本来要调用父类的area,但是现在调用子类的area。
79 | //即使调用子类的area,也不会影响软件的整体功能。
80 | //也即“子类对象能够替换父类对象,而程序逻辑不变”。
81 | console.log(s.area);
82 | }
83 | ```
84 |
85 | \*\*\*\*
86 |
87 |
--------------------------------------------------------------------------------
/1/1.2.14.md:
--------------------------------------------------------------------------------
1 | ---
2 | description: 一线互联网公司几乎都在推行模块化开发
3 | ---
4 |
5 | # 壹.2.14 模块化开发
6 |
7 | ## 壹.2.14.1 老一辈前端工程师如何实现模块化
8 |
9 | 在 ECMAScript 6 出现之前,JavaScript语言没有内建支持模块化的语法,这导致前端开发复杂Web应用的时候,引用.js、组织文件、扩展功能、维护工程都显得效率低下,而且流程繁琐。然而对于一个复杂的Web应用,模块化编程可以良好的工作分工、功能扩展、工程维护,是软件开发方法论里面最基本的需求。那时候老一辈前端工程师们可以使用 IIFE 函数来实现模块化,很多库比如jQuery是这样实现的。
10 |
11 | ```javascript
12 | let module = (function() {
13 | var _version = "1.0";
14 | var _name = "a-nice-module";
15 |
16 | function _log(x) {
17 | console.log(x);
18 | }
19 |
20 | function say(s) {
21 | _log(s);
22 | }
23 |
24 | return {
25 | name: _name,
26 | say: say
27 | };
28 | })();
29 |
30 | console.log(module._version);//>> undefined
31 | console.log(module._log);//>> undefined
32 | console.log(module.name); //>> a-nice-module
33 | module.say("hello"); //>> hello
34 | ```
35 |
36 | **模块本质上是封装,把模块内可访问的和不可以访问的区分得清清楚楚**。如上示例,模块之外是无法访问到模块内部的私有属性`_version`和私有方法`_log`的;而以一个对象的属性和方法的形式暴露内部属性`_name`和方法`say(s)`之后,然后将该对象返回给模块外部的调用者,那么在模块外部就可以访问它们了。
37 |
38 | ECMAScript 6 吸收了老一辈前端工程师的各种优秀思想,最终采用了`import`和`export`内建语法支持模块化开发,基于浏览器底层的实现,使前端的模块化开发变得空前地规范和有效率起来,模块化开发终于迎来了应用热潮。
39 |
40 | ## 壹.2.14.2 AMD 和 CommonJS
41 |
42 | //todo
43 |
44 | ## 壹.2.14.3 ECMAScript 6 的模块化
45 |
46 | ### 1.模块里的变量是以引用形式传递的
47 |
48 | 模块内变量的改变会同步到外面,说明是模块是以引用类型传递的,也即引用模块时,模块外层再包了一层对象,变量以该对象的属性传递过去。举例说明如下:
49 |
50 | ```javascript
51 | ///////////////// module.js //////////////////////
52 |
53 | let m = 0;
54 | setTimeout(() => {
55 | m = 1;
56 | }, 1000);
57 | export function getM() {
58 | return m;
59 | }
60 | ```
61 |
62 | 上面代码相当于传递下面的对象,其中\_m表示私有属性m
63 |
64 | ```javascript
65 | {
66 | _m:0,
67 | getM:function(){
68 | return this._m;
69 | }
70 | }
71 | ```
72 |
73 | 下面为入口文件 index.js :
74 |
75 | ```javascript
76 | /////////////// index.js //////////////////////////
77 |
78 | import {getM} from "./module.js";
79 | setTimeout(()=>{
80 | console.log(getM());
81 | });
82 | setTimeout(()=>{
83 | console.log(getM());
84 | },2000);
85 | //>> 0
86 | //>> 1
87 | ```
88 |
89 | ### 2.模块嵌套
90 |
91 | 有些书籍称之为模块的继承,继承是面向对象编程的概念,本书更愿意称之为**嵌套**。
92 |
93 | //todo
94 |
95 |
--------------------------------------------------------------------------------
/3/3.1.2.md:
--------------------------------------------------------------------------------
1 | # 叁.1.2 React、Vue和Angular对比
2 |
3 | ## 1. React VS Vue
4 |
5 | > React 的哲学是:**如无必要,勿增实体**。
6 | >
7 | > Vue 的哲学是:什么好用,给你什么。
8 | > Vue 会自动帮你绑定 this,React 不会,因为 JS 能做;
9 | > Vue 会自动帮你合并 class 和 style,React 不会,因为 JS 能做;
10 | > Vue 会给你的 data 创建 getter/setter,React 不会,因为 JS 能做;
11 | > Vue 会给你提供 v-if / v-for / v-show,React 不会,因为 JS 能做;
12 | > Vue 会给你提供 computed / watch / methods,React 不会,因为 JS 能做。
13 | >
14 | > 那么 React 到底提供了什么?
15 | > **只提供了一条让你用原生 JS 解决所有 UI 问题的途径。**
16 | >
17 | > 很多新人反馈:
18 | > Vue 用久了,好像不会写高级的 JS 了,只会一些简单的,居然就能完成工作。
19 | > 而 React 用久了,就发现 JS 的语法特性真多啊,学都学不过来。
20 |
21 | by [方应杭](https://www.zhihu.com/question/314428335/answer/644922545)
22 |
23 | ## 2. React VS Angluar
24 |
25 | > 你会发现 Angular 在逐渐的弥补自身框架的不足,其他框架也在弥补他们自身的不足,他们都在互相吸取,互相学习,大家最终会越来越趋同。
26 | >
27 | > 喜欢装饰器,Class Component,Service Class 风格的,可以选择 Angular。
28 | >
29 | > 喜欢纯函数,Function Component,Hooks 的,可以选择 React。
30 | >
31 | > 没有啥偏好的使用 Vue,想用啥用啥。
32 |
33 | by [徐海峰](%20https://www.zhihu.com/question/355760849/answer/938934606)
34 |
35 | > Angular 的初始曲线对于搞 java 的人来说确实不高,因为那一套概念都是 java 里面有的,而且搞 java 的都已经习惯繁琐了。但是对于不搞 java 的人来说,就很烦了,更关键的是在我看来前端根本就不应该学 java 那一套。
36 | >
37 | > Angular 的后续曲线也不低,因为它的可优化性比较糟糕,以至于你不理解它的内部运作原理就很难避免各种性能坑。
38 |
39 | > React 上手的曲线也看人。对于习惯了服务端模板的人来说,要接受 JSX 是一个挑战;但是对于搞函数式的人来说,简直就是太自然了,因为 JSX 能让你把模板看做一个纯函数。过了这个坎后上手写两个例子,React 还是相对简单的。但是这也是个假象。接下来要搞『正经』的 React 应用了,突然出现了 Node,CommonJS, Webpack 一堆东西。写过 Node 的人会觉得哦哦,太自然了。没接触过 Node 的人就像没接触过 java 的人初学 Angular 一样:这些都是什么鬼。再往下,终于把构建环境搭好了,这时候你会发现 React 文档里的东西你已经也基本看完了,你以为你这就叫『学会 React』了?其实这时候你还是不知道怎么用 React 写一个应用,因为 React 本身不管这些事情,所以你要开始跳入 React 社区的大坑,开始学习 react-router, react-hot-reload, Flux 及其 N 种实现 \([voronianski/flux-comparison · GitHub](https://link.zhihu.com/?target=https%3A//github.com/voronianski/flux-comparison)\) , CSS in JS 及其 N 种实现 \([https://github.com/MicheleBertoli/css-in-js](https://link.zhihu.com/?target=https%3A//github.com/MicheleBertoli/css-in-js)\),Immutable-js, GraphQL, Relay... 还有 context 这种大家都在用但是没有官方文档的功能...(现在终于有文档了)用 Redux 又开始一堆概念了,actions, action creators, reducers, containers, higher order components... 然后现在又开始配着 generator 搞 redux-saga,搞着搞着你可能还会被 Clojure/Elm 吸引过去,跳入函数式的大坑... 这个曲线比起 Angular,只能说有过之而无不及... 当然,因为学习过程中多了很多可以用来装逼的资本,还是有一定的激励效果的,不像 Angular 学了半天也没什么能吹的。
40 |
41 | by [尤雨溪](%20https://www.zhihu.com/question/35767399/answer/64496760)
42 |
43 |
--------------------------------------------------------------------------------
/2/2.1.6.md:
--------------------------------------------------------------------------------
1 | # 贰.1.6 分治法、动态规划与贪心算法的区别
2 |
3 | 分治法,动态规划、贪心算法三者之间有类似之处,比如都需要将问题划分为一个个子问题,然后通过求解子问题来得到最终解,但其实这三者之间的区别还是很大的。
4 |
5 | ## **01.分治法**
6 |
7 | 分治法\(Divide-and-Conquer\) : 将原问题划分成n个规模较小而结构、且与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解。
8 |
9 | 分治模式在每一层递归上都有三个步骤:
10 |
11 | * 分解\(Divide\):将原问题分解成一系列子问题;
12 | * 解决\(Conquer\):递归地解决各个子问题。若子问题足够小,则直接求解。
13 | * 合并\(Combine\):将子问题的结果合并成原问题的解。
14 |
15 | [快速排序](2.1.1.md#kuai-su-pai-xu)是一个典型分治法的例子。
16 |
17 | ## **02.动态规划**
18 |
19 | 动态规划算法的设计可以分为如下4个步骤:
20 |
21 | * 描述最优解的结构
22 | * 递归定义最优解的值
23 | * 按自底向上的方式计算最优解的值
24 | * 由计算出的结果构造一个最优解
25 |
26 | 分治法是指将问题划分成一些独立的子问题,递归的求解各子问题,然后合并子问题的解而得到原问题的解。与此不同,动态规划适用于子问题独立且**重叠**的情况,也就是各子问题包含公共的子子问题。在这种情况下,若用分治法则会做许多不必要的工作,即重复地求解公共的子问题。动态规划算法对每个子子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案。
27 |
28 | 适合采用动态规划方法的最优化问题中的两个要素:最优子机构和重叠子问题。
29 |
30 | **最优子机构:**如果问题的一个最优解中包含了子问题的最优解,则该问题具有最优子机构。
31 |
32 | **重叠子问题:**子问题的空间要很小,也就是用来求解原问题的递归算法反复地解同样的子问题,而不是总是在产生新的子问题。对两个子问题来说,如果它们确实是相同的子问题,只是作为不同问题的子问题出现的话,则它们是重叠的。
33 |
34 | **一句话总结分治法与动态规划的区别: 分治法 —— 各子问题独立;动态规划 —— 各子问题重叠。**
35 |
36 | 引自《算法导论》:
37 |
38 | > 动态规划要求其子问题既要独立又要重叠,这看上去似乎有些奇怪。虽然这两点要求听起来可能矛盾的,但它们描述了两种不同的概念,而不是同一个问题的两个方面。如果同一个问题的两个子问题不共享资源,则它们就是独立的。对两个子问题来说,如果它们确实是相同的子问题,只是作为不同问题的子问题出现的话,是重叠的,则它们是重叠。
39 |
40 | ### 延伸阅读(建议必读)
41 |
42 | {% hint style="info" %}
43 | 1\) [司徒正美讲动态规划:Javascript背包问题详解](https://segmentfault.com/a/1190000012829866)
44 |
45 | 2\)[【动态规划】三种背包问题(01背包、完全背包、多重背包)](https://blog.csdn.net/sinat_30973431/article/details/85119871)
46 | {% endhint %}
47 |
48 | ### **华为实战题**
49 |
50 | > **有一座独木桥,长度为L,青蛙每跳一次的最大距离为M,最小距离为S,桥上有N个石墩,石墩不会落在两端只在桥中间,桥墩位置数组为Postions,青蛙很不喜欢站在石墩上。问:青蛙最少要几步能过桥,而且满足落在石墩上的次数最少。**
51 | >
52 | > 举例输入:L=10,S=1,M=3,N=5,Positions=\[2,4,5,7,9\]
53 | > 应该输出:2
54 |
55 | //todo
56 |
57 | ## **03.贪心算法**
58 |
59 | 对许多最优化问题来说,采用动态规划方法来决定最佳选择有点“杀鸡用牛刀”了,只要采用另一些更简单有效的算法就行了。贪心算法是使所做的选择**看起来都是当前最佳的**,期望通过所做的局部最优选择来产生出一个全局最优解。贪心算法对大多数优化问题来说能产生最优解,但也不一定总是这样的。
60 |
61 | 贪心算法只需考虑一个选择(亦即,贪心的选择);在做贪心选择时,子问题之一必须是空的,因此只留下一个非空子问题。
62 |
63 | 贪心算法与动态规划与很多相似之处。特别地,贪心算法适用的问题也是最优子结构。贪心算法与动态规划有一个显著的区别,就是贪心算法中,是以自顶向下的方式使用最优子结构的。贪心算法会先做选择,这个选择在当时看起来是最优的,然后再求解一个结果子问题;而不是先寻找子问题的最优解,然后再做选择。
64 |
65 | 贪心算法是通过做一系列的选择来给出某一问题的最优解。对算法中的每一个决策点,做一个当时看起来是最佳的选择。这一点是贪心算法不同于动态规划之处。在动态规划中,每一步都要做出选择,但是这些选择依赖于子问题的解。因此,解动态规划问题一般是自底向上,从小子问题处理至大子问题。贪心算法所做的当前选择可能要依赖于已经做出的所有选择,但不依赖于有待于做出的选择或子问题的解。
66 |
67 | **因此,贪心算法通常是自顶向下地做出贪心选择,不断地将给定的问题实例归约为更小的问题。贪心算法划分子问题的结果,通常是仅存在一个非空的子问题。**
68 |
69 |
--------------------------------------------------------------------------------
/0/0.1.2.md:
--------------------------------------------------------------------------------
1 | # 零.1.2 该公司是做什么的,实力怎么样,前景如何,口碑怎样?
2 |
3 | 知己知彼,百战不殆。在打算寻求入职某家一线互联网公司之前,多打听一下该公司背景情况,充分做好准备,以便面试时不慌。
4 |
5 | ## 零.1.2.1 用词条筛选一遍
6 |
7 | 比如我想要面试“字节跳动\(bytedance\)”,就会可以进百度APP搜索“字节跳动”,一般一线互联网企业都有专人维护自己的百度百科词条,而该词条内容是否丰富,体现这个企业是否有足够的人力去维护企业形象。词条内容越丰富越具体,说明该公司很重视企业形象,属于实力强大的特征之一。
8 |
9 |
|
13 |
14 |
15 | |
19 |
20 |
21 |
22 | |
26 |
|---|---|
| 字节跳动-百度百科 | 31 |词条信息有专人维护 | 33 |