JS基础-变量类型和计算
1. 值类型和引用类型的区别
//值类型
let a = 100
let b = a
a - 200
console.log(b) //打印出的是 100
//常见的值类型
let a //undefined
const s = 'abc'
const n = 100
const b = true
const s = Symbol('s')
//引用类型
let a = { age:20 }
let b = a
b.age = 21
console.log(a.age) //打印出的是 21
//常见的引用类型
const obj = { x : 100}
const arr = ['a','b','c']
const n = null //特殊引用类型,指针指向为空地址
//特殊引用类型,但是不用与存储数据,所以没有‘拷贝,复制函数’这一说
function fn(){}
深入分析 (如图请参照分析)
2. typeof能判断哪些类型
let a; typeof a //'undefined'
const str = 'abc'; typeof str //'string'
const n = 100 typeof n //'number'
const b = true typeof b //'boolean'
const s = Symbol('s') typeof s //'symbol'
3. 何时使用 === 何时使用 ==
===:称为等同符,当两边值的类型相同时,直接比较值,若类型不相同,直接返回false;
==:称为等值符,当等号两边的类型相同时,直接比较值是否相等,若不相同,则先转化为类型相同的值,再进行比较;
4. 拷贝
深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B复制了A,修改A的时候,看B是否发生变化:
如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)
如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)
浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存,
使用深拷贝的情况下,释放内存的时候不会因为出现浅拷贝时释放同一个内存的错误。
浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。
5. 堆和栈的区别
堆与栈的区别有:栈内存存储的是局部变量而堆内存是实体,栈内存的更新速度高于堆内存,栈内存的生命周期一结束就会被释放而堆内存会被垃圾回收机制不定时回收
栈中存放的是对象的引用及对象方法中的局部变量的值(参数的值) 堆中存放的是实例对象及成员变量的值(属性的值)
方法区存放类的方法代码,变量名,方法名,访问权限,返回值等等
原型
1. 原型
1.每个函数都有一个prototype属性,被称为显示原型
2. - 每个实例对象都会有 proto 属性,其被称为隐式原型
- 每一个实例对象的隐式原型__proto__属性指向自身构造函数的显式原型prototype
3. 每个prototype原型都有一个constructor属性,指向它关联的构造函数。
2.原型链
获取对象属性时,如果对象本身没有这个属性,那就会去他的原型__proto__上去找,如果还查不到,就去找原型的原型,一直找到最顶层(Object.prototype)为止。Object.prototype对象也有__proto__属性值为null。
Object是属于原型链的顶层,所有构造函数的的prototype都指向 Object.prototype