面試總結(jié)

1.undefined和null的區(qū)別

null: Null類型,代表“空值”县踢,代表一個空對象指針捏悬,使用typeof運算得到 “object”佩脊,所以你可以認(rèn)為它是一個特殊的對象值症昏。

undefined: Undefined類型随闽,當(dāng)聲明了一個變量而未初始化時,得到的就是undefined肝谭,使用typeof運算得到 “undefined”橱脸。

2.js基本的數(shù)據(jù)類型

ECMAScript中有5中簡單數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型): Undefined、Null分苇、Boolean、Number和String屁桑。
還有1中復(fù)雜的數(shù)據(jù)類型————Object医寿。Object本質(zhì)上是由一組無序的名值對組成的。

而 typeof 的返回類型包含:undefined蘑斧、boolean靖秩、string、number竖瘾、object 和 function沟突。

3.原生獲取元素的方法

JS獲取DOM元素的方法(8種)

通過ID獲取(getElementById)

通過name屬性(getElementsByName)

通過類名class(getElementsByClassName)

通過標(biāo)簽名(getElementsByTagName)

通過選擇器獲取一個元素(querySelector)

通過選擇器獲取一組元素(querySelectorAll)

獲取html的方法(document.documentElement) 
document.documentElement是專門獲取html這個標(biāo)簽的

獲取body的方法(document.body) 
document.body是專門獲取body這個標(biāo)簽的捕传。

4.css選擇器
①.ID選擇器 #
②.類選擇器 .
③.標(biāo)簽選擇器 p,div,span
④.偽類選擇器 :link :active :visited :hover
⑤.通用選擇器 *
⑥.屬性選擇器 [attr='']

5.js中的new關(guān)鍵字

一惠拭、認(rèn)識new運算符:

    function Animal(name){                      // 創(chuàng)建Animal構(gòu)造函數(shù)
        this.name = name;
    }
    Animal.color = "black";
    Animal.prototype.say = function(){
        console.log("I'm " + this.name);
    };
    var cat = new Animal("cat");                // 創(chuàng)建cat實例

    console.log(
       cat.name,      //cat
       cat.color      //undefined
    );
    cat.say();        //I'm cat

    console.log(
       Animal.name,   //Animal
       Animal.color   //black
    );
    Animal.say();     //Animal.say is not a function

1、代碼解讀

1-3行---創(chuàng)建了一個函數(shù)Animal,并在其this上定義了屬性:name职辅,name的值是函數(shù)被執(zhí)行時的形參棒呛。

第4行---在Animal對象(Animal本身是一個函數(shù)對象)上定義了一個靜態(tài)屬性:color,并賦值“black”域携。

5-7行---在Animal函數(shù)的原型對象prototype上定義了一個say()方法簇秒,say方法輸出了this的name值。

第8行---通過new關(guān)鍵字創(chuàng)建了一個新對象cat秀鞭。

10-14行---cat對象嘗試訪問name和color屬性趋观,并調(diào)用say方法。

16-20行---Animal對象嘗試訪問name和color屬性锋边,并調(diào)用say方法皱坛。

2、重點解析

第8行代碼是關(guān)鍵:

var cat = new Animal("cat");

JS引擎執(zhí)行這句代碼時宠默,在內(nèi)部做了很多工作麸恍,用偽代碼模擬其工作流程如下:

new Animal("cat") = {
    var obj = {};
    obj.__proto__ = Animal.prototype;
    var result = Animal.call(obj,"cat");
    return typeof result === 'object'?result:obj;
}

代碼解析:

(1)創(chuàng)建一個空對象obj;

(2)把obj的__ proto__ 指向Animal的原型對象prototype,此時便建立了obj對象的原型鏈:obj->Animal.prototype->Object.prototype->null

如果你不了解JS原型鏈搀矫,請先閱讀:JS原型和原型鏈

(3)在obj對象的執(zhí)行環(huán)境調(diào)用Animal函數(shù)并傳遞參數(shù)“cat”抹沪。 相當(dāng)于var result = obj.Animal("cat")。當(dāng)這句執(zhí)行完之后瓤球,obj便產(chǎn)生了屬性name并賦值為"cat"融欧。

關(guān)于JS中call的用法請閱讀:JS的call和apply

(4)考察第3步返回的返回值,如果無返回值或者返回一個非對象值卦羡,則將obj返回作為新對象噪馏;否則會將返回值作為新對象返回。

理解new的運行機制以后绿饵,我們知道cat其實就是過程(4)的返回值欠肾,因此我們對cat對象的認(rèn)知就多了一些:

image.png
cat.__ proto__ == Animal.prototype
Animal.prototype.__ proto__ == Object.prototype
Object.prototype.__ proto__ == null

__ proto__和prototype 以下四點需要謹(jǐn)記:

1.每個對象都具有一個名為__ proto__的屬性;
2.每個構(gòu)造函數(shù)(構(gòu)造函數(shù)標(biāo)準(zhǔn)為大寫開頭拟赊,如Function()刺桃,Object()等等JS中自帶的構(gòu)造函數(shù),以及自己創(chuàng)建的)都具有一個名為prototype的方法(注意:既然是方法吸祟,那么就是一個對象(JS中函數(shù)同樣是對象)瑟慈,所以prototype同樣帶有__ proto__屬性);
3.每個實例對象的__ proto__屬性指向自身構(gòu)造函數(shù)的prototype屋匕;(eg: cat__proto __ == Animal.prototype)
4.原型上綁定的屬性或方法葛碧,只能在new 出的實例上使用。(eg: Animal.prototype.say 的say方法过吻,只能在cat實例上使用进泼。)

所以cat的原型鏈?zhǔn)牵?/p>

cat->Animal.prototype->Object.prototype->null

cat上新增了一個屬性:name屬性。

所以此時cat對象為:


image.png

:實例對象(cat)的 __ proto __ == 構(gòu)造函數(shù)(Animal)的prototype。
即:cat.__ proto __ == Animal.prototype
(注:#proto前后無空格缘琅,若不輸入空格粘都,在此無法顯示__,故在此加上前后空格)

:實例對象(cat)的constructor == 構(gòu)造函數(shù)(Animal)刷袍。
即:cat.constructor == Animal


image.png

分析完了cat的產(chǎn)生過程翩隧,我們再看看輸出結(jié)果:

cat.name -> 在過程(3)中,obj對象就產(chǎn)生了name屬性呻纹。因此cat.name就是這里的obj.name

cat.color -> cat會先查找自身的color堆生,沒有找到便會沿著原型鏈查找,在上述例子中雷酪,我們僅在Animal對象上定義了color,并沒有在其原型鏈上定義淑仆,因此找不到。

cat.say -> cat會先查找自身的say方法哥力,沒有找到便會沿著原型鏈查找蔗怠,在上述例子中,我們在Animal的prototype上定義了say,因此在原型鏈上找到了say方法吩跋。

另外寞射,在say方法中還訪問this.name,這里的this指的是其調(diào)用者obj锌钮,因此輸出的是obj.name的值桥温。

對于Animal來說,它本身也是一個對象梁丘,因此侵浸,它在訪問屬性和方法時也遵守上述查找規(guī)則,所以:

Animal.color -> "black"

Animal.name -> "Animal" , Animal先查找自身的name,找到了name,注意:但這個name不是我們定義的name,而是函數(shù)對象內(nèi)置的屬性氛谜。

一般情況下掏觉,函數(shù)對象在產(chǎn)生時會內(nèi)置name屬性并將函數(shù)名作為賦值(僅函數(shù)對象)。

Animal.say -> Animal在自身沒有找到say方法值漫,也會沿著其原型鏈查找履腋,話說Animal的原型鏈?zhǔn)鞘裁茨兀?/p>

image.png
Animal.__ proto __ == Function.prototype
Function.prototype.__ proto__ == Object.prototype
Object.prototype.__ proto__ == null

所以Animal的原型鏈?zhǔn)牵?/p>

Animal->Function.prototype->Object.prototype->null

二、new存在的意義

認(rèn)識了new運算符之后惭嚣,我們再回到開篇提到的問題:JS中萬物皆對象,為什么還要通過new來產(chǎn)生對象悔政?要弄明白這個問題晚吞,我們首先要搞清楚cat和Animal的關(guān)系。

通過上面的分析谋国,我們發(fā)現(xiàn)cat繼承了Animal中的部分屬性槽地,因此我們可以簡單的理解:Animal和cat是繼承關(guān)系。

我們用這個方法來判斷一下cat和Animal

cat instanceof Animal; //true

從執(zhí)行結(jié)果看:cat確實是Animal實例對象,要想證實這個結(jié)果捌蚊,我們再來了解一下JS中instanceof的判斷規(guī)則:

var L = cat.__ proto __;
var R = B.prototype;
if(L === R) return true;

如果A的__ proto __ 等價于 B的prototype集畅,就返回true。

在new的執(zhí)行過程(2)中缅糟,cat的proto指向了Animal的prototype挺智,所以cat和Animal符合instanceof的判斷結(jié)果。因此窗宦,我們認(rèn)為:cat是Animal的實例對象赦颇。

簡單的總結(jié)語

在javascript中, 通過new可以產(chǎn)生原對象的一個實例對象,而這個實例對象繼承了原對象的屬性和方法赴涵。因此媒怯,new存在的意義在于它實現(xiàn)了javascript中的繼承,而不僅僅是實例化了一個對象髓窜!

6.GET和POST請求方式的區(qū)別

GET和POST是HTTP請求的兩種基本方法扇苞。

最直觀的區(qū)別就是GET把參數(shù)包含在URL中,POST通過request body傳遞參數(shù)寄纵。

①.GET請求只能進行url編碼鳖敷,而POST支持多種編碼方式。

②.GET請求參數(shù)會被完整保留在瀏覽器歷史記錄里擂啥,而POST中的參數(shù)不會被保留哄陶。

③.GET請求在URL中傳送的參數(shù)是有長度限制的,而POST沒有哺壶。

④.對參數(shù)的數(shù)據(jù)類型屋吨,GET只接受ASCII字符,而POST沒有限制山宾。

⑤.POST比GET更安全至扰,因為GET參數(shù)直接暴露在URL上,所以不能用來傳遞敏感信息资锰。

⑥.GET參數(shù)通過URL傳遞敢课,POST放在Request body中。

7.rem.js

適配移動端的Rem.js:

window.onload = function(){
    /*750代表設(shè)計師給的設(shè)計稿的寬度绷杜,你的設(shè)計稿是多少直秆,就寫多少;100代表換算比例,這里寫100是
      為了以后好算,比如鞭盟,你測量的一個寬度是100px,就可以寫為1rem,以及1px=0.01rem等等*/
    getRem(750,100)
};
window.onresize = function(){
    getRem(750,100)
};
function getRem(pwidth,prem){
    var html = document.getElementsByTagName("html")[0];
    var oWidth = document.body.clientWidth || document.documentElement.clientWidth;
    html.style.fontSize = oWidth/pwidth*prem + "px";
}

8.數(shù)組去重:

①.第一種方法

var arr=[1,2,3,4,5,6,7,6,5,4,3];
var newArr=[];
for(var i=0; i<arr.length; i++){
    if(arr.indexOf(arr[i])==i){
        newArr.push(arr[i])
    }
}
console.log(newArr);

②第二種方法

var arr=[1,2,3,4,5,6,7,6,5,4,3];
var newArr=[];
for(var i=0; i<arr.length; i++){
    if(newArr.indexOf(arr[i])==-1){
        newArr.push(arr[i])
    }
}
console.log(newArr);

③第三種方法

var arr=[1,2,3,4,5,6,7,6,5,4,3];
function quchong(arr){
    var res = [arr[0]]
    for(var i=1; i<arr.length; i++){
        var repeat = false;
        for(var j=0; j<res.length; j++){
            if(arr[i] == res[j]){
                repeat = true;
                break;
            }
        }
        if(!repeat){
            res.push(arr[i]);
        }
    }
    console.log(res);
}
quchong(arr)

9.駝峰命名法

var str='get-element-by-id';
function join(str){
    var arr=str.split('-');
    var newStr='';
    for(var i=0;i<arr.length;i++){
        if(i==0){
            newStr+=arr[i]
        }else{
            newStr+=arr[i].slice(0,1).toUpperCase()+arr[i].slice(1);
        }
    }
    console.log(newStr);
}
join(str);

10.垂直水平居中

#box {
    background-color: #FF8C00;
    width: 300px;
    height: 300px;
    position: absolute;
    top: 50%;
    left: 50%;
    margin-left: -50px;
    margin-top: -50px;
}
.inner {
    background-color: #F00;
    display: inline-block;
    width: 100px;
    height: 100px;
}

#box {
    background-color: #FF8C00;
    width: 300px;
    height: 300px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50px,-50px);
}
.inner {
    background-color: #F00;
    display: inline-block;
    width: 100px;
    height: 100px;
}

#box {
    background-color: #FF8C00;
    width: 300px;
    height: 300px;
            
    /*flex*/
    display: flex;
    justify-content: center;
    align-items: center;
}
.inner {
    background-color: #F00;
    display: inline-block;
    width: 100px;
    height: 100px;
}

#box {
    background-color: #FF8C00;
    width: 300px;
    height: 300px;
    /*table-cell*/
    display: table-cell;
    vertical-align: middle;//垂直居中
}
.inner {
    background-color: #F00;
    display: inline-block;
    margin: auto;//水平居中
    width: 100px;
    height: 100px;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末圾结,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子齿诉,更是在濱河造成了極大的恐慌筝野,老刑警劉巖晌姚,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異歇竟,居然都是意外死亡挥唠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門焕议,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宝磨,“玉大人,你說我怎么就攤上這事号坡“每荆” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵宽堆,是天一觀的道長腌紧。 經(jīng)常有香客問我,道長畜隶,這世上最難降的妖魔是什么壁肋? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮籽慢,結(jié)果婚禮上浸遗,老公的妹妹穿的比我還像新娘。我一直安慰自己箱亿,他們只是感情好跛锌,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著届惋,像睡著了一般髓帽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脑豹,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天郑藏,我揣著相機與錄音,去河邊找鬼瘩欺。 笑死必盖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俱饿。 我是一名探鬼主播歌粥,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拍埠!你這毒婦竟也來了阁吝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤械拍,失蹤者是張志新(化名)和其女友劉穎突勇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坷虑,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡甲馋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了迄损。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片定躏。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芹敌,靈堂內(nèi)的尸體忽然破棺而出痊远,到底是詐尸還是另有隱情,我是刑警寧澤氏捞,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布碧聪,位于F島的核電站,受9級特大地震影響液茎,放射性物質(zhì)發(fā)生泄漏逞姿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一捆等、第九天 我趴在偏房一處隱蔽的房頂上張望滞造。 院中可真熱鬧,春花似錦栋烤、人聲如沸谒养。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽买窟。三九已至,卻和暖如春达址,著一層夾襖步出監(jiān)牢的瞬間蔑祟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工沉唠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疆虚,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓满葛,卻偏偏與公主長得像径簿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嘀韧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

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

  • $HTML篇亭, HTTP,web綜合問題 1锄贷、前端需要注意哪些SEO 3译蒂、HTTP的幾種請求方法用途 4曼月、從瀏覽器地...
    peng凱閱讀 771評論 0 1
  • 前言 如果你覺得JS的繼承寫起來特別費勁,特別艱澀柔昼,特別不倫不類哑芹,我想說,我也有同感捕透。尤其是作為一個學(xué)過Java的...
    光頭韓閱讀 459評論 0 2
  • 各位愛美的女士和愛看美女的男士聪姿,大家現(xiàn)在好! 我叫趙連竹乙嘀,我的名字由來是這樣的末购,我外公呢一直以來都是重男輕女的思想...
    趙連竹閱讀 385評論 0 0
  • 文/大輪子 面具國的人都喜歡戴面具,但是全國只生產(chǎn)兩種面具虎谢,一種是笑臉盟榴,一種是哭臉。人們都喜歡戴笑臉嘉冒,沒有人愿意戴...
    大輪子閱讀 1,585評論 18 17
  • 他們說曹货,該嫁了 同齡嫁了,小幾歲的也嫁了 你該像顆種子一樣 找片沃土落下 你站在過去和將來之間 為有悔的青春痛哭 ...
    小灰兔講故事閱讀 350評論 1 2