引用类型-值类型
数值型
var num1; //这个时候不进行内存分配 var num3=9;//分配内存 var num4=num3;//会不会分配————分配内存 彼此拥有独立的内存空间,互不影响
字符串型
var str1; //这个时候不进行内存分配 var str2 = '传智播客'; //分配内存 var str3=str2; //问题,这里str3 会不会分配内存??————会 console.log(str2===str3) //比较的是指针指向的内存空间中存储的值
数组
// 内存会产生两篇区域,一个存储变量,一个存储数组 变量中保存的只是数组所在的地址 var arr1=['传智播客','黑马'];//分配内存 //引用类型其实是指向同一个地址,也就是操纵的其实是同一个位置 var arr2=arr1; //问题:这里arr2会不会分配内存 console.log(arr1[0]); //传智播客 console.log(arr2[0]); //传智播客 //修改数组1 arr2[0]='水浒传 西游记 三国演义 红楼梦'; console.log(arr1[0]);//水浒传 西游记 三国演义 红楼梦 console.log(arr2[0]);//水浒传 西游记 三国演义 红楼梦
函数 - 本质是对象类型
//系统都会在内存中生成两个区域:一个存储变量,一个用来存储函数
//而变量中存放的只是函数空间所在的地址(指针)
//由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。
//由于函数名仅仅是指向函数的指针,
//因此函数名与包含对象指针的其他变量没有什么不同。
//换句话说,一个函数可能会有多个名字,例如:
function sum(num1,num2) { return num1 + num2; } console.log(sum(10,10)); //20
//内存是如何分配的? 这里不会在内存生成新的空间,存储函数,而是生成一个变量,变量中保存的是同一个地址
var anotherSum = sum; sum = null;//这里只是将sum变量中原来保存的是函数地址,然后赋值成null,这样做并不会影响到函数对象对应的内存空间 console.log(anotherSum(10,10)); //20 console.log(sum(10,10)); //20
// 其中上面的四种(undefined, number, string, boolean)属于值类型,不是对象。
// 函数、数组、对象、null、new Number(10)都是对象。他们都是引用类型。
堆 和 栈
数据都是放在内存中的的
内存分成两种:栈 堆
栈:值类型保存在栈里面 -- 类似一个数组 --
如何获取:下标值 -- 和数组的获取方式类似
堆:引用类型
object,工厂,构造,原型,混合方式(构造+原型)
创建对象之工厂模式
工厂方式 : 封装函数 ——作为工厂的原料,输入进去,经过工厂之后生成一个对象
//这里name是我们输入的原料 function createPerson(){ //1.原料 var obj = new Object(); //2.加工 obj.name = '剑侠客'; obj.technologys=['普通攻击','横扫千军','地狱火','漫天飞雪']; obj.attack = function(){ alert(obj.name+'发出攻击,导致对方10点伤害值') }; //3.出场 return obj; } var boy = createPerson(); boy.attack();
思考场景:一个是写这个工厂的,一个是使用工厂的
原型
1,原型创建存在问题:
原型方式主张将一切都放在原型中
存在的缺点:name是每个实例不一样的
var Role =function() {} /*姓名*/ Role.prototype.name={nickName:'客',accountName:'876791562@qq.com'}; //跑起来 Role.prototype.run=function() { alert('run'); }
/*引用类型有问题*/ var boy = new Role() boy.name.nickName='剑侠客' console.log(boy.name.nickName) //剑侠客 var girl = new Role() girl.name.nickName = '可爱宝贝' console.log(boy.name.nickName) //可爱宝贝 console.log(girl.name.nickName) //可爱宝贝
2,解决办法:
引用类型有问题 -- 通过混合方式解决
/*引用类型有问题*/ var boy = new Role() boy.name.nickName='剑侠客' console.log(boy.name.nickName) //剑侠客 var girl = new Role() girl.name.nickName = '可爱宝贝' console.log(boy.name.nickName) //剑侠客 console.log(girl.name.nickName) //可爱宝贝
字面量形式
var boy = { name: '剑侠客', image: '男性头像', technologys: ['普通攻击', '横扫千军', '地狱火', '漫天飞雪'] };
//将对象转换成字符串
console.log(JSON.stringify(boy));
//将字符换转换成json对象
var sboy = '{"name":"剑侠客","sex":"男","HP":100}';
var objBoy = JSON.parse(sboy);
拷贝模式
拷贝创建对象
var boy = { name:'郭靖' ,image:'男性头像' ,age:20 ,sex:'男' }; var girl = { name:'黄蓉' ,age:18 ,image:'女性头像' ,sex:'女' };
六大神器之一
使用
var zuixiake = $$.extend({}, boy); var huangrong = $$.extend({},girl) alert(zuixiake.name);//郭靖 alert(zuixiake.sex);//男 console.log(huangrong.name)//黄蓉
封装函数的用处:就是将一个json对象 所有属性拷贝给另外一个对象
/*source:原始对象*/ /*target:目标对象*/ function extend(target,source) { //遍历对象 for(var i in source){ target[i] = source[i]; } return target; }
闭包类
立即执行
(function(){ })();