值传递和引用传递
<script>
// 值传递有原生类型,字符串,数值,布尔,值传递的时候只传值,不会传地址,这样更改其中一个数值的时候不会一起更改
let a=1;
let b=a;
a=2;
//这两个都是原生类型,更改a后b不会更改值,b还是1
//引用专递有对象,传递的时候值和地址一起传递,更改数值的时候回一起更改
let obj1={a:1, b:2};
let obj2=obj1;
//更新obj1其中a的值
obj1.a=10;
//这时候obj2中的a也会更新
//传递参数无论什么类型都是值传递
const f1=(x)=>(x=10);
let m=5;
//把m传入到f1函数中,叫入参
f1(m);
//函数中对参数更新,不会影响到入参的值
const f2=(x)=>(x.a=10);
let o={a:1,b:2};
//用o调用f2这个函数
f2(o);
//虽然o里面的a更新了,实际上不是引用传递,是值传递,因为对于引用类型,只有全新的赋值才是更新,修改其中单个属性不算
const f3=(x)=>(x={a:1,b=1});
f3(o);
//深拷贝就是值传递,穿个值过去,就值和地址都过去了
//浅拷贝就是引用传递,就给你个地址让你访问
</script>
数组和对象解构的常用方法与函数传参
<script>
//解构赋值就是快速从集合数据(对象/数组)解构出独立变量,常用于vue中
//解构数组
let [a,b,c]=[1,2,3];
console.log(a, b, c);
//变量名多数值少,多出的变量会显示默认值
[a, b, c, d] = [1, 2, 3];
//变量名少数值多,有几个变量名显示几个数值
[a, b] = [1, 2, 3];
//解析a、b,剩下都放进数组
[a,b,...c]=[1,2,3,4,5];
//单独解析某个值,它是第几位就在前面加几个逗号,后面也得加上
[,,a,,]=[1,2,3,4,5];
//两个变量交换值就可以直接用解构来弄,不用再弄中间数了
let x = 1,
y = 2,
// 中间量
t;
console.log("x=%d,y=%d", x, y);
t = y;
y = x;
x = t;
console.log("x=%d,y=%d", x, y);
// 用解构函数
[y, x] = [x, y];
console.log("x=%d,y=%d", x, y);
//对象解析,变量名必须一样,顺序是无所谓
let {id,name}={id:10,name:"手机"};
console.log(id, name);
//用已有变量名来解析会导致覆盖已有的值,可以用别名的方式来解析
let email="as@qq.com"
let {name,email:asemail}={name:"电脑",email:"sd@qq.com"}
//这样访问asemail会访问后面的值,访问原先email会访问到原先的值
//参数解构,
//数组传参
let sum=([a,b])=>a+b;
console.log(sum([10, 20]));
// 对象传参
let getUser = ({ name, email }) => [name, email];
console.log(getUser({ email: "php.con", name: "老师" }));
</script>
call,apply,bind
<script>
//创建函数
function hello(name){
this.name=name;
console.log(this.name);
}
//创建一个对象
const obj={name:"admin"};
console.log(hello("朱老师"));
//hello通过用bind绑定到obj上,因为需要参数,所以第二个写成参数
let f = hello.bind(obj, "天蓬老师");
//f()不会立刻执行,返回的是个函数声明
console.log(f());
//call/apply立即执行
f = hello.call(obj, "灭绝老师");
//这里就不用加括号了,因为是立即执行
console.log(f);
//用apply,参数必须数组
f = hello.apply(obj, ["西门老师"]);
console.log(f);
</script>
访问器属性的原理与实现过程
<script>
const product = {
data: [
{ name: "电脑", price: 5000, num: 5 },
{ name: "手机", price: 4000, num: 10 },
{ name: "相机", price: 7000, num: 3 },
],
//计算多少钱
getAmounts() {
return this.data.reduce((t, c) => (t += c.price * c.num), 0);
},
//访问器属性
//通过方法伪造成一个属性
//通过get从新创建一个方法
//这样就可以用属性来打到方法的效果,这就是访问器属性
get ta() {
return this.data.reduce((t, c) => (t += c.price * c.num), 0);
},
//用ser来修改其中某一个数值
set setPrice(price) {
//this就是指向当前data中的第二个的price属性,然后让它等于传进来的参数
this.data[1].price = price;
},
};
console.log("总额:", product.getAmounts());
//通过属性访问
console.log("总额:", product.ta);
//先访问一些原先的属性
console.log(product.data[1].price);
//然后从新赋值一个
product.setPrice = 9000;
//然后再访问一些
console.log(product.data[1].price);
console.log("--------------------");
//访问器属性的优先级高于同名的普通属性
</script>
多分支与swithc转换的技巧
<script>
let cj=60;
//单循环
if(cj>=60){
console.log('及格');
}
//加分支
if(cj>=60){
console.log('及格');
}else{
console.log('不及格');
}
//多分支
if(cj>=60&&cj<=80){
console.log('及格');
}else if(cj>=80&&<=100){
console.log('优秀')
}else if(cj>100||cj<0){
console.log('非法数据')
}else{
console.log('不及格')
}
//多分支用switch来写,switch是严格匹配,括号里面必须用true
score = 100;
switch (true) {
// 第一种情况
case score >= 60 && score < 80:
console.log("合格");
// 跳出来
break;
case score >= 80 && score <= 100:
console.log("优秀");
// 跳出来
break;
case score > 100 && score < 0:
console.log("问题");
// 跳出来
break;
// 默认分支
default:
console.log("补考");
}
// 一般用在单值判断
let response = "Success";
// 传递的值有可能会出现大小写错误
// toLowerCase()会把传入的字符串全部改为小写
// toUpperCase()全部改为大写
switch (response.toLowerCase()) {
case "fail":
console.log("请求失败");
break;
case "success":
console.log("请求成功");
break;
default:
console.log("位置分支");
}
</script>
三元运算
<script>
// 三元运算符简写法
// 条件:如果为真执行第一个,如果为假执行第二个,中间用分号分开
score = 50;
console.log(score >= 60 ? "及格" : "补考");
</script>