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了