值类型和引用数据类型的区别:
值类型:声明赋值都在栈内存,赋值是值直接复制一份
引用数据类型:声明在栈,赋值在堆,中间用地址关联,赋值是地址赋值一份 一概全改
ps:深浅拷贝 :
深拷贝实现:1. JSON.stringify() JSON.parse()
2.递归(深层遍历)
3.新的全局api: structuredClone (被克隆的对象, { transfer })
对象的动态特征:
对象[‘属性名’] 获取的是属性值(属性名固定)
对象[变量名] 为动态的属性名 传入变量名作为属性名的话 不能加引号!!!!
异常处理: try{
尝试执行的代码
}catch(e){
如果try里边的代码报错了 执行这里
}finally{
这里是无论执行try还是catch都会执行的代码
如果try和catch里没有return 可以省略 如果有 必须加
}
传统构造函数存在的问题:构造函数里要是有方法的话,只要是用new调用创建新的对象 都会给每个新创建的对象绑定相同的属性和方法。
原型:
什么是原型:一个可以被赋值的一个类,通过赋值原型可以创建一个一模一样的新对象,也可以说原型就是一个对象模板,原型上定义了一些公用的属性和方法,,利用原型创建的新对象实例 会共享原型上的属性和方法。
实现继承的方式:
原型替换继承 直接把prototype指针指向被继承的对象
混入式继承 遍历被继承的对象,把属性和方法遍历绑定给要继承的对象
原型混入式继承 遍历被继承的对象,把属性和方法绑定给要继承的对象的原型上
Object.create(被继承的对象)
《javaScript语言精粹》提供的一种方法:
function create(obj){
function F(){}
F.prototype=obj;
return new F();
}
原型链
什么是原型链: 原型链是原型对象创建过程中的历史记录 当访问一个对象的某个属性时 会在他本身查找,如果找不到 会到它的隐式原型链上查找
如果再找不到 就继续往上找 这个过程就形成了一个链式结构
Object.prototype上的一些方法
Object.hasOwnProperty() 判断指定属性是否属于该对象自身 true/false (对象.hasOwnProperty(‘属性名’))
以后 用Object.hasOwn()替代 Object.hasOwnProperty() (Object.hasOwn(对象,‘要查询的属性’))
Object.isPrototypeOf() 判断对象1 是否包含在对象2 的原型链上
Object.toString() 将对象转换成字符串 默认返回 当前对象的 [类型名,构造函数]
Object.valueOf() 返回当前对象的原始值
Object的一些静态方法
Object.keys() 遍历当前对象,返回对象所有可枚举(可遍历)的键名放到数组里
Object.values() 遍历当前对象,返回对象可枚举(可遍历)所有的键的值数组里
Object.entries()遍历当前对象,返回对象可枚举(可遍历)所有的键值对 放到一个二维数组里 每个小数组都是一对键值
Object.assign() 合并对象(只有第一层是深拷贝)如果属性名重复,则后来的覆盖之前的
Object.freeze() 冻结当前对象(浅冻结) 深冻结需要用到递归 (冻结不可逆 但是可以通过克隆对象实现类似解冻的效果)
Object.isFrozen()判断当前对象是否被冻结
Object.seal() 密封对象(阻止添加新属性并将所有现有属性标记为不可配置,当前属性的值只要原来是可写的 就可以改变.)
Object.isSealed()判断当前对象是否被密封
Object.getPrototypeOf()返回当前对象的原型
Object.is() 比较两个值是否相等
Object.is()判断两个NaN是否相等 返回true
判断+0 -0返回 false
Object.defineProperty()
第一个参数; 对象
第二个参数:属性名
第三个参数:属性描述符对象
属性描述符对象: {
value:‘属性值’,
writable: 当前属性是否能被修改(默认是false),
enumerable:是否可被枚举(遍历)默认是false,
configurable:是否可被删除,
set(){},
get(){} 存值器和取值器不能和value和writable同时存在
}
Object.defineProperties()
第一个参数:对象
第二个参数:
{
属性名1:{
value。。。
。。。。
},
属性名2:{
value。。。。
}
}
词法作用域:
函数允许访问函数外的数据 整个代码结构中只有函数可以限定作用域(es6的let和const除外)作用域规则首先使用提升规则分析 如果当前作用域有名字了 就不会考虑外边的名字
闭包: 函数外部间接访问函数内部的数据
内部的数据来不及及时释放 容易造成内存泄漏
寄生式对象: 在构造函数里 return一个对象 这个对象就是 寄生式对象(开发的时候要避免)
call 和apply
区别: call接受的参数是 实参列表
apply接受的参数是 实参数组
iife立即执行函数 又叫 沙箱函数 (不管用什么参数 都得传进来哪怕是 window)
写法:
;(function(){}())
;(function(){})()
;+function(){}() //见到认识就行