InterviewMap/CS-Interview-Knowledge-Map

Chinese Dicuss

KieSun opened this issue · 44 comments

For Chinese developers to discuss.
提供给中文开发者讨论问题

Great

good job

@KieSun 是否有计划添加一些关于 nodejs 和设计模式的知识点。

@cobish 设计模式会写,node 暂时没有计划

@KieSun 期待设计模式 ing

点个赞,帮助很大。如果图片可以支持放大就更好了, 某些图片字体过小,导致看不清

hipi commented

虽然 node 暂时没有计划 ,但还是很期待

数据结构二叉树的排名那里_select函数中if函数的判断条件应该是size > k - 1,当size = k -1时返回node。
因为要找第三大的数,左边size为2,要找的数才是它本身。

在 前端/js/typeof 下
有一段这样的代码

let a
// 我们也可以这样判断 undefined
a === undefined
// 但是 undefined 保留字,能够在低版本浏览器被赋值
let undefined = 1
// 这样判断就会出错
// 所以可以用下面的方式来判断,并且代码量更少
// 因为 void 后面随便跟上一个组成表达式
// 返回就是 undefined
a === void 0

最后的 a===void 0
应该改为 a = void 0

@Flying-Snail 代码没问题

@dekura 这里的目的就是为了判断a的值是否是undefined,=不就是a被赋值为undefined了么

@KieSun 额,node中的size是包含node本身的大小。比如有5个数,左子树3个,右子数1个。现在k为3,size取的是左子树的大小也就是3.这个时候是我们需要的节点是在左边,但是因为size=k,代码中的情况是返回root节点本身的。

@Flying-Snail 首先 select 是查找第几小的函数,第几小从 0 开始,所以当你有 5 个数分别为 7,1,3,4,8 时,依次排序为 1,3,4,7,8,从 0 开始排序,所以 select(3) 的答案为 7 ,也就是根节点

@KieSun 这个查找是从0开始的啊。。。

@Flying-Snail 恩,你可以阅读下算法(第四版),毕竟人家是权威。

@KieSun 好的~

// 但是 undefined 保留字,能够在低版本浏览器被赋值

应该说undefined不是保留字吧?

@Techiu undefined不是保留字,它是内置对象。只不过后来被设置了只读属性。

总结的很好,点个赞

class MyDate extends Date {
test() {
return this.getTime()
}
}
let myDate = new MyDate()
myDate.test()
这个我试了 在chrome里面没问题

想了半天下面的reduce的返回数组为什么要多加一个[]呢?

const flattenDeep = (arr) => Array.isArray(arr)
  ? arr.reduce( (a, b) => [...flattenDeep(a), ...flattenDeep(b)] , [])
  : [arr]

flattenDeep([1, [[2], [3, [4]], 5]])

@Hasaki1997 数组是给 reduce 用的

说些题外话,代码写得好的大神,写起中文来也是非常厉害,一句话能写出四个语法错误(位于https://yuchengkai.cn/docs/about/):

求职:如果你能提供一份杭州不错的前端岗位机会,可以联系我的邮箱

  1. “如果”+句子, 逗号后应是另一个句子。
  2. “联系我的邮箱”?
  3. “一份机会”?
  4. (“杭州不错的前端岗位”)“机会”, 有“的”字的形容词通常放在没有“的”字的前面。

好吧,我承认我也经常犯这样的错误。

@AquaJerry 真的给大佬跪了😂

@AquaJerry 6的不行

@KieSun ,请问在 https://yuchengkai.cn/docs/zh/frontend/#this ,这个例子中

function foo() {
	console.log(this.a)
}
var a = 2
foo()

var obj = {
	a: 2,
	foo: foo
}
obj.foo()

// 以上两者情况 `this` 只依赖于调用函数前的对象,优先级是第二个情况大于第一个情况

// 以下情况是优先级最高的,`this` 只会绑定在 `c` 上,不会被任何方式修改 `this` 指向
var c = new foo()
c.a = 3
console.log(c.a)

// 还有种就是利用 call,apply,bind 改变 this,这个优先级仅次于 new

第一个 a 是不是应该改为等于1

@hu970804 👍

@hu970804 恩,改为 1 更加清楚。

@KieSun

安全部分:XSS要补上最重要的防御策略:http-only cookie, 通常XSS和CSRF是搭配使用的,比如用XSS偷cookie,再用CSRF做跨站请求(带上偷来的cookie)。

优化部分:利用图片URL请求回传客户端错误不是好的做法。

数据结构部分:与前缀数对应的还有个后缀树,通常解决最大子串问题,可以考虑加进来伐?

浏览器部分:可以考虑把WebAssembly WebVR WebRTC内容加进来

react 中 setState 这个 api 并不是绝对异步的,你可以在 一个 setTimeout 内调用多次这个 api,state 是立刻就被改变的。

@Anshiii 异步或者同步是绝对的,是二值的,没有semi-sync或者semi-async这种说法哈😆

@xixilive 如果以 setState 后发生的现象来说,改变可能是即刻也可能非即刻。但是 setState 实际做的是将更新的任务放到队列中,按你的说法,这应该是绝对同步了。

verynice

快排part函数第二参数不能这样传,这会导致left前面的部分不能与基准值比较,还有里面那个多了个swap

function quickSort(array, left, right) {
  if (left < right) {
    swap(array, , right)
    // 随机取值,然后和末尾交换,这样做比固定取一个位置的复杂度略低
    let indexs = part(array, parseInt(Math.random() * (right - left + 1)) + left, right);
    quickSort(array, left, indexs[0]);
    quickSort(array, indexs[1] + 1, right);
  }
}

提个建议,脑图中网络相关-缓存部分应该放在http的下面

前端virtualDom 这个xxToNode是不是clone打错了
// 删除第三个 li
ul.childNodes[2].remove()
// 将第四个 li 和第五个交换位置
let fromNode = ul.childNodes[4]
let toNode = node.childNodes[3]
let cloneFromNode = fromNode.cloneNode(true)
let cloenToNode = toNode.cloneNode(true)
ul.replaceChild(cloneFromNode, toNode)
ul.replaceChild(cloenToNode, fromNode)

https://yuchengkai.cn/docs/zh/cs/#post-%E5%92%8C-get-%E7%9A%84%E5%8C%BA%E5%88%AB

303 see other,表示资源存在着另一个 URL,应使用 GET 方法丁香获取资源

https://github.com/InterviewMap/CS-Interview-Knowledge-Map/blob/master/Network/Network-zh.md#%E5%B8%B8%E8%A7%81%E7%8A%B6%E6%80%81%E7%A0%81

303 see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源

@KieSun 作者你好,我对Promise实现中的resolutionProcedure()函数有一点疑问,想请教一下,就是里面这一段:
image
规范确实是要求遇到x为Promise时要做这些处理,但是我觉得紧接着下面的这一段好像已经可以处理x为Promise的情况了,上面的这段看起来好像有点多余(?):
image
我的理解是下面这段可以处理x为thenable对象的情况,而x为Promise时也是thenable对象,所以同样可以被这一段处理,不需要上面的那段专门判断x是Promise的实例然后写相关处理。我试过去掉上面那段的代码,同样也是可以通过a+测试的:
image
image
不知道您有考虑过这方面吗?如果我理解有误欢迎指正,谢谢!

image
疑问:304状态码不是表示资源未发生改变,可以直接使用本地缓存的意思吗,感觉这个解释不太恰当

llftt commented

function checkArray(array) {
if (!array || array.length <= 2) return false;
return true;
}

function insertion(array) {
if(!checkArray(array)) return;
for (let i = 1; i < array.length; i++) {
for (let j = i - 1; j >= 0 && array[j] > array[j + 1]; j--)
swap(array, j, j + 1);
}
return array;
}

算法那块关于排序里面不符合条件拦截的,应该是上面这种

关于 js 类型转化 -> 对象转为基本类型 那里有些疑惑

假设有这么个对象

var a = {
  toString () {
    return 'toString'
  },
  valueOf () {
    return 'valueOf'
  }
}

alert(a) // toString

如果说,会优先调用 valueOf 的话,那为什么 alert 的结果是 toString ??