5.6 栈堆和window和this

# 一、对象的补充-栈堆
- 内存
    - 用来运行数据的控件,内部有区分了不同的存储方式
        - 栈:一般用来存储变量名和地址,空间小,稳定,不可修改
        - 堆:一般用来存储数据,空间大,可被修改
        - 关系:一一对应,多对一,不能一对多
        - 存取规则:
            - 栈:先进后出:杯子
            - 堆:先进先出:掉底的杯子
// 对象的意义:存储数据,编程
    // 对象的本质:键值对
    // 创建:字面量,构造函数
    // var obj = {
    //     a:10,b:20,c:30,d:"hello"
    // };
    // 操作:
        // 点语法:适合用在键 是固定的值
        // 中括号语法:适合用在键 是不固定的值,变量
    // console.log(obj.name);
    // obj.name = "admin";
    // console.log(obj.name);
    // var s = "age";
    // console.log(obj[s]);
    // obj[s] = 19;
    // console.log(obj.age);
    // for(var i in obj){
    //     console.log(i);
    //     console.log(obj[i]);
    // }
    // 关于数据类型的存储形式:
    // var a = 10;
    // var b = a;
    // b = 20;
    // console.log(a);     // 10
    // console.log(b);     // 20
    // var obj = {
    //     name:"admin"
    // }
    // var obj2 = obj;
    // obj2.name = "root";
    // console.log(obj);       // name:"root"
    // console.log(obj2);      // name:"root"
 
    // 数据类型的存储形式:js中的数据类型的分类,只有两种。
    // 改变新的不影响老的:基本(一般)类型(值传递的数据)
        // 除了对象,函数
    // 改变新的影响老的:引用(复杂)类型(引用传递的数据)
        // 对象,函数
   
    //
    // 硬盘是什么:存储空间
    // 内存是什么:运行空间
    // 内存的内部空间划分:很多小格子(内存颗粒)
    // 内存颗粒:栈和堆
    // 因为数据在内存中的保存形式,在栈堆中的体现形式
        // 栈:小,稳定,不可被修改,一般保存基本数据,和一些堆号
        // 堆:大,可被修改,保存的就是数据
   
    // 原理:
    //   栈                                堆
    // a和10                       { name: "root" }
    // b↑↓20

    // 例如:书
    // 目录是栈        后面的内容是堆
    // 一个目录指向一个内容
    // 两个目录指向一个内容
    // 一个目录指向多个内容呢?没有可能
 
    - 数据类型的分类
    - 基本类型(值传递)
        - 数据就在栈中
        - 不存在深浅拷贝,默认就是深拷贝
    - 引用类型(引用传递的数据)
        - 栈中只保存了一个地址,地址指向堆中的某个数据
        - 存在深浅拷贝,默认是浅拷贝
            - 目前会有一些影响
        - 如何实现深拷贝?
            - for-in遍历属性

    // 对象的浅拷贝(复制):只复制地址,没有复制值
        // 两个地址指向一个值
    // 某些情况下不好
    // 修改新数据,会影响老数据
    // 处理成深拷贝(复制):复制值
    // 如何做到
    // 利用重新创建对象的方式,遍历老对象的所有属性。逐个拷贝属性对应的值
    // var obj = {
    //     name:"admin",
    //     age:18,
    //     sex:"男",
    //     like:"ball"
    // }
    // var obj2 = {};
    // for(var i in obj){
    //     obj2[i] = obj[i];
    // }
    // obj2.name = "root";
    // console.log(obj);
    // console.log(obj2);

    // 遍历实现深拷贝,会出现的问题,解决方式,参考:递归
    // var obj = {
    //     name1:{
    //         name2:{
    //             name3:"admin"
    //         }
    //     }
    // }
    // var obj2 = {};
    // for(var i in obj){
    //     obj2[i] = obj[i]
    // }
    // // obj2.name1 = "root";
    // obj2.name1.name2.name3 = "root";
    // console.log(obj)
    // console.log(obj2)

# 二、全局对象window和this
- window
    - 全局对象,所有的全局内容,都可以在window身上找到
    - 一般情况下,window可以被省略
     // js中的一切内容都是由归属的
    // 如:
        // 谁的push,数组的
        // push属于数组
    // 全局变量的归属
    // var a = "李扬";
    // console.log(a);
    // JS的顶层对象,内置的
    // console.log(window);
    // console.log(a);
    // console.log(window.a);
    // 所有的全局内容都可以通过window拿到
- this
    - 函数内的关键字
    - 表示当前函数的执行上下文(执行对象)
    - **谁执行了this所在的函数,this就是谁**
    1.在局部作用域声明全局变量,场景少
    // (声明变量不允许省略var)
    // function fn(){
    //     window.a = "hello";
    //     // var a = "world";
    // }
    // fn();
    // console.log(a);
    -
    //2. 配合this使用
    // this:关键字,必然是对象,指向
    // this一般存在函数中,表示当前函数的执行对象(执行上下文)
    // this到底是谁?执行对象
    // function fn(){
    //     console.log(this);
    // }
    // fn();           //window
 

5.6 栈堆和window和this

上一篇:SQLSERVER 创建索引实现代码


下一篇:T-SQL利用Row_Number函数实现分页