变量类型
- 值类型VS引用类型
- typeof运算符
- 深拷贝
值类型
let a =100
let b = a
a = 200
console.log(b) //100
引用类型
let a = { age:20 }
let b = a
b.age = 21
console,log(a.age)
常见引用类型
const obj = { x : 100 }
const arr = ['a','b','c']
const n = null //特殊引用类型,指针指向为空的地址
//特殊引用类型,但不用于存储数据,所以没有“拷贝,复制函数”这一说
function fn(){}
//
变量计算-类型转换
- 一、字符串拼接
- 二、==运算符
- 三、if语句和逻辑运算
- 常见的falesly变量
- if 语句(true和false)
- 逻辑判断
typeof
.typeof是一个一元运算符,它返回的结果 始终是一个字符串,对不同的操作数,它返回不同的结果。
1. 对于数字类型的操作数而言, typeof 返回的值是 number
2. 对于字符串类型,typeof 返回的值是 string
3. 对于布尔类型,typeof 返回的值是 boolean
4. 对于对象、数组、null 返回的值是 object 。
5. 对于函数类型,返回的值是 function。
6. 、如果运算数是没有定义的(比如说不存在的变量、函数或者undefined),将返回undefined。
运用
/如果函数hello()存在则执行
try {
if (typeof(eval(hello)) == "function") {
hello();
}
} catch (e) { }
}
手写深拷贝
function deepCopy(source,hash = new WeakMap()){
// 判断如果参数不是一个对象,返回改参数
if(!isObject(source)) return source;
if(hash.has(source)) return hash.get(source); // 如何拷贝过该对象,则直接返回该对象
// 判断参数是对象还是数组来初始化返回值
let res = Array.isArray(source)?[]:{};
hash.set(source,res); // 哈希表添加新对象
// 循环参数对象的key
for(let key in source){
// 如果该key属于参数对象本身
if(Object.prototype.hasOwnProperty.call(source,key)){
// 如果该key的value值是对象,递归调用深拷贝方法进行拷贝
if(isObject(source[key])){
res[key] = deepCopy(source[key],hash);
}else{
// 如果该key的value值不是对象,则把参数对象key的value值赋给返回值的key
res[key] = source[key];
}
}
}
// 返回返回值
return res;
};
何时使用 == 何时使用 ===
除了null外,其他一律使用=
===:称为等同符,当两边值的类型相同时,直接比较值,若类型不相同,直接返回false;
==:称为等值符,当等号两边的类型相同时,直接比较值是否相等,若不相同,则先转化为类型相同的值,再进行比较;