Blogger Information
Blog 37
fans 2
comment 0
visits 26499
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
0105-js数组和对象解构,call,apply,bind的区别,访问器属性
世纪天城
Original
632 people have browsed it

值传递与引用传递的区别
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 ? "及格" : "补考");
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post