一、数据类型
- 什么是引用类型,值类型?
值类型key与value存储在栈中(量小)
引用类型在栈存储的引用地址,在堆中存储是数据(量大)
把引用类型赋值给一个变量,是吧变量的引用地址指向引用类型堆中地址 - 值类型
String字符,Number数字,Boolean布尔,undefined未定义 null空(特殊) Symbol符号 - 引用类型
Object对象 Array数字 Function 函数 Map图 Set集合 - 判断数据类型
typeof 类型 instanceof 实例 constructor 构造函数
Array.isArray() 是否为数组 Object.prototype.toString.call(obj) 原型 - typeof判断
typeof “abc” string typeof 123 number typeof true boolean typeof undefined undefined typeof null object typeof Symbol() symbol typeof {} object typeof [] object typeof function(){} function typeof new Map() object typeof new Set() object
适合判断 值了与引用类型 不能判断具体引用类型 - construtor
判断实例对象构造函数
[].constructor === Array true - Object.prototype.toString.call(obj).slice(8,-1)
返回数据的精确类型
二、深拷贝
-
js 拷贝一个对象
-
深拷贝,目标对象与源对象相互之间切断联系
- JSON.parse(JSON.stringify(数据))
json数据类只支持 布尔,字符串,数字 null,undefined array object
会忽略函数 等其他类型数据 - 通过判断类型 递归深拷贝
递归就是函数调用自己
一定要有结束条件<script> // js 拷贝一个对象 // 深拷贝,目标对象与源对象相互之间切断联系 var obj1 = {name:"mumu",age:18,friend:["小红","小绿",{name:"小蓝",job:"teacher"}],say(){alert("你好我是"+this.name)}}; // 01 JSON转字符,字符串转对象 var obj2 = JSON.parse(JSON.stringify(obj1)) // json字符串的值只会保留 数组,对象,字符串 ,数字,null,undefined // 对象中的函数会被过滤掉(一般数据也是不带函数的 // 02 通过递归拷贝 // 从前有座山 </script>
三、隐士转换
- + 字符串连接符号 会尝试把其他类型转换为 字符串
/* var a = "100"; var b = 10; var c = a + b; // 10010 alert(c); */ // 01 字符串和任意数据+连接都会转换为字符串
- + - * / == 会尝试把其他类型转换为数字
转换失败 NaN
false 转换为 0
true 转换 1var a = "10"; var a = "abc10"; var a = true; var a = false; var b = 2; var c = a*b; //20; // 02 数学运算符号会会尝试隐是转换数据为数字 // 如果数据没有转换数字成功 结果就是 NaN (not a num的检测) // true转换为数字默认转换为1 false 默认会转换为0 alert(c)
- ><>= <= ! != == 判断与逻辑返回会尝试把其他类型转换布尔值
falsely变量转换为false
“” null NaN undefined 0 转换为falsevar a = ""; var b = true; // alert(!!a);//false // 03 逻辑与比较运算符号会把 变量转换为布尔值 // 空字符串,0,null,undefined NaN false 才会被转换为false,其他都会被转换为true // 把以上的变量值称为flasely变量值,其他的变量都称为truely变量值 // alert(!!-1);//true alert(!!NaN)
四、严格等于
-
// == 判断隐是转换后值是否相等
// === 判断类型与值是否相对
// === 严格等于 判断类型与值是否相对 // alert(0 === ""); // false // alert([] === []);//false // alert({} === {}); //false // alert(null === undefined) //false alert(null === null) // true
- ==
判断隐式转换后的值“100” == 100 // true null == undefined //true 0 == false //true 特例:NaN === null // false
-
什么时候用=== 什么用 ==
应该都用=== 严格等于判断是为null还是undefined 可以用===
五、if语句
- if()中判断的是否为truely变量
var a = 10; if(a){ alert("条件通过") }
- falsely变量:false “” 0 NaN undefined null
两次取反 !!a得到结果为false/* var b = ""; if(b){ alert("通过") }else{ alert("不通过") } */
- 除了falsely变量其他都为truely变量
六、逻辑且与逻辑或
- A||B 或
A为真(truely) 结果为A ,否则结果为B - A&&B 或
A为假(falsely) 结果为A,否则结果为B<script> // || 或 如果前面的变量为truely 最终的结果为第一个,如果为falely结果为第二个; var a = 15 ||0; //15 转换结果为true a的值就是15 var b = false || 50; //false转换的结果为false b的值是50; var c = false ||undefined; var d = 0 || false; // alert(a); // alert(b); // alert(c); alert(d); </script>
- 逻辑且判断对象
if(a&&a.b&&a.b.c){}
if(a?.b?.c){}
如果有a并且有a.b并且有a.b.c
if(a.b.c){} -
在逻辑判断中 &&前面的值为falsely后面的不执行,前面位truly则看&&后面的值
var obj = {age:15,leg:{len:70,width:30}}; // if(obj.abc.len){ // if(obj&&obj.abc&&obj.abc.len){ if(obj?.abc?.len){ //es6的语法 alert("通过") }else{ alert("不通过"); } // 在 Uncaught TypeError: Cannot read properties of undefined (reading 'len') // 在undefined上面读取len读取不到
七、原型与原型链
-
原型与原型链有什么作用?
01 在js中实现继承 02 实现类的实例方法扩展
-
怎么样让所有的数组求最大最小值通用方法
数组数组Array的实例都拥有最大最小值方 把自定义方法挂载到类的原型上
- 显示原型
类/构造函数都一个显示显示原型protype
(本质是就是个对象) - 隐式原型
每个实例都有一个隐私原型__proto__ - 显与隐关系
类显示原型protype等于其创建的实例的隐式原型__proto__ - 原型链
查找对象实例的方法和属性时,先在自身找,找不到则沿着__proto__向上查找,__proto__形成的链条关系我们称为原型链(实现了js继承) - 原型与原型链的作用
实现了js的继承
实现了实例的公用属性和方法 - 显与隐关系
var arr = [];
arr.__proto__ === Array.prototype
类显示原型protype等于其创建的实例的隐式原型__proto__// 创建3个类解释原型与原型链 People Student // People eat方法 age属性 name属性 // Student 继承People类 study方法 age属性 name属性 no学号 // 01 创建People类 function People(name,age){ this.name = name; this.age = age; } // 02 给pepole显示原型添加 eat方法 People.prototype.eat = function(){ console.log(this.name+"正在吃饭") }
- 原型链图标演示
- js实现继承 class 的 extends方法
class Student extends People{ constructor(name,age,no){ //类中继承构造函数 super(name,age) .... } }
- js实现继承 1使用原型链
Stuent构造函数中继承People function Student(name,age,no){ People.call(this,name,age) .... }
2. 继承原型链Student.prototype = Object.create(People.prototype)
3. 修正Student构造函数Stuent.prototype.constructor = Student
实例公用方法
扩展
Array.prototype.max = function(){return Math.max(...this))}
所有数组将拥有max方法
String.prototype.reverse = function(){ return this.split("").reverse().join("")}
所有字符串将拥有 reverse 方法
注意:一般不要修改默认对象上的方法,扩展也谨慎