博客列表 >JS学习小结(值传递与引用传递、数组和对象解构、访问器属性、call\apply\bind、多分支与switch、三元运算符)

JS学习小结(值传递与引用传递、数组和对象解构、访问器属性、call\apply\bind、多分支与switch、三元运算符)

庖丁
庖丁原创
2021年01月16日 21:52:29669浏览

1.变量值传递与引用传递的区别

变量值传递与引用传递的应用场景有两个,一是赋值,二是传参。赋值时,原始类型的数据用的是值传递,引用类型的数据用的是引用传递。传参时不论什么类型的数据都是采用值传递。

一、原始类型赋值时采用值传递

原始类型有 string number boolean,举例如下

  1. let a = 1;
  2. let b = a;
  3. a = 5;
  4. console.log(b);
  5. console.log(a);

打印出来b = 1, a = 5
b在赋值后,a重新赋值,并不影响b的值。

二、引用类型赋值时采用引用传递

引用类型的 对象和数组,举例如下

  1. let zhangSan ={
  2. name:"张三",
  3. age: 24,
  4. };
  5. let xiaoZhang = zhangSan;
  6. console.log(zhangSan);
  7. console.log(xiaoZhang);
  8. zhangSan.name = "小张";
  9. console.log(zhangSan);
  10. console.log(xiaoZhang);

第一次打印zhangSan = xiaoZhang
当改变zhangSan的name属性后,
第二次打印zhangSan的内容依然和xiaoZhang一样

2.数组和对象解构的常用方法和函数传参

数组和对象解构就是将数组中的值或者对象中的属性值赋值给变量。

一、数组解构

变量数和数组元素个数一一对应

  1. let a =["张三","李四","王五"];
  2. let[zhangsan,lisi,wangwu] = a;
  3. console.log(zhangsan,lisi,wangwu);

打印出来的值为张三 李四 王五

变量数>数组元素个数,多出的变量没有得到赋值,会打印出undefined

  1. let a =["张三","李四","王五"];
  2. let[zhangsan,lisi,wangwu,maliu] = a;
  3. console.log(zhangsan,lisi,wangwu,maliu);

打印出来的值为张三 李四 王五 undefined
undefined 表示声明未被赋值(初始化)的变量

变量数<数组元素个数,前面的数组元素会被赋值给变量,剩下的不会

  1. let a =["张三","李四"];
  2. let[zhangsan,lisi] = a;
  3. console.log(zhangsan,lisi);

打印出来的值为张三 李四

二.对象解构赋值

对象解构赋值时定义的变量名要和属性同名

  1. let {name,age} = {name:"张三",age:24};
  2. console.log(name,age);

打印出来为张三 24
还有一种情况,如果对象的属性名和之前的变量重名,需要在定义变量时使用别名得到赋值,打印变量时要使用别名

  1. let name;
  2. let {name:xiaozhang,age} = {name:"张三",age:24};
  3. console.log(xiaozhang,age);

参数解构

数组传参

  1. let sum =([a,b]) => a + b;
  2. console.log(sum([100,200]));

对象传参

  1. let student = ({name,age}) => `学生的姓名为${name},年龄为${age}`;
  2. console.log(student({name:"张三",age:24}));

3.call apply bind的区别

先举例子,再说明区别,例子如下

  1. let student = {
  2. name:"张三",
  3. age:24,
  4. zuhe:function(banji){
  5. return `该学生的姓名是${this.name},年龄是${this.age},年级是${banji}`;
  6. }
  7. };
  8. let lisi = {
  9. name:"李四",
  10. age:28,
  11. };
  12. console.log(student.zuhe.call(lisi,"三年级"));
  13. console.log(student.zuhe.apply(lisi,["三年级"]));
  14. console.log(student.zuhe.bind(lisi,"三年级")());

1、call,apply,bind三个均是函数的原型方法,作用是改变this的指向对象
2、三个方法的第一个参数是指向对象,后面的参数为实参列表,没有可以不写
3、apply的传入参数需要通过数组的方式传入
4、bind方法只是返回函数,不会立即调用,如果需要调用后面加小括号()

4.访问器属性的原理

访问器属性的本质是对象的方法(函数),伪造成对象的属性进行调用。

  1. let student = {
  2. name:"张三",
  3. age:24,
  4. get zuhe(){
  5. return `该学生的姓名是${this.name},年龄是${this.age}`;
  6. },
  7. set xiugai(name){
  8. return this.name = name;
  9. }
  10. };
  11. console.log(student.zuhe);
  12. student.xiugai = "李四";
  13. console.log(student.zuhe);

get关键字是获取对象属性值,如果访问器属性仅仅是为了使用属性值,采用该关键字
set关键字是设置或者修改对象的属性值,需要修改属性值,采用该关键字

5.多分支与swith

一、swith用于多个单值判断,单值数量>=3

  1. let louceng = 3;
  2. switch(true){
  3. case louceng == 1:
  4. console.log("1楼");
  5. break;
  6. case louceng == 2:
  7. console.log("2楼");
  8. break;
  9. case louceng == 3:
  10. console.log("3楼");
  11. break;
  12. case louceng == 4:
  13. console.log("4楼");
  14. break;
  15. default:
  16. console.log("未知错误");
  17. }

二、区间判断多个数值,应用if判断语句

  1. let fenShu = 82;
  2. if(fenShu <0){
  3. console.log("超出范围");
  4. }else if(fenShu <60){
  5. console.log("不及格");
  6. } else if(fenShu >=60 && fenShu <80){
  7. console.log("合格");
  8. } else if(fenShu >=80 && fenShu <90){
  9. console.log("良好");
  10. } else if(fenShu >=90 && fenShu <=100){
  11. console.log("优秀");
  12. } else if(fenShu >100){
  13. console.log("超出范围");
  14. }else{
  15. console.log("未知错误");
  16. }

6.三元运算符可以解决双分支判断的问题

条件 ? true : false
实例如下

  1. let xingbie = "男";
  2. xingbie == "女" ? console.log("女") : console.log("男");
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议