Blogger Information
Blog 13
fans 0
comment 0
visits 9194
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JS对象与简单流程控制
我是贝壳
Original
658 people have browsed it

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?"及格" : "不及格");
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