##### 变量类型和计算
### 一.typeof能判断哪些数据类型
识别所有值类型: 布尔型 undefined 数字 字符串 syblom
识别函数
判断是否是引用类型(不可再细分)
判断所有值类型,能判断函数,能识别引用类型
#### 值类型和引用类的区别
**总结:**
1.值类型有更好的效率,但不支持多态,适合用作存储数据的载体。而引用类型支持多态,适合用于定义程序的行为。
2.引用类型可以派生新的类型,而值类型不能。
```
1.对象的传递:
将值类型的变量赋值给另一个变量,会执行一次赋值,赋值变量包含的值;
将引用类型的变量赋值给另一个引用类型变量,它复制的是引用对象的内存地址,在赋值后就会多个变量指向同一个引用对象实例。
2.参数按值传递:
对于值类型(stu1),传递的是该值类型实例的一个副本,因此原本的值stu1并没有改变;
对于引用类型(Student stu2),传递是变量stu2的引用地址(即stu2对象实例的内存地址)拷贝副本,因此他们操作都是同一个stu2对象实例。
3.参数按引用传递:
不管是值类型还是引用类型,可以使用ref或out关键字来实现参数的按引用传递。ref或out关键字告诉编译器,方法传递的是参数地址,而非参数本身。
在按引用传递时,方法的定义和调用都必须显式的使用ref或out关键字,不可以省略,否则会引起编译错误
注:string与一般引用类型有区别。以下是我对string与其他引用类型进行比较,发现的不同,所编写的程序代码
```
### 二.手写深拷贝
```
<script>
//注意判断值类型和引用类型
//注意判断是数组还是对象
//递归
const obj1 = {
age:20,
name:'777',
address:{
city:"beijing"
},
arr:['a','b','c']
}
const obj2 =deepClone(obj1)
obj2.address.city="shanghai"
obj2.arr[0] ='aaa'
console.log(obj1.address.city);
console.log(obj2.arr[0])
/*
深拷贝
@param {Object} obj 要拷贝的对象
*/
function deepClone(obj = {}){
if(typeof obj !== "object" || obj == null){
// obj 是null,或者不是对象和数组,直接返回
return obj
}
// 初始化返回结果
let result
//判断是否是一个对象
if(obj instanceof Array){
result =[]
}else{
result = []
}
for(let key in obj){
if(obj.hasOwnProperty(key)){
//递归调用
result[key] = deepClone(obj[key])
}
}
//返回结果
return result
}
</script>
```
## 三.变量计算-类型转换
1.运算符:除了 == null之外,其他都一律用 ===
2.if语句和逻辑运算
```
truly 变量 : !!a===true的变量
falsely变量:!!a === false的变量
```
## 四.原型和原型链
如何准确判断一个变量是不是一个数组
手写一个简易的jQuery,考虑插件和扩展性‘
class的原型本质,怎么理解?
class和继承
constructor
类型判断instanceof
原型和原型链