JS面试第一站变量类型和计算
值类型和引用类型的区别
看得懂代码就证明你会了
// 值类型和引用类型
//值类型 存放在栈中
let a1=110;
let b1=a1;
a1=200;
console.log(b1);//输出110
//值类型由哪些:undefined Boolean number string Symbol
//引用类型 存放在堆中 引用类型:数组,对象 null,指向是空地址 function
let a={
age:20
}
let b=a;
a.age=21;
console.log(b.age);输出21
为什么?
因为值类型 存放在栈中而引用类型 存放在堆中
来看张图
堆中存放的形式类似与C语言中的指针形式。key存放的是地址。val存放的才是值,第二个例子中 let b=a,我们赋的是地址不是val,当a.age=21改变时,key存放的地址也会随之改变。
typeof
看个面试题: typeof能判断哪些类型
1识别所有值类型 2识别函数3 判断是否是引用类型
手写深拷贝
const obj1={
age:20,
name:"xxx",
add:{
city:"hunc"
},
arr:[1,2],
}
const obj2=deepClone(obj1);
obj2.add.city="shanghai"
console.log(obj1.add.city);//hunc
//深拷贝
function deepClone(obj={}){
//判断obj属于哪种类型
if(typeof obj !=="object"|| obj==null){
return obj;
}
//初始化返回结果
let result;
if(obj instanceof Array){
result=[]
}else{
result={}
}
for(let key in obj){
//保证key不是原型的属性
if(obj.hasOwnProperty(key)){
result[key]=deepClone(obj[key])//递归,注意这里时重点中的重点,面试最在意的就是这个地方。
}
}
return result;
}
== 和===的区别
100=="100"//true
0==''//true
0==false//true
false=='';
null=undefined//true
上述用==号全是true
一般面试的时候问何时使用== 和===
回答:除了判断null外,其他一律用===
如下:
const obj={
x:100
}
if(obj.a==null){
return false;
}
另外介绍两个变量
turly变量和falsely变量
truly变量:!!a===true的变量
falsely变量 !!a===false的变量
!!0===false
!!NaN===false
!!''===false
!!undefined===false
!!false===false
另外if判断的是turly和falsely的变量 逻辑判断也是判断的是turly和falsely变量这点需要注意