一、var,let,cont聲明變量的區(qū)別
1赡矢、var的特點(diǎn)
1杭朱、存在變量提升阅仔;
2、一個(gè)變量可多次聲明弧械,后面的聲明會(huì)覆蓋前面的聲明八酒;
3、在函數(shù)中使用var聲明變量的時(shí)候刃唐,該變量是局部的羞迷;而如果在函數(shù)內(nèi)不使用var,該變量是全局的画饥。
2衔瓮、let的特點(diǎn)
1、不存在變量提升抖甘,let聲明變量前热鞍,該變量不能使用(暫時(shí)性死區(qū));
2单山、let命令所在的代碼塊內(nèi)有效碍现,在塊級(jí)作用域內(nèi)有效;
3米奸、let不允許在相同作用域中重復(fù)聲明昼接,注意是相同作用域,不同作用域有重復(fù)聲明不會(huì)報(bào)錯(cuò)悴晰。
3慢睡、const的特點(diǎn)
1、const聲明一個(gè)只讀的變量铡溪,聲明后漂辐,值就不能改變;
2棕硫、const必須初始化髓涯;
3、const并不是變量的值不能改動(dòng)哈扮,而是變量指向的內(nèi)存地址所保存的數(shù)據(jù)不得改動(dòng)纬纪;
4、let該有的特點(diǎn)const都有滑肉;
4包各、區(qū)別
1.變量提升
var聲明的變量存在變量提升,即變量可以在聲明之前調(diào)用靶庙,值為undefined问畅;
let和const不存在變量提升,即它們所聲明的變量一定要在聲明后使用,否則報(bào)錯(cuò)护姆。
2.塊級(jí)作用域
var不存在塊級(jí)作用域矾端;
let和const存在塊級(jí)作用域。
3.重復(fù)聲明
var允許重復(fù)聲明變量卵皂;
let和const在同一作用域不允許重復(fù)聲明變量须床。
4.修改聲明的變量
var和let可以;
const聲明一個(gè)只讀的常量渐裂。一旦聲明,常量的值就不能改變钠惩,但對(duì)于對(duì)象和數(shù)據(jù)這種引用類(lèi)型柒凉,內(nèi)存地址不能修改,可以修改里面的值篓跛。
5膝捞、使用
能用const的情況下盡量使用const,大多數(shù)情況使用let愧沟,避免使用var蔬咬。
const > let > var
const聲明的好處,一讓閱讀代碼的人知道該變量不可修改沐寺,二是防止在修改代碼的過(guò)程中無(wú)意中修改了該變量導(dǎo)致報(bào)錯(cuò)林艘,減少bug的產(chǎn)生。let聲明沒(méi)有產(chǎn)生預(yù)編譯和變量提升的問(wèn)題混坞,先聲明再使用可以讓代碼本身更加規(guī)范狐援,let是個(gè)塊級(jí)作用域,也不會(huì)污染到全局的變量聲明究孕。
最后說(shuō)一點(diǎn)就是使用的場(chǎng)景說(shuō)明:let一般應(yīng)用于基本數(shù)據(jù)類(lèi)型啥酱;const 一般應(yīng)用于引用數(shù)據(jù)類(lèi)型,也就是函數(shù)對(duì)象等厨诸。
二镶殷、普通函數(shù)和箭頭函數(shù)的區(qū)別
聲明方式不同:普通函數(shù)可以是聲明式的,也可以是賦值式微酬;而箭頭函數(shù)只能是賦值式的绘趋;
this指向不同:普通函數(shù)有原型prototype,this指向不確定得封;箭頭函數(shù)本身沒(méi)有this埋心,因?yàn)闆](méi)有原型,this指向確定忙上,指向他父級(jí)作用域拷呆;
new不同:普通函數(shù)可以new;箭頭函數(shù)不能new,沒(méi)有prototype屬性茬斧,也不可以被當(dāng)作構(gòu)造函數(shù)腰懂;
傳參方式:普通函數(shù)可以獲取 arguments對(duì)象,箭頭函數(shù)不能獲取可以通過(guò) ...rest 项秉,用 rest 對(duì)象代替绣溜。
三、http和https的區(qū)別
HTTP:是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議娄蔼,是一個(gè)客戶端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP)怖喻,用于從服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議,它可以使瀏覽器更加高效岁诉,使網(wǎng)絡(luò)傳輸減少锚沸。
HTTPS的全稱(chēng)是超文本傳輸安全協(xié)議(Hypertext Transfer Protocol Secure),是以安全為目標(biāo)的HTTP通道涕癣,是一種網(wǎng)絡(luò)安全傳輸協(xié)議哗蜈。在HTTP的基礎(chǔ)上加入SSL/TLS來(lái)進(jìn)行數(shù)據(jù)加密,保護(hù)交換數(shù)據(jù)不被泄露坠韩、竊取距潘。
兩者區(qū)別:
一、HTTPS協(xié)議需要到證書(shū)頒發(fā)機(jī)構(gòu)CA申請(qǐng)證書(shū)只搁,HTTP不用申請(qǐng)證書(shū)音比;
二、HTTP是超文本傳輸協(xié)議须蜗,屬于應(yīng)用層信息傳輸硅确,HTTPS 則是具有SSL加密傳安全性傳輸協(xié)議,對(duì)數(shù)據(jù)的傳輸進(jìn)行加密明肮,相當(dāng)于HTTP的升級(jí)版菱农;
三、HTTP和HTTPS使用的是完全不同的連接方式柿估,用的端口也不一樣循未,前者是80,后者是443秫舌。
四的妖、HTTP的連接很簡(jiǎn)單,是無(wú)狀態(tài)的足陨;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進(jìn)行加密傳輸嫂粟、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,比HTTP協(xié)議安全墨缘。
四星虹、es6新特性
1.新增了塊級(jí)作用域(let零抬,const)
2.提供了定義類(lèi)的語(yǔ)法糖(class)
3.新增了一種基本數(shù)據(jù)類(lèi)型(Symbol)
4.新增了變量的解構(gòu)賦值
5.函數(shù)參數(shù)允許設(shè)置默認(rèn)值,引入了rest參數(shù)宽涌,新增了箭頭函數(shù)平夜。
6.數(shù)組新增了一些API,如isArray / from / of 方法卸亮;數(shù)組實(shí)例新增了 entries()忽妒,keys() 和 values() 等方法。
7.對(duì)象和數(shù)組新增了擴(kuò)展運(yùn)算符
8.ES6新增了模塊化(import / export)
9.ES6新增了Set和Map數(shù)據(jù)結(jié)構(gòu)兼贸。
10.ES6原生提供Proxy構(gòu)造函數(shù)段直,用來(lái)生成Proxy實(shí)例
11.ES6新增了生成器(Generator)和遍歷器(Iterator)
五、簡(jiǎn)述vuex? 模塊化
在Vuex中應(yīng)用的所有需要共享和被修改的數(shù)據(jù)源都存放在state對(duì)象中溶诞,State使用是單一狀態(tài)樹(shù)結(jié)構(gòu)坷牛,當(dāng)應(yīng)用較為復(fù)雜,需要共享的數(shù)據(jù)較多時(shí)很澄,state對(duì)象以及store對(duì)象都會(huì)變得很臃腫,不利于代碼維護(hù)颜及。并且大多應(yīng)用都會(huì)根據(jù)業(yè)務(wù)分為不同的功能模塊甩苛,很多情況下不同模塊之間的數(shù)據(jù)交互并不密切,如果我們能將store也分割為不同模塊俏站,每個(gè)模塊管理不同的數(shù)據(jù)讯蒲,會(huì)使數(shù)據(jù)管理起來(lái)更加結(jié)構(gòu)清晰,方便管理肄扎。
那么為了解決以上的問(wèn)題墨林,Vuex允許我們將store分割成模塊。每個(gè)模塊擁有自己的state犯祠、mutation旭等、action、getter并且可以嵌套子模塊衡载。
六搔耕、mutation為什么不能使用異步函數(shù)
Vuex中所有的狀態(tài)更新的唯一途徑都是mutation,異步操作通過(guò) Action 來(lái)提交 mutation實(shí)現(xiàn)痰娱,這樣使得我們可以方便地跟蹤每一個(gè)狀態(tài)的變化弃榨,從而讓我們能夠?qū)崿F(xiàn)一些工具幫助我們更好地了解我們的應(yīng)用。
每個(gè)mutation執(zhí)行完成后都會(huì)對(duì)應(yīng)到一個(gè)新的狀態(tài)變更梨睁,這樣devtools就可以打個(gè)快照存下來(lái)鲸睛,然后就可以實(shí)現(xiàn) time-travel 了。
如果mutation支持異步操作坡贺,就沒(méi)有辦法知道狀態(tài)是何時(shí)更新的官辈,無(wú)法很好的進(jìn)行狀態(tài)的追蹤箱舞,給調(diào)試帶來(lái)困難。
七钧萍、vue中key的作用
1. key的作用主要是為了高效的更新虛擬DOM褐缠,其原理是vue在patch過(guò)程中通過(guò)key可以精準(zhǔn)判斷兩個(gè)節(jié)點(diǎn)是否是同一個(gè),從而避免頻繁更新不同元素风瘦,使整個(gè)patch過(guò)程更加高效队魏,減少DOM操作量,提高性能万搔;
2. 如果不設(shè)置key胡桨,還會(huì)在列表更新時(shí)引發(fā)一些隱蔽的bug;
3. vue中在使用相同標(biāo)簽名元素的過(guò)渡切換時(shí)瞬雹,也會(huì)使用到key屬性昧谊,其目的也是為了讓vue可以區(qū)分它們,否則vue只會(huì)替換其內(nèi)部屬性而不會(huì)觸發(fā)過(guò)渡效果
八酗捌、ts優(yōu)缺點(diǎn)
使用TS的好處:
(1)增強(qiáng)代碼的可讀性和可維護(hù)性呢诬,強(qiáng)類(lèi)型的系統(tǒng)相當(dāng)于最好的文檔,在編譯時(shí)即可發(fā)現(xiàn)大部分的錯(cuò)誤胖缤,增強(qiáng)編輯器的功能尚镰。
(2)包容性,js文件可以直接改成 ts 文件哪廓,不定義類(lèi)型可自動(dòng)推論類(lèi)型狗唉,可以定義幾乎一切類(lèi)型,ts 編譯報(bào)錯(cuò)時(shí)也可以生成 js 文件涡真,兼容第三方庫(kù)分俯,即使不是用ts編寫(xiě)的
(3)有活躍的社區(qū),大多數(shù)的第三方庫(kù)都可提供給 ts 的類(lèi)型定義文件哆料,完全支持 es6 規(guī)范
使用 TS 的缺點(diǎn):
(1)增加學(xué)習(xí)成本缸剪,需要理解接口(Interfaces)和泛型(Generics),類(lèi)(class)东亦,枚舉類(lèi)型(Enums)
(2)短期增加開(kāi)發(fā)成本橄登,增加類(lèi)型定義拢锹,但減少維護(hù)成本
(3)ts 集成到構(gòu)建流程需要一定的工作量
(4)和有些庫(kù)結(jié)合時(shí)不是很完美
九卒稳、vue3新特性
首先是向下兼容充坑,Vue3 支持大多數(shù) Vue2 的特性捻爷。甚至就拿 Vue2 的語(yǔ)法開(kāi)發(fā) Vue3也榄,也是沒(méi)有任何問(wèn)題的甜紫。
性能的提升囚霸,每個(gè)人都希望使用的框架更快拓型,更輕。Vue3 做到了岩睁,給開(kāi)發(fā)者一個(gè)極致的體驗(yàn)。官方網(wǎng)站給出的數(shù)據(jù)是:打包大小減少 41%冰啃,初次渲染快 55%阎毅,更新快 133%,內(nèi)存使用減少 54%矿咕。
新推出的Composition API ,在 Vue2 中遇到的問(wèn)題就是復(fù)雜組件的代碼變的非常麻煩莲镣,甚至不可維護(hù)瑞侮。說(shuō)白了就是封裝不好半火,重用不暢梅掠。這個(gè)Composition API一推出藐鹤,立馬解決了這個(gè)問(wèn)題娱节。它是一系列 API 的合集挠蛉。
其他新特性:Teleport(瞬移組件)肄满、Suspense(解決異步加載組件問(wèn)題)和全局 API 的修改和優(yōu)化。
更好TypeScript支持稠歉,Vue3 的源代碼就是使用TypeScript進(jìn)行開(kāi)發(fā)的掰担。所以在新的版本上使用TS也更加順暢無(wú)阻怒炸。
十带饱、vue中路由meta的作用
vue-router路由元信息說(shuō)白了就是通過(guò)meta對(duì)象中的一些屬性來(lái)判斷當(dāng)前路由是否需要進(jìn)一步處理,如果需要處理勺疼,按照自己想要的效果進(jìn)行處理即可捏鱼。
用法一:登錄校驗(yàn)
用法二:通過(guò)路由元信息實(shí)現(xiàn)不同路由展示不同布局頁(yè)面
十一、map和forEach的區(qū)別
forEach()方法不會(huì)返回執(zhí)行結(jié)果看尼,而是undefined。若數(shù)組的類(lèi)型為值類(lèi)型藏斩,則不會(huì)改變?cè)瓟?shù)組窜觉,若想改變?cè)瓟?shù)組通過(guò)index這個(gè)參數(shù)來(lái)改變谷炸;若數(shù)組的類(lèi)型為引用類(lèi)型,則會(huì)改變?cè)瓟?shù)組禀挫。
map:若數(shù)組的類(lèi)型為值類(lèi)型旬陡,則會(huì)分配內(nèi)存空間存儲(chǔ)新數(shù)組并返回;若數(shù)組的類(lèi)型為引用類(lèi)型语婴,則會(huì)改變?cè)瓟?shù)組描孟。
十二、Vue中watch監(jiān)聽(tīng)第一次不觸發(fā)砰左、深度監(jiān)聽(tīng)
第一次不觸發(fā)
一:handler:其值是一個(gè)回調(diào)函數(shù)匿醒。即監(jiān)聽(tīng)到變化時(shí)應(yīng)該執(zhí)行的函數(shù)。
二:deep:其值是true或false缠导;確認(rèn)是否深入監(jiān)聽(tīng)廉羔。(一般監(jiān)聽(tīng)時(shí)是不能監(jiān)聽(tīng)到對(duì)象屬性值的變化的,數(shù)組的值變化可以聽(tīng)到僻造。)
三:immediate:其值是true或false憋他;確認(rèn)是否以當(dāng)前的初始值執(zhí)行handler的函數(shù)
十三、深拷貝和淺拷貝
如何區(qū)分深拷貝與淺拷貝
深拷貝和淺拷貝是針對(duì)復(fù)雜數(shù)據(jù)類(lèi)型(對(duì)象及數(shù)組)來(lái)說(shuō)的髓削,淺拷貝只拷貝一層竹挡,而深拷貝是層層拷貝。
深拷貝復(fù)制變量值立膛,對(duì)于非基本類(lèi)型的變量揪罕,則遞歸至基本類(lèi)型變量后,再?gòu)?fù)制宝泵。?深拷貝后的對(duì)象與原來(lái)的對(duì)象是完全隔離的好啰,互不影響,對(duì)一個(gè)對(duì)象的修改并不會(huì)影響另一個(gè)對(duì)象鲁猩。
形象的來(lái)說(shuō),假設(shè)B復(fù)制了A罢坝,當(dāng)修改A時(shí)廓握,看B是否跟著變化,如果B跟著變了嘁酿,那么就是淺拷貝隙券,如果B沒(méi)變,那么就是深拷貝闹司。
深拷貝與淺拷貝的區(qū)別
在未定義顯示拷貝構(gòu)造函數(shù)的情況下娱仔,系統(tǒng)調(diào)用默認(rèn)的構(gòu)造函數(shù)——淺拷貝,它能夠完成成員的一一復(fù)制游桩。當(dāng)數(shù)據(jù)成員沒(méi)有指針時(shí)牲迫,淺拷貝是可行的耐朴;但當(dāng)數(shù)據(jù)成員中有指針時(shí),如果采用簡(jiǎn)單的淺拷貝盹憎,則兩類(lèi)中的兩個(gè)指針將指向同一個(gè)地址筛峭,當(dāng)對(duì)象快結(jié)束時(shí),會(huì)調(diào)用兩個(gè)析構(gòu)函數(shù)陪每,然而導(dǎo)致指針懸掛現(xiàn)象影晓,此時(shí)就必須要用深拷貝。
深拷貝和淺拷貝的區(qū)別在于深拷貝會(huì)在堆內(nèi)存中另外申請(qǐng)空間來(lái)存儲(chǔ)數(shù)據(jù)檩禾,從而解決了指針懸掛問(wèn)題挂签。
淺拷貝只進(jìn)行簡(jiǎn)單的屬性值的復(fù)制。
十四盼产、宏任務(wù)和微任務(wù)
JavaScript 把異步任務(wù)又做了進(jìn)一步的劃分饵婆,異步任務(wù)又分為兩類(lèi),分別是:
① 宏任務(wù)(macrotask)? ? ? ? ? ? ? ? ? ? ? ?
1. 異步 Ajax 請(qǐng)求
2. setTimeout辆飘、setInterval啦辐、
3. 文件操作
4. 其它宏任務(wù)
② 微任務(wù)(microtask)
1. Promise.then、.catch 和 .finally
2. process.nextTick
3.其它微任務(wù)
宏任務(wù)和微任務(wù)的執(zhí)行順序?
每一個(gè)宏任務(wù)執(zhí)行完之后蜈项,都會(huì)檢查是否存在待執(zhí)行的微任務(wù)芹关,如果有,則執(zhí)行完所有微任務(wù)之后紧卒,再繼續(xù)執(zhí)行下一個(gè)宏任務(wù)侥衬。
十五、vue 生命周期
vue生命周期可以分為八個(gè)階段
beforeCreate(創(chuàng)建前)跑芳、created(創(chuàng)建后)轴总、beforeMount(載入前)、mounted(載入后)博个、beforeUpdate(更新前)怀樟、updated(更新后)、beforeDestroy(銷(xiāo)毀前)盆佣、destroyed(銷(xiāo)毀后)
十六往堡、vue計(jì)算屬性
1、什么是計(jì)算屬性
寫(xiě)在computed對(duì)象中的屬性共耍,本質(zhì)上是一個(gè)方法虑灰,不過(guò)使用時(shí)依舊當(dāng)屬性來(lái)使用
2.什么時(shí)候使用計(jì)算屬性
一個(gè)變量的值, 需要用另外變量計(jì)算而得來(lái)
3、計(jì)算屬性的配置項(xiàng)
get():必須要寫(xiě)痹兜,該函數(shù)不接受參數(shù)穆咐。當(dāng)計(jì)算屬性只需要get時(shí)才可以簡(jiǎn)寫(xiě)
get()什么時(shí)候被調(diào)用?:當(dāng)初次讀取計(jì)算屬性或者計(jì)算屬性所依賴(lài)的數(shù)據(jù)發(fā)生變化時(shí)被調(diào)用,getter函數(shù)有一個(gè)返回值,該返回值就是計(jì)算屬性的值
set():可選項(xiàng)对湃,接受一個(gè)可選參數(shù)(計(jì)算屬性被修改之后的值)
set()什么時(shí)候被調(diào)用?: 當(dāng)計(jì)算屬性被修改時(shí)被調(diào)用
get()和 set()中出現(xiàn)的this執(zhí)向vm
4崖叫、計(jì)算屬性的緩存
計(jì)算屬性是基于它們的依賴(lài)項(xiàng)的值結(jié)果進(jìn)行緩存的,只要依賴(lài)的變量不變, 都直接從緩存取結(jié)果
5.計(jì)算屬性整個(gè)過(guò)程
當(dāng)?shù)谝淮握{(diào)用get()之后熟尉,Vue實(shí)例身上會(huì)出現(xiàn)一個(gè)與計(jì)算屬性同名的屬性(我稱(chēng)為計(jì)算屬性的緩存屬性)归露,該屬性的值就是調(diào)用get()返回的值
當(dāng)再次調(diào)用getter之后,Vue把getter返回的值賦值給這個(gè)緩存屬性
緩存屬性:因此當(dāng)不是初次訪問(wèn)計(jì)算屬性時(shí)且計(jì)算屬性所依賴(lài)的數(shù)據(jù)沒(méi)有發(fā)生變化時(shí),Vue實(shí)際上用的是這個(gè)屬性斤儿,而不是再次執(zhí)行g(shù)et()
原理:底層借助了Object.defineProperty方法提供的getter和setter
十七剧包、過(guò)濾器
1.什么是過(guò)濾器?
過(guò)濾器是對(duì)即將顯示的數(shù)據(jù)做進(jìn)一步的篩選處理往果,然后進(jìn)行顯示疆液,值得注意的是過(guò)濾器并沒(méi)有改變?cè)瓉?lái)的數(shù)據(jù),只是在原數(shù)據(jù)的基礎(chǔ)上產(chǎn)生新的數(shù)據(jù)陕贮。
2.過(guò)濾器的使用
1堕油、定義過(guò)濾器
全局過(guò)濾器
Vue.filter('過(guò)濾器名稱(chēng)',function(value1[,value2,...] ) {
//邏輯代碼
})
局部過(guò)濾器
new Vue({? ? ?
filters: {? ? ?
? ? '過(guò)濾器名稱(chēng)': function (value1[,value2,...] ) {
? ? ? // 邏輯代碼? ? ? ? ? }
? ? ? ? }? ?
})? ?
2、過(guò)濾器使用的地方
1.雙花括號(hào)插值
2.v-bind表達(dá)式
十八肮之、MVVM的理解
MVVM是Model-View-ViewModel的縮寫(xiě)掉缺。MVVM是一種設(shè)計(jì)思想。Model 層代表數(shù)據(jù)模型戈擒,也可以在Model中定義數(shù)據(jù)修改和操作的業(yè)務(wù)邏輯眶明;View 代表UI 組件,它負(fù)責(zé)將數(shù)據(jù)模型轉(zhuǎn)化成UI 展現(xiàn)出來(lái)筐高,ViewModel 是一個(gè)同步View 和 Model的對(duì)象搜囱。
在MVVM架構(gòu)下,View 和 Model 之間并沒(méi)有直接的聯(lián)系柑土,而是通過(guò)ViewModel進(jìn)行交互蜀肘,Model 和 ViewModel 之間的交互是雙向的, 因此View 數(shù)據(jù)的變化會(huì)同步到Model中稽屏,而Model 數(shù)據(jù)的變化也會(huì)立即反應(yīng)到View 上扮宠。
ViewModel 通過(guò)雙向數(shù)據(jù)綁定把 View 層和 Model 層連接起來(lái),而View 和 Model 之間的同步工作完全是自動(dòng)的狐榔,無(wú)需人為干涉坛增,因此開(kāi)發(fā)者只需關(guān)注業(yè)務(wù)邏輯,不需要手動(dòng)操作DOM, 不需要關(guān)注數(shù)據(jù)狀態(tài)的同步問(wèn)題荒叼,復(fù)雜的數(shù)據(jù)狀態(tài)維護(hù)完全由 MVVM 來(lái)統(tǒng)一管理轿偎。
十九典鸡、vue組件通信的方式
組件之間通訊分為三種: 父?jìng)髯颖焕⒆觽鞲浮⑿值芙M件之間的通訊
(1)props/$emit
父?jìng)髯樱焊附M件通過(guò)import引入子組件萝玷,并注冊(cè)嫁乘,在子組件標(biāo)簽上添加要傳遞的屬性昆婿,子組 件通過(guò)props接收,接收有兩種形式一是通過(guò)數(shù)組形式[‘要接收的屬性’ ]蜓斧,二是通過(guò)對(duì)象形式{ }
子傳父:父組件向子組件傳遞事件方法仓蛆,子組件通過(guò)$emit觸發(fā)事件,回調(diào)給父組件
(2)$eimt/$on
(3)$parent / $children與 ref
二十挎春、vue雙向綁定哪個(gè)函數(shù)
vue數(shù)據(jù)雙向綁定是通過(guò)數(shù)據(jù)劫持結(jié)合發(fā)布者-訂閱者模式的方式來(lái)實(shí)現(xiàn)的,現(xiàn)數(shù)據(jù)劫持是通過(guò)Object.defineProperty()來(lái)實(shí)現(xiàn)的看疙。Object.defineProperty( )是用來(lái)做什么的?它可以來(lái)控制一個(gè)對(duì)象屬性的一些特有操作直奋,比如讀寫(xiě)權(quán)能庆、是否可以枚舉