1. 实例演示值传递与引用传递的区别与联系
答:值传递与引用传递使用场景有两种:
值传递:
简单数据类型(int , string, bool …)赋值传递:
let a=1;
let b=a;
a=100;
console.log(a);//=>100
console.log(b);//=>1
数据单元是独享的
引用传递的数据类型是对象和数组:
let o={a:1,b:2};
let oo=o;
console.log(oo);//=>{a:1,b:2}
oo.a=100;
console.log(o);//=>{a:100,b:2}//证明引用传递发生
console.log(oo);//=>{a:100,b:2}//证明引用传递发生
注意:
demo1:
oo={};//值传递
console.log(o);//=>{a:100,b:2}
demo2:
o={};//值传递
console.log(oo);//=>{a:100,b:2}
参数传递:
赋值传递参数:进行的是值传递
let sum=a=>(a=10);
let y=100;
sum(y);//=>10
console.log(y);//=>100
引用传递参数:
let sum=x=>(x.a=1000);
let y={a:1,b:2};
sum(y);//=>{a:1000,b:2}
console.log(y);//=>{a:1000,b:2} //引用传值发生
再看:
let sum=x=>(x={});
let y={a:1,b:2};
sum(y);//=>{}//单独指向,没有影响到引用值
console.log(y);//=>{a:1,b:2} //保持不变
但是引用传值已经发生
和老师上课讲的不一致
2. 数组和对象解构的常用方法与函数传参
答:解构赋值:快速从集合数据中解析出独立变量
数组解构:
let [a,b,c]=[1,2,3];
console.log('a=%d,b=%d,c=%',a,b,c);
let [a,b,c,d=[1,2,3,4,5
cosnole.log(a,b,c,d);
let [a,b,c]=[1,2,3];
console.log('a=%d,b=%d,c=%',a,b,c);
let [a,b]=[1,2,3];
console.log(a,b);
let [a,b,c,d]=[1,2,3];
console.log(d)//=>未定义
let [a,b,c,d='****']=[1,2,3];
console.log(a,b,c,d)//=>1,2,3,****
let [a,b,...c]=[1,2,3,4,5,6];
console.log(a,b,c)//=>1,2,[3,4,5,6]
let [,,a,,,]=[1,2,3,4,5,6];
console.log(a)//=>3
let x=1,y=2;
[y,x]=[x,y]
console.log(x,y);//实现x,y交换
对象解构:变量名要存在解构对象的属性名中。
let {name,email}={name:'zhangsan',email:'admin@126.com'}
console.log(name,email);//=> zhangsan admin@126.com
重新开始:
let email="123456@qq.com";
let {name,email}={name:"zhangsan",email:"admin@qq.com"};
//=>报错,email重复定义
({name,email}={name:"zhangsan",email:"admin@qq.com"});//强制定义
重新开始:
let email="123456@qq.com";
let {name,email:userEmail}={name:"zhangsan",email:"admin@qq.com"};//定义别名解构
函数参数解构:
数组传参数的结构
let sum=([a,b])=>a+b;
console.log(sum([10,20]));
对象传参数的结构
let getInfo=({name,age})=>[name,age];
console.log(getInfo({name:'zhangsan',age:30}));
3. call,apply,bind的区别与联系,并试着实例演示一下
答:call()、apply()、bind() 都是用来重定义 this 的指向。
call,apply很类似,绑定后立即执行。bind绑定后返回函数声明,bind和call的传输参数一样,是多个的用逗号隔开,apply的参数则传递数组。
bind:
function my(name){
this.name=name;
console.log(this.name);
}
let y=my.bind({name:'例子'},'bind绑定')
y();//=>bind绑定
call:
my.call({name:'例子'},'call绑定')//=>call绑定
apply:
my.apply({name:'例子'},['apply绑定'])//=>apply绑定
4. 访问器属性的原理与实现过程,并实例演示
答:访问器属性就是把方法伪造成属性进行访问,通过get,set来设置。
例子:
const product={
data:[
{name:'小说',price:100,num:10},
{name:'科幻',price:200,num:20},
{name:'宇宙说',price:100,num:55},
{name:'原子理论',price:300,num:1},
],
//访问器具属性
get total(){
return this.data.reduce((t,c)=>(t+=t+c.price*c.num),0)
},
set update(value){
this.data[0].price=value;
}
}
product.total//=>35300
product.update=10
注意点:
访问器属性的名称和变量名冲突时,优先级:
访问器属性的优先级高于普通属性
5. 多分支与swithc转换的技巧
答:
let mark=100;
switch(true){
case mark>=60 && mark<=80:
console.log('及格');
break;
case mark>80 && mark<=100:
console.log('学霸');
break;
case mark>100:
console.log('非法数据');
break;
default:
console.log('补考');
}
6. 三元运算解决了什么问题,有什么限制?
答:简化了分支语句,返回结果:相对于if…else ,需要三个操作数。