问题1:数组排序比较
思考以下数组和条件,你认为结果如何?
答案
现在我们知道了结果,让我们解释一下原因。对于前两个输出,说明非常简单,该sort()方法对原始数组进行排序并返回对相同对象arr1.sort()的引用,因此实际上是对相同对象的引用arr1。
对于第三个输出,arr1.sort() === arr2.sort()即使每个数组上的元素相同,=== 也不会测试数组的元素,而是测试每个对象的引用(在这种情况下是不同的),因此返回false。
问题2:对象可变性
对于这种情况,我想模拟一个代表作者的对象以及有关他的网站的信息。然后,我们使用这个方法,Object.freeze()以便无法对其进行更改,并将其进行测试。你认为结果如何?
答案
如果你做对了,恭喜!如果没有,请不要担心。让我们解释发生了什么。当我们调用该方法时,Object.freeze()冻结了对象,这意味着不能再更改对象;冻结对象可以防止向其添加新属性,也可以防止现有属性被删除或更改。
但是,为什么我们能够更改对象?实际上我们没有,这就是窍门。出于各种目的,可变author网站中是对对象的引用,并且该引用在整个代码中保持不变。我们确实更改了website对象内部的一个属性,但这并没有更改对对象本身的引用。
如果你想知道如果尝试更改author对象的属性会发生什么,那么有两种可能的答案。让我们从第一个开始:
在第一种情况下,即使我们更改属性,name也没有真正更改,也没有错误,没有警告,就像那行代码永远不会执行一样。第二种答案是在严格模式下
在严格模式下,如果尝试修改冻结的对象,则会得到TypeError。比以前好多了。
问题3:递归
给定以下递归函数,当我们使用“ blog”作为参数调用它时,你认为结果是什么?
答案
对于这个问题,没有技巧,只是递归函数的基本用法,它将继续调用自身,直到字符串中只有一个元素为止str,在这种情况下,将打印原始字符串的最后一个字符g。递归函数很重要,并且可以通过非常有趣的方式解决问题,因此理解它们很重要。
问题4:范围
你认为控制台的输出是什么,为什么?
答案
但是,如何在封闭函数的范围之外b进行定义?诀窍是,最多是一个全局变量。但仍保留在功能的封闭之下。请注意,在严格模式下,这将生成一个ReferenceError: b is not defined。
问题5:有关闭包的更多信息
以下代码段是一个实际的流行访谈问题,问题是,你认为输出结果是什么?
答案
答对了吗?这样做的原因是,在循环中执行的每个函数都将在整个循环完成后执行,因此所有函数都将引用存储在中的最后一个值i,即5。闭包可以通过为每次迭代创建一个唯一的作用域,将变量的每个唯一值存储在其作用域中来防止此问题,如下所示:
ES2015提供的另一个选项是使用let代替var:
最后
希望你能像我一样开心并从中学到东西,这是一篇特别有趣的文章,将来我可能会做更多这样的事情。