对象
创建对象的方式:
构造函数创建法
var o=new Object();
字面量创建法:
var o = {
a:1;//a 为键 1 为值
b:2;
}
故对象是以键值对的形式存在 key value 每个key对应唯一的value
如何打印输出对象
键必须是字符串或者Symbol,如果不是则会隐式转换为字符串
console.log(o.a); //用点语法不加双引号
console.log(o["a"]);
对象的存储一共有两种情况,一种是存储数据,一种是存储函数
存储数据的叫做对象的属性,存储函数叫做对象的方法
var o = {
a: 1,
b: true,
c: {
d: 10
},
e: function () {
}
}
对象中存储的内容 相互之间是没有关联的
如果需要在对象中查找是否有某个键 (“a” in o);
如果需要在对象中查找是否有某个值,只能通过for in遍历对象查看每个值是否满足
for(var i in o)
var a=String.fromCharCode(122);//将asscii转换为字符 97-122就是小写字母a-z
console.log(a);
//String.fromCharCode(num1[, ...[, numN]])返回由指定的UTF-16 代码单元序列创建的字符串
例:将小写a-z,按1-26的数字顺序打印出来
str = "";
for(var i = 1;i<27;i++){
str = String.fromCharCode(i+96)
console.log(str+":"+i)
}
对象的赋值
var o = {a:1};
var o1= o; //这是将o对象的引用地址赋值给了对象o1,新旧对象还是共享同一块内存
o1.a = 10;//因此修改两个对象中的任何一个的属性和属性值,另一个对象内也会跟着发生改变
console.log(o.a)
深复制和浅复制
首先我们知道,数据是分为基本数据类型和对象数据类型的,基本数据类型存储在栈中,栈的内存小但是读取速度快,而对象数据类型存储的是该对象在栈中引用,真实的数据存放在堆内存里,堆的空间大读取速度慢。
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
深复制
实现方式:JSON.parse(JSON.stringify())
let arr = [1, 3, {
username: ' kobe'
}];
let arr4 = JSON.parse(JSON.stringify(arr));
arr4[2].username = 'duncan';
console.log(arr, arr4)
原理: 用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。
浅复制
实现方式:Object.assign()
Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。
浅复制
var obj = { a: {a: "kobe", b: 39} };
var initalObj = Object.assign({}, obj);
initalObj.a.a = "wade";
console.log(obj.a.a); // wade
但是需要注意的是当object只有一层的时候,是深复制
let obj = {
username: 'kobe'
};
let obj2 = Object.assign({},obj);
obj2.username = 'wade';
console.log(obj);//{username: "kobe"}
垃圾回收机制(Garbage Collection,GC)
一般来说没有被引用的对象就是垃圾,就是要被清除
var o={a:1};
将栈中变量o设置为null,表示不在引用对象,然后将堆中这个对象的引用列表中这个变量去除。
内存泄漏:大量的不使用的引用对象,没有被标识为null,并且还在不断生成和丢弃
函数
函数的结构形态
function 定义函数
fns 函数名 可以自己起,与变量起名方式相同,并且它本身就是变量。(a,b)可以向函数中注入的数据,a,b叫做参数,你注入几个数据就要声明几个参数
{} 就是函数执行的语句块
arguments 所有通过执行函数时传入的参数的列表
return 跳出当前函数,不再执行return以后的语句,并且可以返回一个数据, 如果函数中没有return,或者直接return没有返回数据,则返回undefined
function fns(a,b){
console.log(arguments);
return 10;
}
全局中定义了一个变量a=5;
在任何位置都可以调用全局变量
函数外使用var定义的变量都是全局变量
在函数内使用var 定义的变量都是局部变量,就是该函数的内的局部变量
只能在该函数内调用,不能再函数还或者别的函数中调用
局部变量只能再当前函数内定义,并且函数执行完成后会自动销毁该局部变量