怎么 从头开始建设一个网站,群晖wordpress安装,济南哪家公司做网站,网页浏览器设置在哪里一.堆栈的定义
1.栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。 结论#xff1a;后进先出#xff08;Last In First Out#xff09;#xff0c;简称为LIFO线性表。
栈的应用有#xff1a;数制转换#xff0c;语法词法分析后进先出Last In First Out简称为LIFO线性表。
栈的应用有数制转换语法词法分析表达式求值等 2.队列(Queue)也是一种运算受限的线性表它的运算限制与栈不同是两头都有限制插入只能在表的一端进行(只进不出)而删除只能在表的另一端进行(只出不进)允许删除的一端称为队尾(rear)允许插入的一端称为队头 (Front),队列的操作原则是先进先出的所以队列又称作FIFO表(First In First Out)。 由于栈和队列也是线性表栈和队列有顺序栈和链栈两种存储结构这两种存储结构的不同则使得实现栈的基本运算的算法也有所不同。 二.JS堆栈研究
1、栈stack和堆heap stack为自动分配的内存空间它由系统自动释放而heap则是动态分配的内存大小不定也不会自动释放。 2、基本类型和引用类型 1基本类型存放在栈内存中的简单数据段数据大小确定内存空间大小可以分配。 5种基本数据类型有Undefined、Null、Boolean、Number 和 String它们是直接按值存放的所以可以直接访问。 2引用类型存放在堆内存中的对象变量实际保存的是一个指针这个指针指向另一个位置。每个空间大小不一样要根据情况开进行特定的分配。 当我们需要访问引用类型如对象数组函数等的值时首先从栈中获得该对象的地址指针然后再从堆内存中取得所需的数据。 3、传值与传址 前面之所以要说明什么是内存中的堆、栈以及变量类型实际上是为了更好的理解什么是“浅拷贝”和“深拷贝”。 基本类型与引用类型最大的区别实际就是传值与传址的区别。测试用例
var a [1,2,3,4,5];
var b a;
var c a[0];
alert(b);//1,2,3,4,5
alert(c);//1 //改变数值
b[4] 6;
c 7;
alert(a[4]);//6
alert(a[0]);//1 从上面我们可以得知当我改变b中的数据时a中数据也发生了变化但是当我改变c的数据值时a却没有发生改变。 这就是传值与传址的区别。因为a是数组属于引用类型所以它赋予给b的时候传的是栈中的地址相当于新建了一个不同名“指针”而不是堆内存中的对象。而c仅仅是从a堆内存中获取的一个数据值并保存在栈中。所以b修改的时候会根据地址回到a堆中修改c则直接在栈中修改并且不能指向a堆内存中。 三.拷贝
1.浅拷贝
前面已经提到在定义一个对象或数组时变量存放的往往只是一个地址。当我们使用对象拷贝时如果属性是对象或数组时这时候我们传递的也只是一个地址。因此子对象在访问该属性时会根据地址回溯到父对象指向的堆内存中即父子对象发生了关联两者的属性值会指向同一内存空间。
var a {key1:11111
}function Copy(p) {var c {};for (var i in p) { c[i] p[i];}return c;
}a.key2 [JING,JING];
var b Copy(a);
b.key3 33333;
console.log(b.key1); //11111
console.log(b.key3); //33333
console.log(a.key3); //undefined a对象中key1属性是字符串key2属性是数组。a拷贝到b12属性均顺利拷贝。给b对象新增一个字符串类型的属性key3时b能正常修改而a中无定义。说明子对象的key3基本类型并没有关联到父对象中所以undefined。
b.key2.push(WHALE);
alert(b.key2); //JINGJINGWHALE
alert(a.key2); //JINGJINGWHALE
但是若修改的属性变为对象或数组时那么父子对象之间就会发生关联。从以上弹出结果可知我对b对象进行修改a、b的key2属性值数组均发生了改变。其在内存的状态可以用下图来表示。 原因是key1的值属于基本类型所以拷贝的时候传递的就是该数据段但是key2的值是堆内存中的对象所以key2在拷贝的时候传递的是指向key2对象的地址无论复制多少个key2其值始终是指向父对象的key2对象的内存空间。
2.深度拷贝
或许以上并不是我们在实际编码中想要的结果我们不希望父子对象之间产生关联那么这时候可以用到深拷贝。既然属性值类型是数组和或象时只会传址那么我们就用递归来解决这个问题把父对象中所有属于对象的属性类型都遍历赋给子对象即可。测试代码如下
function Copy(p, c) {var c c || {};for (var i in p) {if (typeof p[i] object) {c[i] (p[i].constructor Array) ? [] : {};Copy(p[i], c[i]);} else {c[i] p[i];}}return c;
} a.key2 [JING,JING];
var b{};
b Copy(a,b);
b.key2.push(WHALE);
alert(b.key2); //JINGJINGWHALE
alert(a.key2); //JINGJING 由上可知修改b的key2数组时没有使a父对象中的key2数组新增一个值即子对象没有影响到父对象a中的key2。其存储模式大致如下