数据类型
引用类型,值类型?
值类型key与value存储在栈中(可存内存较小)
引用类型在栈存储的引用地址,在堆中存储是数据(可存内存较大)把引用类型赋值给一个变量,是把变量的引用地址指向引用类型堆中地址
值类型
String字符,Number数字,Boolean布尔,undefined未定义null空(特殊)Symbol符号
引用类型
Object对象 Array数字 Function函数 Map图 Set集合
怎么判断数据类型
typeof类型
适合判断值了与引用类型不能判断具体引用类型
typeof "abc” string
typeof 123 number
typeof true boolean
typeof undefined undefined
typeof null object
typeof Symbol()
symboltypeof object
typeof 0]object
typeof function()function
typeof new Map() object
typeof new Set() object
constructor构造函数
判断实例对象构造函数
[ ].constructor === Array true
Array.isArray)是否为数组
Object.prototype.toString.callobj)原型
Object.prototype.toString.call(obj).slice(8,-1)返回数据的精确类型
instanceof实例
[ ]instanceof Array true
[ ]instanceof Object true
{ }instanceof Array false
{ }instanceof Object true
浅拷贝
Object.assign(A,B)
for in遍历拷1贝
{...A}对象扩展
var obj1 = {name:"白菜头子",age:20,friend:["大白菜","小白菜",{name:"中白菜",job:"程序员"}],say(){alert("你好我是"+this.name)}}
//案例
var obj3={};
for (var k in obj1){
obj3[k]=obj1[k]
}
var obj4=Object.assign(obj1,{})
var obj2={...obj1}
深拷贝
JSON.parse(JSON.stringify(数据))
json数据类只支持 布尔,字符串,数字 null,undefined array object会忽略函数 等其他类型数据
通过判断类型 递归深拷贝
递归就是函数调用自己一定要有结束条件
转字符串
var obj2 = JSON.parse(JSON.stringify(obj1))
递归
function deeCopy(obj){
if(typeof obj==="object"&&obj!==null){
var result;
if(obj.instanceof Array){
result = [];
for(var i=0;i<obj.length;i++){
result[i] = deepCopy(obj[i])
}
}else{
result = {};
for(var k in obj){
result[k] = deepCopy(obj[k])
}
}
return result;
}else {
return obj;
}
}
隐式转换
数据类型转换:强制转换,隐式转换、强制转换
Number()转换为数字string() 转换为字符串 BooLean()转换为布尔值隐转换符号
+字符串连接符号(隐式转换为字符串) + -*/数学运算(隐式转换为数字)><>=<=/ / && !比较与逻辑(隐式转换为布尔值)
字符串和任意数据+连接都会转换为字符串
数学运算符号会会尝试隐式转换数据为数字
如果数据没有转换数字成功结果就是NaN(not a num的检测)l / true转换为数字默认 转换为1false默认会转换为0
/ / alert( ! !a);//false
逻辑与比较运算符号会把变量转换为布尔值
空字符串,0, nuL4L, undefined NaN false才会被转换为false,其他都会被转换 为true/把以上的变量值称为fLasely变量值,其他的变量都称为truely变量值
alert( ! ! -1); //true
全等【 === 】
判断类型和值是否相同
注:判断是否为null或者为undefined为特例(其他为fasle)
null === null
undefined === undefined
结果:true
等于【 == 】
判断值是否相同
案例:
“100” == 100 // true
null == undefined //true
0 == false //true
注:NaN === null // false
特殊:
[] == {} //false
{} == {} // false
因为里边指向不同的内存地址
if判断
if()中判断的是否为truely变量
除了falsely变量其他都为truely变量
falsely变量:false "" 0 NaN undefined null 两次取反 !!a得到结果为false
逻辑且逻辑或
逻辑 或 ||
前||后
若前边的为true返回前边的值,反之返回后边的值
逻辑 且 &&
前&&后
前边为true结果返回后面的值,反之返回前边的值
判断对象
if(a&&a.b&&a.b.c){ }
if(a?.b?.c){ }
如果有a并且有a.b并且有a.b.c
if(a.b.c){ } 这样写是错误的
原型和原型链
什么是原型,什么是原型链
每个构造函数(class)都有一个显示的原型prototype
每个实例对象都有个隐示原型__proto__
实例的隐式原型__proto__等于其构造函数的显示原型prototype
当查找一个对象的属性或方法时先在实例上查找,找不到沿着__proto__向上逐级查找
我们把__proto__的__proto__形成的链条关系成为原型链
作用:1 原型链实现了js继承,2.原型可以给构造函数创建的实例添加公用方法
作用
实现了js的继承
实现了实例的公用属性和方法
例如:
var arr=[ ]
arr.__proto__===Array.prototpe
Array.prototpe.__proto__===Object.prototpe
Object.prototpe===arr.__proto__.__proto__
注:相当于形成一个链子,一环套一环,从arr的__proto__到Object的prototpe形成一个链条
js实现继承
class 的 extends方法
class Student extends People{
constructor(name,age,no){
//继承构造函数Student继承People里边的内容
super(name, age)
}
}
使用原型链
Stuent构造函数中继承
People
function Student(name,age,no){
People.call(this,name,age)
}
继承原型链
Student.prototype = Object.create(People.prototype)
修正Student构造函数
Stuent.prototype.constructor = Student
原型链示图