2018-04-27 360總結(jié)

因為我沒Vue+Es6的經(jīng)驗救湖,所以360問的比較基礎(chǔ)。

1.由對象的拷貝引申到淺拷貝和深拷貝是如何實現(xiàn)的

除了基本類型跟null,對象之間的賦值,只是將地址指向同一個悦析,而不是真正意義上的拷貝类垫,被復(fù)制的對象改變值司光,另一個值會跟著改變。
要實現(xiàn)淺拷貝可以通過for in循環(huán)悉患,例如:

var obj = {a:10};
function copy(obj){
    var newobj = {};
    for ( var attr in obj) {
        newobj[attr] = obj[attr];
    }
    return newobj;
}
var obj2 = copy(obj);
obj2.a = 20;
alert(obj.a); //10  

ES6的Object.assign()方法也是淺拷貝残家。

深拷貝實現(xiàn)方法(遞歸原理)
var  obj ={a:{b:1}};
function deepCopy(obj){
  if(typeof obj !=Object){
    return obj;
  }
var newObj={};
for(var arr in obj){
  newObj[arr] = deepCopy(obj[arr]);
}
reurn newObj;
}

2.js實現(xiàn)繼承有哪幾種?

①原型鏈繼承
function SuperType(){
  this.property = true;
}
SuperType.prototype.getSuperValue = function(){
  return this.property;
}
function SubType(){
  this.property = false;
}
//繼承了SuperType
SubType.prototype= new SuperType();
SubType.prototype.getSubValue = function(){
  return this.subproperty;
};
var instance  =new SubType();
console.log(instance.getSuperValue)//true

實現(xiàn)原型鏈繼承的本質(zhì)是:重寫原型對象售躁,代之以一個新類型的實例坞淮,換句話說原來存在于SuperType的實例中屬性和方法也存在于SubType.prototype中了。此時instance.constructor指向SuperType.

確定原型和實例的關(guān)系

第一種使用instanceof操作符

    alert(instance instanceof Object);//true
    alert(instance instanceof SuperType);//true
    alert(instance instanceof SubType);//true

instance本質(zhì):A instacne B就是判斷B.prototype是否存在于A的原型鏈上陪捷。Object.getPrototypeOf(A) === B.prototype(即A.proto=== B.prototype)回窘;

第二種使用isPrototypeOf()方法,isPrototypeOf() 方法允許你檢查一個對象是否存在于另一個對象的原型鏈上市袖。

alert(Object.prototype.isPrototypeOf(instance));//true;
alert(SuperType.prototype.isPrototypeOf(instance));//true;
alert(SubType.prototype.isPrototypeOf(instance));//true;
原型鏈的問題

1.原型屬性會被所有實例所共享啡直,一個實例更改了原型屬性,會導(dǎo)致所有實例引用的屬性更改。
2.在創(chuàng)建子類型的實例時付枫,不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)烹玉。

②構(gòu)造函數(shù)繼承

即在子類型的構(gòu)造函數(shù)中調(diào)用超類型的構(gòu)造函數(shù)

function SuperType(){
  this.colors =['red','blue','green'];
}
function SubType(){
//繼承了SuperType
  SuperType.call(this);
}
var instance1 = new SubType();
instance1.colors.push('black');
alert(instance.colors)//red,blue,green,black
var instance2 = new SubType();
alert(instance.colors)//red,blue,green

構(gòu)造函數(shù)的問題
方法都在構(gòu)造函數(shù)中定義,無法實現(xiàn)函數(shù)復(fù)用阐滩,而且在超類型中定義的方法二打,對于子類型是不可見的。

③組合繼承
function SuperType(name){
  this.name = name;
  this.colors =['red','blue','green'];
};
SuperType.prototype.sayName = function(){
  alert(this.name);
};
function SubType(name,age){
  SuperType.call(this,name);
  this.age = age;
}
//繼承方法
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
  alert(this.age);
}
var instance1 = new SubType('Nicholas',29);
instance1.colors.push('black');
alert(instance1.colors)//red,blue,green,black
instance1.sayName();// 'Nicholas'
instance1.sayAge();//29

var instance2 = new SubType('Greg',27);
instance2.sayName();// 'Greg'
instance2.sayAge();//27

組合繼承避免了原型鏈和借用構(gòu)造函數(shù)的缺陷掂榔,成為JS最常用的繼承模式

④原型式繼承继效,借助原型基于已有的對象創(chuàng)建新對象
function object(o){
  function F(){}
  F.prototype = o;
  return new F();
}

//例子
var person = {
  name:'Nicholas',
  friends:['Shelby','Court',''Van]
}
var anotherPerson = object(person);
anotherPerson.name = 'Greg';
anotherPerson.friends.push('Rob');

var yetAnotherPerson = object(person);
yetAnotherPerson .name = 'Linda';
yetAnotherPerson .friends.push('Barbie');

alert(person.friends);//'Shelly','Court','Van','Rob','Barbie'

通過例子可以看出,實例是共享person對象的装获。
ES5通過新增Object.create()方法規(guī)范了原型式繼承瑞信。這個方法接受兩個參數(shù):一個用作新對象原型的對象(可選)一個為新對象定義額外屬性的對象。在傳入一個參數(shù)時穴豫,Object.create()和object()方法行為一致凡简。

var person = {
  name:'Nicholas',
  friends:['Shelby','Court',''Van]
}
var anotherPerson = Object.create(person);
anotherPerson.name = 'Greg';
anotherPerson.friends.push('Rob');

var yetAnotherPerson = Object.create(person);
yetAnotherPerson .name = 'Linda';
yetAnotherPerson .friends.push('Barbie');

alert(person.friends);//'Shelly','Court','Van','Rob','Barbie'

當(dāng)Object.create()傳入兩個參數(shù)時:

var person = {
  name:'Nicholas',
  friends:['Shelby','Court',''Van]
}
var anotherPerson = Object.create(person,{
  name:{
    value:'Greg'  
}
})
alert(anotherPerson.name);//'Greg'
⑤寄生式繼承

寄生式繼承與原型式繼承緊密相關(guān)。創(chuàng)建一個僅用于封裝繼承過程的函數(shù)精肃,該函數(shù)內(nèi)部以某種方式來增強對象秤涩,最后返回這個對象。

function createAnother(original){
  var clone = object(original)//或者Object.create(original);
  clone.sayHi = function(){
    alert('Hi');
  };
  return clone;
}

var person = {
  name:'Nicholas',
  friends:['Shelly','Court','Van']
}
var anotherPerson = createAnother(person);
anotherPerson.sayHi();//Hi

在考慮對象不是自定義類型以及不是構(gòu)造函數(shù)的情況下司抱,寄生式繼承是一種有用的模式筐眷。

寄生式繼承的問題

不能做到函數(shù)復(fù)用而降低效率,與構(gòu)造函數(shù)模式類似习柠。

⑥寄生組合式繼承

構(gòu)造函數(shù)和原型鏈組合繼承存在一個問題:調(diào)用兩次構(gòu)造函數(shù)匀谣,屬性會同時存在實例和原型對象上。使用寄生和構(gòu)造函數(shù)組合式繼承可以解決這個問題资溃。

function inheritPrototype(SubType,SuperType){
  var prototype = object(SuperType.prototype);
  prototype.constructor = SubType;
  subType.prototype= prototype;
}

function SuperType(name){
  this.name = name;
  this.colors =['red','blue','green']
}
SuperType.prototype.sayName = function(){
  alert(this.name)
}
function SubType(name,age){
  SuperType.call(this,name);
  this.age = age;
}
//關(guān)鍵代碼
inheritPrototype(SubType,SuperType);
SubType.prototype.sayAge= function(){
  alert(this.age);
}

2.數(shù)組的去重

①利用lastIndexOf,不借助對象
var arr1=[],arr=[1,2,2,2,3,4];
arr.filter(function(value,key){
  if(arr.lastIndexOf(value) ==key){
    return true;
  }else{
    return false;
  }
})
②利用數(shù)組的sort和reduce方法
var arr=[1,2,1,2,3,3,4,4,5,6,7];
var nArr = arr.sort().reduce(function(initValue,current){
   if(initValue[initValue.length-1]!==current){
      initValue.push(current);
}
return initValue武翎;
},[])

3.閉包題

function A(){
  var i=0;
  return function B(){
    console.log(i++);
  }
}
var a = A();
a();//0
a();//1

var b = A();
b();//0
b();//1

4.正則匹配電話號碼

表示以1開頭,第二位可能是3/4/5/7/8等的任意一個溶锭,在加上后面的\d表示數(shù)字[0-9]的9位宝恶,總共加起來11位結(jié)束。

/^1(3|4|5|7|8)\d{9}$/

5.js異步編程有哪些

ES 6以前:

  • 回調(diào)函數(shù)
  • 事件監(jiān)聽(事件發(fā)布/訂閱)
  • Promise對象

ES 6:

  • Generator函數(shù)(協(xié)程coroutine)

ES 7:

  • async和await
①回調(diào)函數(shù)

這個很熟悉了暖途,暫不展開

②事件監(jiān)聽(觀察者模式)卑惜,解決模塊間的信息通信

首先需要把觀察者對象創(chuàng)建出來,他有一個消息容器和三個方法驻售,分別是訂閱消息方法露久,取消訂閱消息方法、發(fā)布訂閱消息方法欺栗。

//將觀察者放在閉包中毫痕,當(dāng)頁面加載便立即執(zhí)行
var Observer = (function(){
  //防止消息隊列暴露而被篡改故將消息容器作為靜態(tài)私有變量保存
  var _message ={};
  return{
    //注冊消息接口
    register:function(type,fn){
      //如果消息不存在
      if(typeof _message[type] ==='undefined'){
        _message[type] =[];
      }
        _message[type].push(fn);
    },
    //發(fā)布消息接口
    fire:function(type,args){
      //如果消息沒有被注冊征峦,則返回
      if(!_message[type])
        return;
      //定義消息信息
      var events ={
        type:type,
        args:args||[]
      },
      i=0,len = _message[type].length;
      //遍歷消息動作
      for(;i<len;i++){
        //依次執(zhí)行注冊的消息對應(yīng)的隊列
       _message[type][i](events);
      }
    },
    //移除信息接口
    remove:function(type,fn){
      //如果消息動作隊列存在
      if(_message[type] instanceof Array){
        //從最后一個消息動作遍歷
        var i= _message[type].length-1;
        for(;i>=0;i--){
          _message[type][i] ===fn&&_message[type].splice(i,1);
        }
      }
    }
  }
})()

Observer.register('test',function(e){console.log(e.type,e.args.msg)});
Observer.fire('test',{msg:'chu'})
// test chu
③promise相關(guān)知識,由于這部分知識比較熟悉消请,暫不展開
④Generator 函數(shù)

http://es6.ruanyifeng.com/#docs/generator(Generator函數(shù)的具體講解)

⑤ES 7中的async和await

6.getElementByClassName的兼容性問題(如何兼容IE8)

function getclass(classn) {//創(chuàng)建函數(shù) 傳入形參
    if(!document.getElementsByClassName) {//判斷document.getElementsByClassName方法是否支持
        var list = document.getElementsByTagName("*");//先取得所有的dom標(biāo)簽元素
        //              alert(list.length)
        var temp = [];//創(chuàng)建臨時數(shù)組
        for(var i = 0; i < list.length; i++) {//循環(huán)每一個dom元素
            if(list[i].className == classn) {//判斷當(dāng)前這個元素的class名稱是否等于box
                temp.push(list[i])//如果等于栏笆,將該元素添加到數(shù)組中去
            }

        }
         return temp;//;返回給函數(shù)
    }
    else{

        return document.getElementsByClassName(classn); 
    }
}

7.實現(xiàn)左右定寬臊泰,中間自適應(yīng)的三欄布局

①利用絕對定位
//css
.left{
    width: 100px;
    background: red;
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
}
.right{
    width: 100px;
    background: blue;
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
}
.center{
    background: green;
    margin-left: 100px;
    margin-right: 100px;
    top: 0;
    bottom:0;
}
//html
<div class="left">1</div>
<div class="center">2</div>
<div class="right">3</div> 
②利用浮動蛉加,左邊左浮動,右邊右浮動
//css
.left{
    float: left;
    width: 100px;
    background: red;
}
.right{
    float: right;
    width: 100px;
    background: green;
}
//html(注意html的排列順序缸逃,中間的元素放在了最后面)
<div class="left">1</div>
<div class="right">3</div>
<div class="center">2</div>

如果不使中間的元素放在最后面可為中間元素加上此樣式
.center{
  display:inline-block;
}
③使用彈性盒布局
//css
.main{
    display: flex;
}
.left{
    width: 100px;
    background: red
}
.center{
    flex:1;
}
.right{
    width: 100px;
    background: blue;
}
//html
<div class="main">
   <div class="left">1</div>
   <div class="center">2</div>
   <div class="right">3</div>   
</div>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末针饥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子需频,更是在濱河造成了極大的恐慌丁眼,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昭殉,死亡現(xiàn)場離奇詭異苞七,居然都是意外死亡,警方通過查閱死者的電腦和手機挪丢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門蹂风,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吃靠,你說我怎么就攤上這事硫眨∽阆” “怎么了巢块?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巧号。 經(jīng)常有香客問我族奢,道長,這世上最難降的妖魔是什么丹鸿? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任越走,我火速辦了婚禮,結(jié)果婚禮上靠欢,老公的妹妹穿的比我還像新娘廊敌。我一直安慰自己,他們只是感情好门怪,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布骡澈。 她就那樣靜靜地躺著,像睡著了一般掷空。 火紅的嫁衣襯著肌膚如雪肋殴。 梳的紋絲不亂的頭發(fā)上囤锉,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音护锤,去河邊找鬼官地。 笑死,一個胖子當(dāng)著我的面吹牛烙懦,可吹牛的內(nèi)容都是我干的驱入。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼氯析,長吁一口氣:“原來是場噩夢啊……” “哼沧侥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起魄鸦,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤宴杀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拾因,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旺罢,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年绢记,在試婚紗的時候發(fā)現(xiàn)自己被綠了扁达。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡蠢熄,死狀恐怖跪解,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情签孔,我是刑警寧澤叉讥,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站饥追,受9級特大地震影響图仓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜但绕,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一救崔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捏顺,春花似錦六孵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昌执,卻和暖如春烛亦,著一層夾襖步出監(jiān)牢的瞬間诈泼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工煤禽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留铐达,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓檬果,卻偏偏與公主長得像瓮孙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子选脊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容