工作中的解题思想(五)

  1. 关于闭包的一道题
function Foo(){
     var i=0;
     return function(){
         document.write(i++);
     }
}
var f1=Foo(),
f2=Foo();
f1();  // 0
f1();  // 1
f2();  // 0

解析:关于闭包,它最大的用处有两个,一个是可以读取到函数内部的变量,另一个是让这些变量的值始终保存在内存中。
这里的局部变量i,对f1()来说是全局变量,对f2()来说也是全局变量,但是f1()的i跟f2()的i又是相互独立相互不可见的,f1()
每执行一次,f1()的i就加一,f2()每次执行一次,f2()的i就加油,但是相互之间不影响,因此结果是010;其实就是f1(),f2()
分别创建了自己的执行环境,所以它们两个是相互独立的。

  1. 变量声明提升的题
if(! "a" in window){
    var a = 1;
}
alert(a);  // undefined

if(! “a” in window)这句代码的意思是:判断全局对象window中是否有变量a,如果没有变量a,就进入判断中将a赋值为1;
但是由于变量的声明提前,上面的代码等价于下面所写的内容:

var a;
if(!"a" in window){
    a=1;
}
alert(a);

由于变量的声明提前特性,在执行这段代码之后,全局对象window中就已经存在a这个变量了,所以不能进入判断,对a进行赋值,
因此a的值为undefined。
注意:let声明变量时,变量不会存在window下面,参考链接如下所示:
https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/30

  1. 关于map的试题
    1
    2
    3
    4
    let array = [,1,,2,,3];
    array = array.map((i) => ++i) // [,2,,3,,4]
    // 解析:
    // forEach,filter,every,some,map会跳过空位
  2. JSON.parse()中尾随逗号在JSON 中无效,所以如果传递给它的字符串有尾随逗号,JSON.parse()将会抛出错误
    1
    2
    3
    // 例子:
    const user = '{"name": "John","email": "john@awesome.com",}'
    const userStr = JSON.parse(user) // Uncaught SyntaxError: Unexpected token } in JSON at position 44
  3. JSON.parse()和JSON.stringify()的使用
    参考链接1:https://www.html.cn/archives/8735
    参考链接2:https://cloud.tencent.com/developer/article/1152862
  4. session和token的区别
    参考链接:https://blog.csdn.net/qq_35891226/article/details/79931210
  5. parseInt()特殊的用法
    1
    2
    3
    4
    parseInt('101',2)  // 5   -> 1 * 2^2 + 0 * 2 + 1 * 2^0 = 4 + 0 + 1 = 5
    parseInt('133',2) // 1 -> 将133看作2进制数,由于2进制是0-1 1 * 2^0 = 1
    parseInt('3',2) // NaN -> 如果被解析参数的第一个字符无法被转化成数值类型,则返回 NaN
    parseInt('13733',5) // 8 -> 将13733看作5进制数,由于5进制是0-4 1 * 5^1 + 3 * 5^0 = 5 + 3 = 8