美文网首页
面试必备干货-JS篇

面试必备干货-JS篇

作者: suesoft | 来源:发表于2020-04-01 19:50 被阅读0次

    1、数据类型

    类型
    • 基本数据类型(存放在栈中): Number、Boolean、String、Undefined、Null、Symbol(ES6新增)
    • 引用数据类型(存放在堆内存中的对象,每个空间大小不一样,要根据情况进行特定的配置):object、array、function、data
      在js中除了基本数据类型以外的都是对象
    类型检测
    • typeof 操作符检测基本类型
      typeof 返回如下几个结果:"number"、"string"、"boolean"、"object"、"function"和"undefined"。
    // 基本类型
    typeof 1 // "number"
    typeof '1' // "string"
    typeof true // "boolean"
    
    // 引用类型
    /*
    * 用typeof检测引用类型值,返回的都是"object"
    */
    typeof({k:'1'}) // "object"
    typeof([1,2]) // "object"
    typeof(null) // "object"
    
    • instanceof 用于检测引用类型
    [1,2] instanceof Array // true
    [2] instanceof Object // true ,因为Array 是Object的子类
    [1] instanceof Function // false
    
    Object instanceof Object; //true 
    Function instanceof Function; //true 
    Number instanceof Number; //false 
    String instanceof String; //false 
    Function instanceof Object; //true
    

    2、闭包

    闭包就是一个函数,这个函数能访问其他函数的作用域中的变量。
    闭包是站在作用域的角度上来定义的

    function outer() {
        var  a = '变量1'
        var  inner = function () {
            console.log(a)
        }
        return inner    // inner 就是一个闭包函数,因为他能够访问到outer函数的作用域
    }
    

    由于闭包会携带包含它的函数的作用域,所以会比其他函数占用更多内容,过度使用闭包,会导致内存占用过多。

    坑点:比如this指向、变量的作用域,稍微不注意可能就造成内存泄露。
    一般在外层定义变量指向this,防止this指向更改。

    var Person = {
        name: "lucy",
        getName: function() {
            return function() {
                console.info(this.name)
            }
        }
    }
    Person.getName()()    // underfined
    

    3、如何防止数组和对象的数据污染(深拷贝和浅拷贝)

    浅拷贝

    浅复制没有办法去真正的去复制一个对象,而只是保存了对该对象的引用

    • 对象: Object.assign() 方法是浅拷贝,但它有一点特殊的地方,就是可以处理第一层的深拷贝。
    var obj = {a: 1};
    var copy = Object.assign({}, obj);
    console.log(copy); // {a: 1};
    
    深拷贝

    深拷贝就是两者指向不同的内存地址,是真正意义上的拷贝。

    • 对象:先调用JSON.stringify(obj),将其转换为字符串对象,然后再调用JSON.parse方法,将其转换为JS对象。
    let obj = {a: 123, b: {c: 456, d: {e: 789}}}
    
    let copy = JSON.parse(JSON.stringify(obj));
    
    // 对obj对象无论怎么修改,都不会影响到copy对象
    obj.b.c = 'hello';
    obj.b.d.e = 'world';
    console.log(copy);  // {a: 123, b: {c: 456, d: {e: 789}}}
    
    • 数组:concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
    <!--原数组被污染-->
    let gold=[1,2,3]; //原数组
    let test=gold; //把原数组的值赋给test
    test.push(4); //给赋值后的test追加赋值
    
    console.log(test); //1234
    console.log(gold); //1234  赋值后的数组就把原数组给覆盖了
    
    <!--解决方法:使用concat() 方法-->
    let gold=[1,2,3];  //原数组
    let test=gold.concat();//这样随意操作test就不会影响到原数组gold了
    

    相关文章

      网友评论

          本文标题:面试必备干货-JS篇

          本文链接:https://www.haomeiwen.com/subject/yjbkyhtx.html