题解JavaScript(延续更新)

1. 多个等号一连赋值

(function(){
    var x=y=1;
})();
console.log(typeof x);
console.log(typeof y);

第一次明白的时刻,以为是一连赋值的问题。然则实际上这不是重点,重点在于函数中x,y都存在,然则在输出的时刻,x是函数内变量,在函数外没法读取。y则是直接声明为了全局变量。故。第一个输出为undefine。第二个输出为number。
要明白这段代码能够试着敲入

(function(){
    y=1;
})();
console.log(typeof y);

会发明,并没有给y运用声明变量的var,然则这段代码能够运转,输出为number。这是因为y默许附加到了全局对象上。多个等号一连赋值的时刻,var声明的结果仅局限于最最先的那一个变量。

2. prototype相干、原型链

var fn=function(){}
fn.prototype={
  value:1,
  getValue:function(){
    return this.value;
  },
  setValue:function(v){
    this.value=v;
  }
};
var a=new fn();
var b=new fn();
a.setValue(2);
console.log(b.getValue());
delete a.value;
console.log(a.getValue());

这段代码的输出是1,1。我来依据步骤,诠释下缘由。

1.顺序声清楚明了变量a,b和函数fn。a,b此时为undefined,fn为一段函数代码。
2.为fn的prototype属性赋值一个对象object。个中包含了value,getValue,setValue.
3.a被赋值,a的__proto__指向的是fn的prototype,a并没有value属性
4.b被赋值,b的__proto__指向的是fn的prototype,b并没有value属性
5.a.setValue(2)为a增加了一个value属性,该值为2.
6.b.getValue()时,因为b并没有value属性,因而顺着__proto__向上查找,找到的value为1。
7.同第6步,删除了a中的value属性时,也是顺着__proto__向上查找,找到的value为1。

以上是罕见的问题来考核JS的细节问题,我会不定期的网络,来举行更新,迎接相互指教

    原文作者:craccr
    原文地址: https://segmentfault.com/a/1190000003740867
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞