這篇文章給大家分享的是有關(guān)JavaScript運(yùn)算符優(yōu)先級(jí)是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考。一起跟隨小編過來看看吧。
成都創(chuàng)新互聯(lián)公司專注于民權(quán)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供民權(quán)營銷型網(wǎng)站建設(shè),民權(quán)網(wǎng)站制作、民權(quán)網(wǎng)頁設(shè)計(jì)、民權(quán)網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造民權(quán)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供民權(quán)網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
寫了兩年的JavaScript的我,原以為是不會(huì)在語法上陰溝里翻船的,可是事實(shí)上被打臉,最近在產(chǎn)品開發(fā)中組里的一個(gè)帥小伙找我討論一個(gè)問題,為了方便大家閱讀,我將這個(gè)問題的模型抽象出來:
var provider = { test: { $get: function(){ return function anonymous(config){ }; } } }; var type = "test"; var config = {}; new provider[type].$get()(config);
上面的語句運(yùn)行時(shí)候?yàn)槭裁春瘮?shù)anonymous
中的this
指向的是window
而不是new
創(chuàng)建的新對(duì)象。我當(dāng)時(shí)聽到這個(gè)問題的第一時(shí)刻想的是: 納尼 !怎么可能new
操作符對(duì)應(yīng)的構(gòu)造函數(shù)中的this
指向的不是新創(chuàng)建的對(duì)象實(shí)例呢?當(dāng)時(shí)由于并沒有仔細(xì)地將問題從業(yè)務(wù)中抽象出來,其實(shí)我也有點(diǎn)迷糊,但仔細(xì)一想,這個(gè)語句到底要表達(dá)什么呢?
思考
在說這個(gè)表達(dá)式所要表達(dá)的含義之前,先說一個(gè)關(guān)于new操作符的幾個(gè)小知識(shí):
構(gòu)造函數(shù)的返回
JavaScript構(gòu)造函數(shù)中可以返回值,也可以不返回值,比如:
function Person(){ } var person = new Person()
我們知道這個(gè)時(shí)候構(gòu)造函數(shù)返回的是創(chuàng)建的實(shí)例對(duì)象,也就是構(gòu)造函數(shù)中this
所指向的對(duì)象。但是當(dāng)你構(gòu)造函數(shù)有返回值時(shí),就要分情況區(qū)分。如果返回的是一個(gè)非引用類型的值時(shí),實(shí)際上返回的是仍然是新創(chuàng)建的實(shí)例對(duì)象。但是當(dāng)返回的是一個(gè)引用類型的值時(shí),返回的是引用對(duì)象本身。比如:
function Person(){ return function(){} } var person = new Person() typeof person // "function"
在JavaScript中函數(shù)作為一等公民,實(shí)質(zhì)上就是引用類型,因此person就是返回的匿名函數(shù)。
new操作符的兩種形態(tài)
其實(shí)在MDN的new操作符描述中,語法是
new constructor[([arguments])]
你會(huì)發(fā)現(xiàn)([arguments])被中括號(hào)所包圍也就意味著可缺省,因此,如果對(duì)于不含參數(shù)的構(gòu)造函數(shù)而言:new Person()與new Person二者并無區(qū)別,那我們接著思考一個(gè)問題,對(duì)于前面返回函數(shù)的Person而言,當(dāng)new Person()的時(shí)候?yàn)槭裁磮?zhí)行的是new Person()而不是(new Person)()呢。之前如果閱讀過我之前的一篇文章的同學(xué)知道,帶有參數(shù)的new操作符的優(yōu)先級(jí)大于無參數(shù)列表的new操作符。因此總是會(huì)執(zhí)行第一種而不是第二種。
了解上面的步驟之后,我們已經(jīng)接近了問題的本質(zhì),對(duì)于表達(dá)式
new provider[type].$get()(config);
JavaScript引擎到底是解析成:
(new provider[type].$get())(config);
還是
new (provider[type].$get())(config);
對(duì)于第一種形式而言,(new provider[type].$get())返回的是anonymous函數(shù),因此在anonymous(config)中內(nèi)部this指向是window。而第二種模式中provider[type].$get()返回的是anonymous函數(shù),因此運(yùn)行new anonymous(config)時(shí)內(nèi)部的this指針指向的是新創(chuàng)建的實(shí)例this。
當(dāng)然我們從問題: this為什么指向的是window而不是new創(chuàng)建的新對(duì)象中可以看出來,其實(shí)作者當(dāng)時(shí)想要表達(dá)的是第二種含義,但實(shí)際上卻以第一種方式在運(yùn)行。為什么?原因非常簡單,第一種執(zhí)行方式JavaScript引擎首先解析的是帶參數(shù)列表的的new操作符,而第二種方式則是先執(zhí)行了函數(shù)調(diào)用,再執(zhí)行的是new操作符,我們對(duì)照上面的優(yōu)先級(jí)圖可以看到,帶參數(shù)列表的new優(yōu)先級(jí)高于函數(shù)調(diào)用,因此肯定是以第一種方式去運(yùn)行。
其實(shí)這篇文章并沒有多少干貨,但是從中還是有兩點(diǎn)感悟吧,第一,從上一篇同類文章中我就強(qiáng)調(diào)避免使用這種模糊不清的表達(dá)式,多用幾個(gè)括號(hào)一切問題都迎刃而解,比如有的同學(xué)會(huì)寫出類似于:
var str = "Hello" + true ? "World" : "JavaScript";
那請問str內(nèi)容是什么呢,有的人可能認(rèn)為是Hello World,有的人會(huì)認(rèn)為是World,實(shí)質(zhì)上運(yùn)算的結(jié)果是World,
因?yàn)?運(yùn)算符優(yōu)先級(jí)是高于條件運(yùn)算符的,這時(shí)候添加括號(hào)會(huì)讓你的代碼變得更加易于閱讀。第二,保持對(duì)技術(shù)的敬畏吧,最怕的就是你覺得你都會(huì)了,其實(shí)你一無所知。
感謝各位的閱讀!關(guān)于JavaScript運(yùn)算符優(yōu)先級(jí)是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
分享名稱:JavaScript運(yùn)算符優(yōu)先級(jí)是什么
URL地址:http://jinyejixie.com/article32/ppshsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、自適應(yīng)網(wǎng)站、服務(wù)器托管、動(dòng)態(tài)網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)