美文网首页
面试必备干货-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