博客列表 >JS对象与简单流程控制

JS对象与简单流程控制

我是贝壳
我是贝壳原创
2021年01月08日 16:53:09674浏览

JS对象与简单流程控制

1. 实例演示值传递与引用传递的区别与联系

解析:
值传递:通常用于原始类型数据的赋值,如string,number,bool
引用传递:通常用于引用类型数据的赋值,如object,array

值传递代码说明:

  1. let a=2
  2. let b=a; //将a的值赋给b
  3. console.log("a=%d,b=%d",a,b); //控制台输出 a=2,b=2
  4. a=3;
  5. console.log("a=%d,b=%d",a,b); //控制台输出 a=3,b=2

注: 原始类型的a发生改变,不影响b的值

值传递代码说明:

  1. let obj1={a:1,b:2};
  2. let obj2=obj1;
  3. //以下现行代码都在控制台输出{a:1,b:2}
  4. console.log(obj1);
  5. console.log(obj2);
  6. //更新obj1
  7. obj1.a =10;
  8. console.log(obj1); //控制台输出{a:10,b:2}
  9. console.log(obj2); //控制台输出{a:10,b:2}

区别与联系:
值传递传递的是内存中存放的数据,把a的值赋给b,两个之间没有任何联系。
引用传递传递的是内存的地址,把a的值赋给b,相当于a和b指向同一个内存地址,当时内存地址中存放的数据发生改变,则a和b的值都会同步发生改变。

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

解析:解构赋值,目的是快速从集合数据(数组和对象)解构出独立变量,其实相当于给集合数据中的每个数据指定成一组key/value名值对。通过key就能快速的访问到value值。

2.1 数据解构

通过设定好的key(a,b,c),就能访问到对应的value

数量一致

  1. let [a,b,c] = [1,2,3];
  2. console.log(a,b,c);//控制台输出1,2,3

key值多,那没有对应value值的key就会显示为undefined

  1. let [a,b,cd] = [1,2,3];
  2. console.log(a,b,c,d);//控制台输出1,2,3,undefined
  3. //可以指定默认值的方式给上面的d赋值
  4. let [a,b,cd=10] = [1,2,3];
  5. console.log(a,b,c,d);//控制台输出1,2,3,10

如果key值数量比数组长度小,那么按照顺序对应

  1. let [a,b] = [1,2,3];
  2. console.log(a,b);//控制台输出1,2,数组中的3没有对应的key

如果想直接访问到数组的特定位置的value,如第三个,则前面两个可以用 , 来占位

  1. let [,,c] = [1,2,3];
  2. console.log(c);//控制台输出3

2.2 对象解构

对象解构前提:属性名与变量名必须一一对应,顺序无所谓

  1. let {id,name,email} = {id:1,name="T-Mac",email="123@abc.com"}
  2. console.log(id,name,email);//输出:1,T-Mac,123@abc.com

当变量已经存在时,同名的属性名有可能会将已存在的变量覆盖,造成数据流失,此时可以通过起别名的方式来避免冲突。

  1. let email="456@abc.com";
  2. let {id,name,email} = {id:1,name="T-Mac",email="123@abc.com"}
  3. console.log(email);//控制台输出123@abc.com,因为覆盖造成456@abc.com数据流失

起别名:

  1. let email="456@abc.com";
  2. let {id,name,email:'Temail'} = {id:1,name="T-Mac",email="123@abc.com"}
  3. console.log(Temail);//控制台输出123@abc.com
  4. console.log(email);//控制台输出456@abc.com

3. call,apply,bind的区别与联系,并试着实例演示一下

call,apply,bind方法主要用来动态改变this指向的对象

以下代码是页面上的给页面上的button控件添加一下点击事件,正常情况下控制台上输出的name应该是空,因为button并没有指定name属性,此时this指向对象是button

  1. <button>click</button>
  2. //以下是script代码
  3. document.querySelector("button").addEventListener(
  4. "click",function(){
  5. console.log(this.name);
  6. console.log(this);
  7. }
  8. );

应用bind()改写如下,此时this不再指向button,而是指向我们通过bind()方法传入的对象{name:”人与自然”}

  1. document.querySelector("button").addEventListener(
  2. "click",function(){
  3. console.log(this.name);
  4. console.log(this);
  5. }.bind({name:"人与自然"})
  6. );

bind()只返回一个函数声明,不会立即执行,与之不同的是call()和apply()会立即执行

公共代码:

  1. function hello(name){
  2. this.name = name ;
  3. console.log(this.name);
  4. }
  5. const obj = {
  6. name:"admin",
  7. };
  8. //经典调用
  9. console.log(hello("朱老师")); //控制台输出朱老师,里面的this指定hello("朱老师")
  10. //将hello绑定到obj对象中,bind()不会马上执行,只返回一个函数声明,此时this指向被更改,指向obj对象{"天蓬老师"},
  11. let f = hello.bind(obj,"天蓬老师");
  12. console.log(f); //控制台输出f函数的源代码
  13. console.log(f());//此时f函数才会调用,输出"天蓬老师"
  14. //call/apply立即执行
  15. f = hello.call(obj,'灭绝师太');
  16. console.log(f); //正常函数时,此时控制台应该输出函数源代码,但是由于call/apply函数的特性,此时控制台已经直接输出:灭绝师太

call()和apply的区别在于参数类型不同,后面那个参数必须是一个数组

上面代码应用apply()改成如下:

  1. f = hello.apply(obj,['灭绝师太']);
  2. console.log(f); //正常函数时,此时控制台应该输出函数源代码,但是由于call/apply函数的特性(会立即执行),此时控制台已经直接输出:灭绝师太

4. 访问器属性的原理与实现过程,并实例演示

访问器属性本质是对象里面定义的一个方法,但是可以伪装成对象的一个属性来使用。实际使用时,应该以性情赋值的方式,不能以调用方法的格式。

示范代码:

  1. const product = {
  2. data [
  3. {name = "电脑",price : 5000, num: 5},
  4. {name = "手机",price : 4000, num: 10},
  5. {name = "相机",price : 10000, num: 3},
  6. ]
  7. //定义一个访问器属性(一个set方法)
  8. set setPrice(price){
  9. this.data[1].price = price ;
  10. }
  11. };
  12. ////错误,控制台提示:product.setPrice is not a function。因为setPrice是一个访问器属性,不能以调用方法的形式 setPrice(9999)进行调用,面应该以属性赋值的方式来进行调用
  13. //product.setPrice(9999); //错误代码
  14. product.setPrice = 9999;
  15. console.log(product.data[1].price);//控制台输出9999

另外,这种访问器属性一旦与对象原有属性重名时,会存在优先级的问题。

  1. let user = {
  2. name = "张无忌";
  3. //访问器属性name()与原有属性name重名
  4. get name(){
  5. return "杨过";
  6. }
  7. };
  8. console.log(user.name); //控制台输出 杨过

以上代码可以看出,当访问器属性与对象的原有属性重名时,访问器属性的优先级较高,但是尽量不要出现访问器属性与原有属性重名的情况。

5. 多分支与swithc转换的技巧

多分支一般用于多元判断,最简单的应用就是分数评级,如

  1. let score = 65;
  2. if( score < 60 ){
  3. console.log("不及格");
  4. } else if ( score >= 60 && score <80 ){
  5. console.log("及格且良好");
  6. }else if ( score >= 80 && score <=100 ){
  7. console.log("优秀");
  8. }
  9. //最终控制台输出及格且良好

if-else if -else 可以用于区间判断,但是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. //默认分支后面不用添加break;
  12. }

6. 三元运算解决了什么问题,有什么限制?

三元运算一般用来解决双分支问题,非黑即白。如果条件判断为真,返回结果1,否则返回结果2
格式为: 条件判断?结果1 : 结果2;

示范代码:

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