博客列表 >0105-js数组和对象解构,call,apply,bind的区别,访问器属性

0105-js数组和对象解构,call,apply,bind的区别,访问器属性

世纪天城
世纪天城原创
2021年01月17日 15:52:30633浏览

值传递与引用传递的区别
1.1 值传递: 原始类型,string,number,bool

  1. let a = 1;
  2. let b = a;
  3. console.log("a = %d, b = %d", a, b);
  4. a = 2;
  5. // 更新a,不影响b
  6. console.log("a = %d, b = %d", a, b);

1.2 引用传递: 引用类型,对象object,数组array

  1. let obj1 = { a: 1, b: 2 };
  2. let obj2 = obj1;
  3. // 更新obj1
  4. obj1.a = 10;
  5. // 此时obj1就会更新为10
  6. console.log(obj1);
  7. // obj2同步更新
  8. console.log(obj2);
  9. // 这是可以将obj2理解为obj1的一个别名
  1. 传参
    传参时,不论什么类型,都是”值传递”
    入参: 调用函数是传入的参数,简称:”入参”
    函数中对参数的更新,并不会影响到入参
    实参:函数内为实参

引用传递
函数中对于对象参数/引用参数的更新并没有影响到入参

数组和对象解构的常用方法

解构赋值: 快速从集合数据(数组/对象)解构出独立变量

  1. 数组
    1. let [a, b, c] = [1, 2, 3];
    2. 将数组中的123解构的左边的abc的三个变量中
    也可以解构其中只两个数组
    1. [a, b] = [1, 2, 3];
    如果左边的变量比右边的数组多可以给多出来的变量一个默认值
    1. [a, b, c, d = "xxxx"] = [1, 2, 3];
    如果数组中有很多值可以将多个值压入一个变量中
    1. [a, b, ...c] = [1, 2, 3, 4, 5];
    如果只想取其中一个值可以用以下方法
    1. [, , a, ,] = [1, 2, 3, 4, 5];

数组的解构应用场景
将数组中的值进行调换
原始代码:

  1. let x = 1,
  2. y = 2,
  3. t;
  4. console.log("x = %d, y = %d", x, y);
  5. t = x;
  6. x = y;
  7. y = t;
  8. console.log("x = %d, y = %d", x, y);

使用解构赋值以下代码搞定

  1. [y, x] = [x, y];
  1. 对象解构
    属性名与变量名必须一一对应,顺序无所谓
    1. let { id, name } = { id: 10, name: "手机" };
    2. console.log(id, name);
    3. // 属性名与变量名必须一一对应,顺序无所谓
    当变量重名是可使用()将解构语句包起来进行重新赋值
    1. ({ name, id } = { id: 10, name: "手机" });
    2. console.log(id, name);

为防止变量重名可以对变量设置别名

  1. let email = "admin@php.cn";
  2. //为email添加: userEmail 别名 email: userEmail
  3. let { role, email: userEmail } = { role: "user", email: "user@php.cn" };
  4. //调用时直接调用别名即可不会影响变量email 的值
  5. console.log(userEmail);

3.参数解构
数组传参

  1. let sum = ([a, b]) => a + b;
  2. //[10, 20]数组传参解构
  3. console.log(sum([10, 20]));

对象传参

  1. let getUser = ({ name, email }) => [name, email];
  2. //对象的解构
  3. console.log(getUser({ email: "tp@php.cn", name: "天蓬老师" }));

call,apply,bind的区别
bind()函数
bind()方法主要就是将函数绑定到某个对象
bind()不会立即执行,只返回一个函数声明
bind()应用案例: 动态改变this

  1. document.querySelector("button").addEventListener("click",function () {
  2. }.bind({ name: "猫科动物" })
  3. );

call,apply为立即执行

  1. function hello(name) {
  2. this.name = name;
  3. console.log(this.name);
  4. }
  5. const obj = {
  6. name: "admin",
  7. };
  8. // call/apply立即执行
  9. f = hello.call(obj, "你好");
  10. console.log(f);
  11. f = hello.apply(obj, ["老师"]);
  12. console.log(f);

访问器属性的原理
原始调用方法

  1. 原始调用方法
  2. const product = {
  3. data: [
  4. { name: "电脑", price: 5000, num: 5 },
  5. { name: "手机", price: 4000, num: 10 },
  6. { name: "相机", price: 8000, num: 3 },
  7. ],
  8. getAmounts() {
  9. return this.data.reduce((t, c) => (t += c.price * c.num), 0);
  10. },
  11. }
  12. //方法调用
  13. console.log("总金额 :", product.getAmounts());

访问器属性访问方法

  1. const product = {
  2. data: [
  3. { name: "电脑", price: 5000, num: 5 },
  4. { name: "手机", price: 4000, num: 10 },
  5. { name: "相机", price: 8000, num: 3 },
  6. ],
  7. // 访问器属性
  8. // 将方法伪造成一个属性
  9. get total() {
  10. return this.data.reduce((t, c) => (t += c.price * c.num), 0);
  11. },
  12. };
  13. //用访问器属性调用
  14. console.log("总金额 :", product.total);

访问器属性的优先级

  1. let user ={
  2. // 普通属性
  3. name:'nihao',
  4. // 访问器属性
  5. get name(){
  6. return '1111';
  7. }
  8. }
  9. // 此时访问器属性比普通属性优先级高
  10. console.log(user.name);

注:在同一个对象中不能用重名的属性
解决方法:

  1. let user = {
  2. data: { name },
  3. get name() {
  4. return this.data.name;
  5. },
  6. set name(value) {
  7. this.data.name = value;
  8. },
  9. };
  10. user.name = "user.name";
  11. console.log(user.name);

流程控制-分支
单分支

  1. let score = 54;
  2. // 单分支
  3. if (score >= 60) {
  4. console.log("及格");
  5. }

双分支

  1. if (score >= 60) {
  2. console.log("及格");
  3. // else默认分支
  4. } else {
  5. console.log("补考");
  6. }

多分支

  1. score = 98;
  2. if (score >= 60 && score < 80) {
  3. console.log("合格");
  4. } else if (score >= 80 && score <= 100) {
  5. console.log("学霸");
  6. }else if (score > 100 || score < 0) {
  7. console.log("非法数据");
  8. } else {
  9. console.log("补考");
  10. }

switch来简化多分支 switch是严格匹配

  1. score = 198;
  2. switch (true) {
  3. case score >= 60 && score < 80:
  4. console.log("合格");
  5. break;
  6. case score >= 80 && score <= 100:
  7. console.log("学霸");
  8. break;
  9. // 判断成绩是否合法
  10. case score > 100 || score < 0:
  11. console.log("非法数据");
  12. break;
  13. default:
  14. console.log("补考");
  15. }

switch一般用在单值判断

  1. let response = "Success";
  2. switch (response.toLowerCase()) {
  3. case "fail":
  4. console.log("请求失败");
  5. break;
  6. case "success":
  7. console.log("请求成功");
  8. break;
  9. default:
  10. console.log("未知错误");
  11. }

三元运算符
条件? true : false
用于简写双分支

  1. 原始双分支:
  2. if (score >= 60) {
  3. console.log("及格");
  4. // 默认分支
  5. } else {
  6. console.log("补考");
  7. }

三元运算符简写

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