值类型
key和value储存在栈中
undefined
String
Number
Boolean
Symbol
*null
例子:
let a = 100
let b = a
a = 200
console.log(b) // 100
引用类型
栈中储存key和内存地址
真正的value储存在堆中
Array
Object
function
例子:
let a = {age:20}
let b = a;
// a的内存地址赋值给b
// a和b引用同一块内存
b.age = 21
console.log(a.age)// 21
typeOf解构
var d = true;
typeof d //boolean
var e = {}
typeof e //object
var f = []
typeof f //object
var g = null;
typeof g //object
function fun(){}
typepof fun //function
class Person(){}
typeof Person //function
值类型typeof,通常对应值的类型引用类型typeof 对应的object函数与类typeof function
如何来判断js对象类型
几种判断js对象类型的方法:
typeOf
如果是引用类型无法怕判断是object还是Array
instanceof
原型上是否有该类
Array.isArray
constructor
构造函数
最准确
Object.prototype.toString.call(obj).slice(8,-1);
类型转换
字符串拼接
字符串用的符号是 +
任意类型与字符串 拼接都会变成字符串
100+"10" 10010
true+"100" true100
数字元素
"100" * 10 = 1000
true * 10 = 10
true转换为1 false转换为0
字符串能转为数字,转换失败为NaN
布尔逻辑
> < == != && ||
true&&15 //15
数字:除0都是true
字符串:除空都是true
falsely变量
false
NaN
null
undefined
""
0
逻辑赋值
&&
前为falsely变量 值为前
否则值为后
||
前面为truely变量值为前
否则为后
继承
ES6新增class继承
class extends
class Student.extends Person{}
原型继承
function Student(name,age){
Person.call(this,name)
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constuctor = Student
原型与原型链
每一个类都有一个显示原型prototype
每一个类的实例都有有个隐式原型_proto_实例的_proto_等于类的显示原型prototype
当去查找一个实例的属性或方法先在自身查找,找不到则沿着_proto_向上查找
我们把原型_proto_与原型_proto_形成链条关系叫做原型链
原型链作用。
01实现了js的继承
02让实例拥有的类公用方法
对象冒充
call
call 执行一个方法,call的第一个参数为方法的this
fn1.call(obj,n1,n2)
执行fn1方法,并用obj去冒充fn1的this
apply
apply与bind一致需要用数组传参
fn1.apply(obj,[n1,n2])
bind
返回一个新的方法
Object.create
let obj2 = Object.create(obj1)
从obj1创建一个新的对象obj2
并把obj1的属性和方法挂载到obj2的原型上