人一生必须要去的3个地方
通常有人说一个人一生最好经常去三个地方看看,人生感悟会提高一个档次,人生观,价值观乃至世界观,都会有一个质的飞跃。这三个地方就是:托儿所、殡仪馆、监狱。 常去托儿所,看到天真烂漫、童真无邪、活泼可爱的孩子们,会更加的体会到生命的重要和可爱,从而更加珍惜生命,热爱生活,激发出更多积极向上的人生志向。 常去殡仪馆,看到撒手人寰逝去的人们,会感受到,人赤条条来,赤条条去,人为财死,鸟为食亡,是多么的狭隘和自私,心胸会豁然开朗,,不会在为鸡毛蒜皮的小事斤斤计较,退一步海阔天空,让三分心平气和。会更加的领会人生的价值所在,让人生更具异彩。 常去监狱,看到无论是过去高官还是贫民百姓,进到监狱没有了姓名,只有号码,一律囚服,进出报告,极大的限制了人身自由,天高任鸟飞,海阔凭鱼跃的现实已经成为梦中的理想。自古就有人犯王法身无主,因此也就会更加的洁身自好,以人为镜,严于律己。守法度者为幸福,世上本没有绝对的自由,遵守了,习惯了,适应了也就自由了。
reacti18next实践
安装依赖
1 | yarn add react-i18next i18next i18next-browser-languagedetector |
配置多语言JSON
1 | // en-us.json |
定义i18n.tsx
1 | import LanguageDetector from 'i18next-browser-languagedetector'; |
主文件引用
1 | import React from 'react' |
使用方式
1 | import React from 'react' |
npm总结
一. package.json 解读
1 | { |
package.json
在 node 和 npm 环节都要使用,node 在调用 require
的时候去查找模块,会按照一个次序去查找,package.json
会是查找中的一个环节。npm 用的就比较多,其中的 dependencies
字段就是本模块的依赖的模块清单。每次npm update
的时候,npm会自动的把依赖到的模块也下载下来。当npm install
本模块的时候,会把这里提到的模块都一起下载下来。通过package.json,就可以管理好模块的依赖关系。
关于更多规范,请看官方npm-package.json
linux安装mongodb及常见命令
收集有用的网站
你所不知道的前端冷门小知识(长期更新)
void
void其实是javascript中的一个函数,接受一个参数,返回值永远是undefined void expression
1 | void 0 |
面试题整理归纳
字符串扩展的方法
- includes():返回布尔值,表示是否找到了参数字符串。数组也可以 a[1]=1 且能判断undefined
1
2
3
4
5
6var a=[1,2,3]
a[4]=5 // [1, 2, 3, undefined × 1, 5] empty
// a[3]=undefined [1, 2, 3, undefined, 5]
a.indexOf(undefined) // -1
a.includes(undefined) // true - startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
1
2
3
4
5
6// polyfill
if (String.prototype.startsWith) {
String.prototype.startsWith = function (search, index) {
return this.substr((!index || index < 0) ? 0 : index, search.length) === search;
}
} - endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。 str | index
- repeat():返回一个新字符串,表示将原字符串重复n次。参数如果是小数,会被取整(不四舍五入)。参数是负数或者Infinity,会报错。0/NaN返回空字符串,参数是字符串,则会先转换成数字,不传则为空字符串。
- padStart():头部补全。
- padEnd():尾部补全如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。默认使用空格
1
2
3
4
5'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'
vue面试题记录
vue 双向绑定的原理
采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调,实现视图刷新。
具体流程: Vue中先遍历data选项中所有的属性(发布者)用Object.defineProperty劫持这些属性将其转为getter/setter。读取数据时候会触发getter。修改数据时会触发setter。
然后给每个属性对应new Dep(),Dep是专门收集依赖、删除依赖、向依赖发送消息的。先让每个依赖设置在Dep.target上,在Dep中创建一个依赖数组,先判断Dep.target是否已经在依赖中存在,不存在的话添加到依赖数组中完成依赖收集,随后将Dep.target置为上一个依赖。
组件在挂载过程中都会new一个Watcher实例。这个实例就是依赖(订阅者)。Watcher第二参数是一个函数,此函数作用是更新且渲染节点。在首次渲染过程,会自动调用Dep方法来收集依赖,收集完成后组件中每个数据都绑定上该依赖。当数据变化时就会在setter中通知对应的依赖进行更新。在更新过程中要先读取数据,就会触发Wacther的第二个函数参数。一触发就再次自动调用Dep方法收集依赖,同时在此函数中运行patch(diff运算)来更新对应的DOM节点,完成了双向绑定。
- 每一个组件默认都会创建一个 Watcher,自定义的 watch 和 computed 方法也会创建 Watcher
Object.defineProperty()实现双向绑定的缺点
- 只能监听某个属性,不能监听整个对象
- 需要使用for in遍历对象属性绑定监听
- 不能监听数组,需要重写数组方法进行特异性操作
- 会污染原对象