Skip to content

Commit 39c2d4a

Browse files
committed
update utils and add interview
1 parent c772543 commit 39c2d4a

File tree

5 files changed

+201
-5
lines changed

5 files changed

+201
-5
lines changed

book/designPractice

-1
This file was deleted.

book/structuresAlgorithms

-1
This file was deleted.

interview/questions/questions.js

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* @Author: [email protected]
3+
* @Date: 2019-04-01 22:22:06
4+
* @Last Modified by: [email protected]
5+
* @Last Modified time: 2019-04-02 00:46:04
6+
*/
7+
8+
/**
9+
* 从面试中发现自己的问题所在,不断总结,不断进步
10+
* 1: vue-router实现原理?
11+
* 2: 遍历数组,指定条件下跳出循环,不用for,如何做?
12+
* 3: 基本数据类型
13+
* 4: 原型链
14+
* 5: 闭包
15+
* 6: vue双向数据绑定实现原理
16+
* 7: 深拷贝和浅拷贝的区别,及如何实现?
17+
* 深拷贝:不仅将原对象的各个属性逐个复制,而且将原对象各个属性包含的对象也依次采用深复制的方法递归复制到新对象上
18+
* 浅拷贝:只会将对象的属性依次进行复制,不会递归复制
19+
* 8: Vue导航守卫
20+
* 9: $nextTick()
21+
* 10: 有哪些攻击方式
22+
* 11: http1和http2有哪些不同
23+
* 12: vue中虚拟DOM是什么东西
24+
* 13: querySelectAll()与document.getElementsByClassName()有什么区别
25+
* 1: W3C标准,querySelectAll()是W3C中Selectors的API规范[1],getElementsBy系列属于W3C的DOM规范[2]
26+
* 2: 浏览器兼容,querySelectAll()已被IE 8+、FF 3.5+、Safari 3.1+等良好支持,getElementsBy系列要IE9以上
27+
* 3: 接收参数,querySelectAll()接收的参数是一个CSS选择器,getElementsBy系列只能是单一的className、tagName 和 name,如
28+
* document.querySelectorAll('#header')/document.getElementById('header')
29+
* 4: 返回值,querySelectAll()返回Static Node List(包括Element,Text和Comment),getElementsBy系列返回一个Live Node List(只包括element节点)
30+
* 14: CSS3了解多少
31+
* 15: js垃圾回收机制
32+
* 16: 元素垂直剧中有几种实现方式?
33+
* 17: 性能优化方式有哪些?
34+
*/
35+
36+
// 对象深拷贝
37+
const deepCopy = obj => {
38+
let objArr = Array.isArray(obj) ? [] : {}
39+
if (obj && typeof obj === 'object') {
40+
for (const key in obj) {
41+
if (obj.hasOwnProperty(key)) {
42+
const e = obj[key]
43+
if (e && typeof e ==='object') {
44+
objArr[key] = deepCopy(e)
45+
} else {
46+
objArr[key] = e
47+
}
48+
}
49+
}
50+
}
51+
return objArr
52+
}
53+
54+
const obj = {
55+
name: 'tiny',
56+
age: 20,
57+
option: function () {
58+
this.name
59+
},
60+
action: {
61+
write: function () {
62+
return 'coding'
63+
},
64+
read: function () {
65+
return 'talk each other'
66+
}
67+
}
68+
}
69+
console.log(obj)
70+
console.log(deepCopy(obj))
+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* @Author: [email protected]
3+
* @Date: 2019-04-01 22:22:06
4+
* @Last Modified by: [email protected]
5+
* @Last Modified time: 2019-04-02 00:46:04
6+
*/
7+
8+
/**
9+
* 从面试中发现自己的问题所在,不断总结,不断进步
10+
* 1: vue-router实现原理?
11+
* 2: 遍历数组,指定条件下跳出循环,不用for,如何做?
12+
* 3: 基本数据类型
13+
* 4: 原型链
14+
* 5: 闭包
15+
* 6: vue双向数据绑定实现原理
16+
* 7: 深拷贝和浅拷贝的区别,及如何实现?
17+
* 深拷贝:不仅将原对象的各个属性逐个复制,而且将原对象各个属性包含的对象也依次采用深复制的方法递归复制到新对象上
18+
* 浅拷贝:只会将对象的属性依次进行复制,不会递归复制
19+
* 8: Vue导航守卫
20+
* 9: $nextTick()
21+
* 10: 有哪些攻击方式
22+
* 11: http1和http2有哪些不同
23+
* 12: vue中虚拟DOM是什么东西
24+
* 13: querySelectAll()与document.getElementsByClassName()有什么区别
25+
* 1: W3C标准,querySelectAll()是W3C中Selectors的API规范[1],getElementsBy系列属于W3C的DOM规范[2]
26+
* 2: 浏览器兼容,querySelectAll()已被IE 8+、FF 3.5+、Safari 3.1+等良好支持,getElementsBy系列要IE9以上
27+
* 3: 接收参数,querySelectAll()接收的参数是一个CSS选择器,getElementsBy系列只能是单一的className、tagName 和 name,如
28+
* document.querySelectorAll('#header')/document.getElementById('header')
29+
* 4: 返回值,querySelectAll()返回Static Node List(包括Element,Text和Comment),getElementsBy系列返回一个Live Node List(只包括element节点)
30+
* 14: CSS3了解多少
31+
* 15: js垃圾回收机制
32+
* 16: 元素垂直剧中有几种实现方式?
33+
* 17: 性能优化方式有哪些?
34+
*/
35+
36+
// 对象深拷贝
37+
const deepCopy = obj => {
38+
let objArr = Array.isArray(obj) ? [] : {}
39+
if (obj && typeof obj === 'object') {
40+
for (const key in obj) {
41+
if (obj.hasOwnProperty(key)) {
42+
const e = obj[key]
43+
if (e && typeof e ==='object') {
44+
objArr[key] = deepCopy(e)
45+
} else {
46+
objArr[key] = e
47+
}
48+
}
49+
}
50+
}
51+
return objArr
52+
}
53+
54+
const obj = {
55+
name: 'tiny',
56+
age: 20,
57+
option: function () {
58+
this.name
59+
},
60+
action: {
61+
write: function () {
62+
return 'coding'
63+
},
64+
read: function () {
65+
return 'talk each other'
66+
}
67+
}
68+
}
69+
console.log(obj)
70+
console.log(deepCopy(obj))

utils.js

+61-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @Author: jrg
33
* @Date: 2018-12-27 14:11:49
44
* @Last Modified by: [email protected]
5-
* @Last Modified time: 2019-03-13 23:49:15
5+
* @Last Modified time: 2019-04-02 00:41:39
66
*/
77

88
/**
@@ -43,7 +43,7 @@ const intersection = (a, b) => {
4343
const similarity = (arr, values) => arr.filter(v => values.includes(v))
4444

4545
// 去重
46-
const uniqueValue = arr => [...new Set(arr)];
46+
const uniqueValue = arr => [...new Set(arr)]
4747

4848
// 取第n倍个元素(按下标)
4949
const everyNth = (arr, nth) => arr.filter((e, i) => i % nth === 0)
@@ -174,6 +174,24 @@ const objectFromPairs = arr => arr.reduce((a, v) => (a[v[0]] = v[1], a), {})
174174
// 从对象创建键值对数组的数组
175175
const objectToPairs = obj => Object.keys(obj).map( k => [k, obj[k]])
176176

177+
// 对象深拷贝
178+
const deepCopy = obj => {
179+
let objArr = Array.isArray(obj) ? [] : {}
180+
if (obj && typeof obj === 'object') {
181+
for (const key in obj) {
182+
if (obj.hasOwnProperty(key)) {
183+
const e = obj[key]
184+
if (e && typeof e ==='object') {
185+
objArr[key] = deepCopy(e)
186+
} else {
187+
objArr[key] = e
188+
}
189+
}
190+
}
191+
}
192+
return objArr
193+
}
194+
177195
/**
178196
* String
179197
*/
@@ -466,6 +484,44 @@ const throttle = (fn, time) => {
466484
}, time)
467485
}
468486

487+
// cookie
488+
const cookieOption = {
489+
_get: (name) => {
490+
let cookieName = encodeURIComponent(name) + '='
491+
let cookieStart = document.cookie.indexOf(cookieName)
492+
let cookieValue = null
493+
let cookieEnd = ''
494+
495+
if(cookieStart > -1) {
496+
cookieEnd = document.cookie.indexOf(';', cookieStart)
497+
if(cookieEnd == -1) {
498+
cookieEnd = document.cookie.length
499+
}
500+
cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd))
501+
}
502+
return cookieValue
503+
},
504+
_set: (name, value, expires, path, domain, secure) => {
505+
let cookieText = encodeURIComponent(name) + '=' + encodeURIComponent(value)
506+
if(expires instanceof Date) {
507+
cookieText += '; expires=' + expires.toGMTString()
508+
}
509+
if(path) {
510+
cookieText += '; path=' + path
511+
}
512+
if(domain) {
513+
cookieText += '; domain=' + domain
514+
}
515+
if(secure) {
516+
cookieText += '; secure'
517+
}
518+
document.cookie = cookieText
519+
},
520+
_unset: (name, path, domain, secure) => {
521+
this._set(name, '', new Date(0), path, domain, secure)
522+
}
523+
}
524+
469525
export default {
470526
validateCardID,
471527
getSomeDay,
@@ -536,5 +592,7 @@ export default {
536592
validUserName,
537593
validURL,
538594
validCarNum,
539-
validBankNum
595+
validBankNum,
596+
cookieOption,
597+
deepCopy
540598
}

0 commit comments

Comments
 (0)