前端基础题练习总结

目录:

  • 前端基础题练习
    • 1. JavaScript
      • 1.1
      • 1.2 call,apply,bind

前端基础题练习

1. JavaScript

1.1

   a = {n:1};
   var b = a;
   a.x = a = {n:2};
   console.log(a.n,b.n);
   console.log(a.x,b.x);

请问输出结果是什么?
前端基础题练习总结_第1张图片
a = {n:1}; //a是一个引用变量,里面存放着对象1的地址

var b = a;//b也是一个引用变量,里面也存着对象1的地址

a.x = a = {n:2};

重点在这里,我们知道在进行赋值运算时先要计算子表达式的值,a.x 这个子表达式由于对象1中并没有 x 属性,故在对象1中新建一个 x 属性,注意这是在右边是有赋值运算的条件下才会新建一个 x 属性。

举个例子:

 var a.y = a.x;
 console.log(a);

ax 属性和 y 属性都没有,在赋值运算符前面的 a.y 子表达式检测到 a 中并没有y 属性,于是新建一个 y 属性等着赋值,a.x 子表达式在 a 中查询 x 属性没有找到返回 undefined,故将 undefined 赋值给 a.ya.y 的值为 undefined。至于具体为什么是这样的底层实现,现在也不清楚,欢迎告知。

a 这个子表达式的值赋值前还是对象1的地址,将新声明的对象2的地址赋给 aa 中现在存的是对象2的地址,现在 a 指向对象2。然后a,x=a; 将对象2的地址赋给了对象1中的x属性,故对象1中x属性的值指向了对象2.

console.log(a.n,b.n);//输出2,1

console.log(a.x,b.x);//输出undefined,{n:2}


1.2 call,apply,bind

请问输出结果是什么?

var p1 = {
name:'小明',
age:'12',
action:function(where,doing){
 console.log(this.age + '岁的'+this.name + '在' + where + doing);
}  
}
var p2 = {
name:'小红',
age:'15'
}
console.log(p1.action.call(p2,'操场上','运动'))

输出结果:

15岁的小红在操场上运动

call,apply的作用都是指定在特定的作用域中调用函数
如果代码这样写:
p1.action('操场上','运动');
那么输出结果为:
12岁的小明在在操场上运动
因为这样调用时this指向的是 p1 这个对象,而p1.name = "小明"p1.age = 12
但是代码如果这样写时:
p1.action.call(p2,'操场上','运动');
输出结果:
15岁的小红在操场上运动
原因很简单,call 改变了执行函数的作用域,此时 this 指向 p2,此时p2.name = "小红"p1.age = 15

更新中,如有错误欢迎指正.

你可能感兴趣的:(前端基础)