摘要:雖然只有個(gè)問題,但是覆蓋了開發(fā)中的各個(gè)方面,有基本的知識(shí)點(diǎn),也有在開發(fā)過程中遇見的問題,同時(shí)也有較為開放性的問題去辨別面試者的基礎(chǔ)水準(zhǔn)和項(xiàng)目經(jīng)驗(yàn)如果自己一年前面試肯定是喜劇到悲劇的轉(zhuǎn)變。
雖然只有10個(gè)問題,但是覆蓋了angular開發(fā)中的各個(gè)方面,有基本的知識(shí)點(diǎn),也有在開發(fā)過程中遇見的問題,同時(shí)也有較為開放性的問題去辨別面試者的基礎(chǔ)水準(zhǔn)和項(xiàng)目經(jīng)驗(yàn)如果自己一年前面試肯定是喜劇到悲劇的轉(zhuǎn)變?。(PS:答案僅供參考~)。
1. ng-show/ng-hide 與 ng-if的區(qū)別?我們都知道ng-show/ng-hide實(shí)際上是通過display來進(jìn)行隱藏和顯示的。而ng-if實(shí)際上控制dom節(jié)點(diǎn)的增刪除來實(shí)現(xiàn)的。因此如果我們是根據(jù)不同的條件來進(jìn)行dom節(jié)點(diǎn)的加載的話,那么ng-if的性能好過ng-show.
2.解釋下什么是$rootScrope以及和$scope的區(qū)別?通俗的說$rootScrope 頁(yè)面所有$scope的父親。
我們來看下如何產(chǎn)生$rootScope和$scope吧。
step1:Angular解析ng-app然后在內(nèi)存中創(chuàng)建$rootScope。
step2:angular回繼續(xù)解析,找到{{}}表達(dá)式,并解析成變量。
step3:接著會(huì)解析帶有ng-controller的div然后指向到某個(gè)controller函數(shù)。這個(gè)時(shí)候在這個(gè)controller函數(shù)變成一個(gè)$scope對(duì)象實(shí)例。
3. 表達(dá)式 {{yourModel}}是如何工作的?它依賴于 $interpolation服務(wù),在初始化頁(yè)面html后,它會(huì)找到這些表達(dá)式,并且進(jìn)行標(biāo)記,于是每遇見一個(gè){{}},則會(huì)設(shè)置一個(gè)$watch。而$interpolation會(huì)返回一個(gè)帶有上下文參數(shù)的函數(shù),最后該函數(shù)執(zhí)行,則算是表達(dá)式$parse到那個(gè)作用域上。
4. Angular中的digest周期是什么?每個(gè)digest周期中,angular總會(huì)對(duì)比scope上model的值,一般digest周期都是自動(dòng)觸發(fā)的,我們也可以使用$apply進(jìn)行手動(dòng)觸發(fā)。更深層次的研究,可以移步The Digest Loop and apply。
5. 如何取消 $timeout, 以及停止一個(gè)$watch()?停止 $timeout我們可以用cancel:
var customTimeout = $timeout(function () { // your code }, 1000); $timeout.cancel(customTimeout);
停掉一個(gè)$watch:
// .$watch() 會(huì)返回一個(gè)停止注冊(cè)的函數(shù) function that we store to a variable var deregisterWatchFn = $rootScope.$watch(‘someGloballyAvailableProperty’, function (newVal) { if (newVal) { // we invoke that deregistration function, to disable the watch deregisterWatchFn(); ... } });6. Angular Directive中restrict 中分別可以怎樣設(shè)置?scope中@,=,&有什么區(qū)別?
restrict中可以分別設(shè)置:
A匹配屬性
E匹配標(biāo)簽
C匹配class
M 匹配注釋
當(dāng)然你可以設(shè)置多個(gè)值比如AEC,進(jìn)行多個(gè)匹配。
在scope中,@,=,&在進(jìn)行值綁定時(shí)分別表示
@獲取一個(gè)設(shè)置的字符串,它可以自己設(shè)置的也可以使用{{yourModel}}進(jìn)行綁定的;
= 雙向綁定,綁定scope上的一些屬性;
& 用于執(zhí)行父級(jí)scope上的一些表達(dá)式,常見我們?cè)O(shè)置一些需要執(zhí)行的函數(shù)
angular.module("docsIsolationExample", []) .controller("Controller", ["$scope", function($scope) { $scope.alertName = function() { alert("directive scope &"); } }]) .directive("myCustomer", function() { return { restrict: "E", scope: { clickHandle: "&" }, template: "", controller: function($scope) { $scope.testClick = function() { $scope.clickHandle(); } } }; });
Codepen Demo
< 進(jìn)行單向綁定。
7. 列出至少三種實(shí)現(xiàn)不同模塊之間通信方式?Service
events,指定綁定的事件
使用 $rootScope
controller之間直接使用$parent, $$childHead等
directive 指定屬性進(jìn)行數(shù)據(jù)綁定
8. 有哪些措施可以改善Angular 性能官方提倡的,關(guān)閉debug,$compileProvider
myApp.config(function ($compileProvider) { $compileProvider.debugInfoEnabled(false); });
使用一次綁定表達(dá)式即{{::yourModel}}
減少watcher數(shù)量
在無(wú)限滾動(dòng)加載中避免使用ng-repeat,關(guān)于解決方法可以參考這篇文章
使用性能測(cè)試的小工具去挖掘你的angular性能問題,我們可以使用簡(jiǎn)單的console.time()也可以借助開發(fā)者工具以及Batarang
console.time("TimerName"); //your code console.timeEnd("TimerName");9. 你認(rèn)為在Angular中使用jQuery好么?
這是一個(gè)開放性的問題,盡管網(wǎng)上會(huì)有很多這樣的爭(zhēng)論,但是普遍還是認(rèn)為這并不是一個(gè)特別好的嘗試。其實(shí)當(dāng)我們學(xué)習(xí)Angular的時(shí)候,我們應(yīng)該做到從0去接受angular的思想,數(shù)據(jù)綁定,使用angular自帶的一些api,合理的路由組織和,寫相關(guān)指令和服務(wù)等等。angular自帶了很多api可以完全替代掉jquery中常用的api,我們可以使用angular.element,$http,$timeout,ng-init等。
我們不妨再換個(gè)角度,如果業(yè)務(wù)需求,而對(duì)于一個(gè)新人(比較熟悉jQuery)的話,或許你引入jQuery可以讓它在解決問題,比如使用插件上有更多的選擇,當(dāng)然這是通過影響代碼組織來提高工作效率,隨著對(duì)于angular理解的深入,在重構(gòu)時(shí)會(huì)逐漸摒棄掉當(dāng)初引入jquery時(shí)的一些代碼。(?Po主就是這樣的人,希望不要被嘲笑,業(yè)務(wù)卻是趕著走)
所以我覺得兩種框架說完全不能一起用肯定是錯(cuò)的,但是我們還是應(yīng)該盡力去遵循angular的設(shè)計(jì)。
10. 如何進(jìn)行angular的單元測(cè)試我們可以使用karam+jasmine 進(jìn)行單元測(cè)試,我們通過ngMock引入angular app然后自行添加我們的測(cè)試用例。
一段簡(jiǎn)單的測(cè)試代碼:
describe("calculator", function () { beforeEach(module("calculatorApp")); var $controller; beforeEach(inject(function(_$controller_){ $controller = _$controller_; })); describe("sum", function () { it("1 + 1 should equal 2", function () { var $scope = {}; var controller = $controller("CalculatorController", { $scope: $scope }); $scope.x = 1; $scope.y = 2; $scope.sum(); expect($scope.z).toBe(3); }); }); });
關(guān)于測(cè)試,大家可以看下使用karma進(jìn)行angular測(cè)試
除了Karam , Angular.js團(tuán)隊(duì)推出了一款e2e(end-to-end)的測(cè)試框架protractor
參考11 Essential AngularJS Interview Questions
11 Tips to Improve AngularJS Performance
AngularJS: My solution to the ng-repeat performance problem
29 AngularJS Interview Questions – Can You Answer Them All?
The Digest Loop and $apply
What is the difference between "@" and "=" in directive scope
Angular compile
本文同步博客:http://www.jackpu.com/shi-ge-jing-chang-yu-jian-de-angular-jsmian-shi-wen-ti/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/79786.html
摘要:是指可能導(dǎo)致程序終止的非常嚴(yán)重的時(shí)間。具有最高的級(jí)別,旨在關(guān)閉中的日志功能。因此為每一個(gè)消息選擇一個(gè)合適的日志級(jí)別是非常重要的。日志的個(gè)小建議將日志訪日代碼塊它能顯著的減少因?yàn)樽址唇佣鴰淼男阅艿挠绊憽? 前言 首先,這篇文章沒有進(jìn)行任何的日志功能的詳細(xì)介紹,而是對(duì)日志提出了幾種最佳實(shí)踐。適合對(duì)日志記錄有所了解的同學(xué)閱讀。下面是正文: JAVA日志管理既是一門科學(xué),又是一門藝術(shù)??茖W(xué)...
摘要:春招結(jié)果五月份了,春招已經(jīng)接近尾聲,因?yàn)榈搅酥芪逋砩蟿偤糜锌?,所以?jiǎn)單地記錄一下自己的春招過程。我的春招從二月初一直持續(xù)到四月底,截止今天,已經(jīng)斬獲唯品會(huì)電商前端研發(fā)部大數(shù)據(jù)與威脅分析事業(yè)部京東精銳暑假實(shí)習(xí)生的騰訊的是早上打過來的。 春招結(jié)果 五月份了,春招已經(jīng)接近尾聲,因?yàn)榈搅酥芪逋砩蟿偤糜锌?,所以?jiǎn)單地記錄一下自己的春招過程。我的春招從二月初一直持續(xù)到四月底,截止今天,已經(jīng)斬獲唯品...
摘要:對(duì)于程序員來說,更意味著代碼的組織,工作成員之間的協(xié)作方式。我常犯的一個(gè)錯(cuò)誤是直接在或分支上直接,而團(tuán)隊(duì)是不允許這樣做的。 先介紹下背景,博主由運(yùn)營(yíng)轉(zhuǎn)行前端,入職一個(gè)月,完成了一個(gè)相對(duì)較大的模塊。由于基礎(chǔ)相對(duì)薄弱,犯下了不少錯(cuò)誤,故想記錄下來警醒自己和分享各位。 前端技術(shù)棧是 ES6 + backbone + react + antdUI,后端使用的 Ruby on Rails。 1....
摘要:對(duì)于程序員來說,更意味著代碼的組織,工作成員之間的協(xié)作方式。我常犯的一個(gè)錯(cuò)誤是直接在或分支上直接,而團(tuán)隊(duì)是不允許這樣做的。 先介紹下背景,博主由運(yùn)營(yíng)轉(zhuǎn)行前端,入職一個(gè)月,完成了一個(gè)相對(duì)較大的模塊。由于基礎(chǔ)相對(duì)薄弱,犯下了不少錯(cuò)誤,故想記錄下來警醒自己和分享各位。 前端技術(shù)棧是 ES6 + backbone + react + antdUI,后端使用的 Ruby on Rails。 1....
閱讀 4246·2021-09-27 14:02
閱讀 1939·2019-08-30 15:56
閱讀 1885·2019-08-29 18:44
閱讀 3426·2019-08-29 17:21
閱讀 618·2019-08-26 17:15
閱讀 1306·2019-08-26 13:57
閱讀 1394·2019-08-26 13:56
閱讀 3033·2019-08-26 11:30