值类型都是在栈中存储的
let a=100
let b=a
a=200
console.log(a) //输出为200
console.log(b) //输出为100
引用类型保存的是内存地址
let a={age:21}
let b=a;
b.age=22;
console.log(a.age)
//a和b保存的是同一内存地址 输出为22
常用引用类型
const obj={x:100}
const arr=["a","b","c"]
const n=null
function fn(){}
typeof运算符的用法
--能够判断所有值类型
let a; console.log(typeof a);
let a=100; console.log(typeof a);
let a='100'; console.log(typeof a);
let a=true; console.log(typeof a);
let a=Symbol('100');console.log(typeof a);
--识别函数
typeof console.log;
console.log(typeof function(){})
--能识别引用类型(不能在继续识别)
typeof null
typeof ["a"]
typeof {a:a}
!!!很明显用来判断是否是数组或对象用typeof是不够的
for-in循环的基本用法
对于数组迭代出来的是数组下标,对于对象迭代出来的是对象的属性;
for(变量 in 数组){
执行的代码
}
var a = ["a","b","c"];
for(var el in a){
alert(a[el]);
}
------------------------------
for(变量 in 对象){
执行的代码
}
var obj = {
l: "lin",
t: "tong",
h: "hui"
}
for(var v in obj){
console.log(obj[v]);
}
for-in循环会遍历到原型链上的属性
Object.prototype.opps="opps";
var person ={ name: 'lth' };
for (var key in person) {
console.log(key, person[key]);
}
Object.prototype.opps="opps";
var person ={ name: 'lth' };
for (var key in person) {
if(person.hasOwnProperty(key)){
console.log(key, person[key]);
}
}
手写一个深拷贝
该深拷贝实现原理:
var a={name:'lth'};
var b={}
b['name']=a['name'] //等号右边已经是属性值
b.name="yoho"
console.log(a.name) //输出为 'lth' 改变b不在影响a
const obj1={
age:20,
name:'lth',
address:{
city:'xiamen'
},
arr:['l','t','h']
}
function deepClone(obj){
if(typeof obj != 'object' || obj==null){
return obj;
}
let result;
if(obj instanceof Array){
result=[]
}else{
result={}
}
for(key in obj){
if(obj.hasOwnProperty(key)){
result[key]=deepClone(obj[key])
}
}
return result;
}
const obj2=deepClone(obj1)