# 一、对象的补充-栈堆
- 内存
- 用来运行数据的控件,内部有区分了不同的存储方式
- 栈:一般用来存储变量名和地址,空间小,稳定,不可修改
- 堆:一般用来存储数据,空间大,可被修改
- 关系:一一对应,多对一,不能一对多
- 存取规则:
- 栈:先进后出:杯子
- 堆:先进先出:掉底的杯子
- 内存
- 用来运行数据的控件,内部有区分了不同的存储方式
- 栈:一般用来存储变量名和地址,空间小,稳定,不可修改
- 堆:一般用来存储数据,空间大,可被修改
- 关系:一一对应,多对一,不能一对多
- 存取规则:
- 栈:先进后出:杯子
- 堆:先进先出:掉底的杯子
// 对象的意义:存储数据,编程
// 对象的本质:键值对
// 对象的本质:键值对
// 创建:字面量,构造函数
// var obj = {
// a:10,b:20,c:30,d:"hello"
// };
// 操作:
// 点语法:适合用在键 是固定的值
// 中括号语法:适合用在键 是不固定的值,变量
// console.log(obj.name);
// obj.name = "admin";
// console.log(obj.name);
// 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);
// console.log(obj[s]);
// obj[s] = 19;
// console.log(obj.age);
// for(var i in obj){
// console.log(i);
// console.log(obj[i]);
// }
// console.log(i);
// console.log(obj[i]);
// }
// 关于数据类型的存储形式:
// var a = 10;
// var b = a;
// b = 20;
// console.log(a); // 10
// console.log(b); // 20
// 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"
// 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遍历属性
- 基本类型(值传递)
- 数据就在栈中
- 不存在深浅拷贝,默认就是深拷贝
- 引用类型(引用传递的数据)
- 栈中只保存了一个地址,地址指向堆中的某个数据
- 存在深浅拷贝,默认是浅拷贝
- 目前会有一些影响
- 如何实现深拷贝?
- for-in遍历属性
// 对象的浅拷贝(复制):只复制地址,没有复制值
// 两个地址指向一个值
// 某些情况下不好
// 修改新数据,会影响老数据
// 处理成深拷贝(复制):复制值
// 如何做到
// 利用重新创建对象的方式,遍历老对象的所有属性。逐个拷贝属性对应的值
// 如何做到
// 利用重新创建对象的方式,遍历老对象的所有属性。逐个拷贝属性对应的值
// var obj = {
// name:"admin",
// age:18,
// sex:"男",
// like:"ball"
// }
// name:"admin",
// age:18,
// sex:"男",
// like:"ball"
// }
// var obj2 = {};
// for(var i in obj){
// obj2[i] = obj[i];
// }
// obj2.name = "root";
// obj2[i] = obj[i];
// }
// obj2.name = "root";
// console.log(obj);
// console.log(obj2);
// 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";
// obj2[i] = obj[i]
// }
// // obj2.name1 = "root";
// obj2.name1.name2.name3 = "root";
// console.log(obj)
// console.log(obj2)
// console.log(obj2)
# 二、全局对象window和this
- window
- 全局对象,所有的全局内容,都可以在window身上找到
- 一般情况下,window可以被省略
// js中的一切内容都是由归属的
// 如:
// 谁的push,数组的
// push属于数组
// 谁的push,数组的
// push属于数组
// 全局变量的归属
// var a = "李扬";
// var a = "李扬";
// console.log(a);
// JS的顶层对象,内置的
// console.log(window);
// 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到底是谁?执行对象
- 函数内的关键字
- 表示当前函数的执行上下文(执行对象)
- **谁执行了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
// console.log(this);
// }
// fn(); //window