這篇文章為大家總結分享13個關於angular的前端面試題。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
1,ng-if 跟 ng-show/hide 的差別有哪些?
第一點差異是,ng-if
在後面表達式為true
的時候才創建這個dom
節點, ng-show
是初始時就創建了,用display:block
和display:none
來控制顯示和不顯示。
第二點差異是,ng-if
會(隱含地)產生新作用域,ng-switch
、 ng-include
等會動態創造一塊介面的也是如此。
這樣會導致,在ng-if
中用基本變數綁定ng-model
,並在外層p
中把此model
綁定給另一個顯示區域,當內層改變時,外層不會同步改變,因為此時已經是兩個變數了。
<p>{{name}}</p> <div ng-if="true"> <input type="text" ng-model="name"> </div>
相關教學建議:《angular教學》
ng-show
不存在此問題,因為它不自帶一級作用域。
避免這類問題出現的方法是,始終將頁面中的元素綁定到物件的屬性(data.x)而不是直接綁定到基本變數(x)上。
2,ng-repeat迭代數組的時候,如果數組中有相同值,會有什麼問題,如何解決?
會提示 Duplicates in a repeater are not allowed
. 加 track by $index
可解決。當然,也可以 trace by
任何一個普通的值,只要能唯一性標識數組中的每一項即可(建立 dom
和資料之間的關聯)。
3,ng-click 中寫的表達式,能使用 JS 原生物件上的方法嗎?
不只ng-click
中的表達式,只要是在頁面中,都不能直接呼叫原生的JS
方法,因為這些並不存在於與頁面對應的Controller
的$scope
中。
4、factory、service 和 provider 是什麼關係?
factory
:把service
的方法和資料放在一個物件裡,並回傳這個物件
service
:透過建構函式方式建立service
,傳回一個實例化物件
provider
:建立一個可透過config
設定的service
,$get
中傳回的,就是用factory
建立service
的內容
從底層實作上來看,service
呼叫了factory
,傳回其實例;factory 呼叫了provider
,傳回其$get
中定義的內容。 factory
和service
功能類似,只不過factory
是普通function
,可以回傳任何東西(return
的都可以被訪問,所以那些私有變數怎麼寫,你懂的);
service
是建構器,可以不回傳(綁定到this
的都可以被存取);
provider
是加強版factory
,傳回一個可設定的factory
。
5、angular 中控制器之間如何通訊?
1、Service
2、events
,指定綁定的事件
3、使用$rootScope
4、controller
之間直接使用$parent, $$childHead
等
5、directive
指定屬性進行資料綁定
6,angular 的資料綁定採用什麼機制?詳述原理
使用的髒檢查機制,所謂的雙向綁定,其實就是從介面的操作能即時反映到數據,數據的變更能即時展現到介面。 AngularJS
在$scope
變數中使用髒值檢查來實現了資料雙向綁定,並且可以透過$scope.$watch
來監聽變化觸發回調;
angular
中使用的是髒檢查機制,在angular
中每次你綁定一些東西到你的UI上時你就會往 $watch
佇列插入一條$watch
,當我們的模版載入完成時,也就是在linking
階段(Angular
分成 compile
階段和linking
階段—譯者註),Angular
解釋器會尋找每個directive
,然後產生每個需要的 $watch
。
当浏览器接受到可以被angular context
处理的事件时就会触发digest
循环,这个循环是由两个更小的循环组合起来的,一个是$watch
列表,一个是$evalAsync
列表,而$watch
列表在$digest
循环中被“脏值检查”解析,在digest
将会遍历我们的watch
,然后询问它是否有属性和值的变化,直到$watch
队列都检查过,在检查数据变化的时候,由于并不知道这个事件是对哪些数据进行了更改,以及这个事件有可能造成事件之外的其他任何地方的数据更改,所以必须进行一次大检查,将所有“注册”过的值全部检查一遍,一次检查称为一个周期,每次最少检查两遍,因为第二遍用来确认,前一遍的变动中是否有数据的变动,导致了其他数据的变动,如果第二次有变动的话,会再执行一遍,直到最后两次完全一致,则停止检查(其实就是个(递归(遍历))的过程),考虑到内存的消耗和死循环的风险,脏检查每个周期最多递归执行10遍,如果超过10遍就会抛出一个错误。当$digest
循环结束时,DOM
相应地变化。
在angular
中
ng-click,ng-change,ng-blur..
.就是对各类用户事件的封装
$timeout,$http,$window,$location...
就是对各种JS/API
事件的封装
ng-model
,以及控制器中的数据,就是对值的“注册”
$scope
本质是一个总的事件逻辑的封装容器,同时抽象为数据载体,实质上数据都存在于浏览器堆内存中
$scope.apply() & $scope.digest()
即Angular
中的“数据大检查”的function
所以如果我们使用了非Angular
封装的事件改编数据时,要手动执行一次大检查
由于Angular
这种脏检查的方法效率不高,如果一个页面绑定的view
超过2000个,就可能存在比较明显的性能问题,官方称之为“脏检查”
举个例子
<button ng-click="val=val+1">increase 1</button>
click
时会产生一次更新的操作(至少触发两次 $digest
循环)
按下按钮浏览器接收到一个事件,进入到angular context
$digest
循环开始执行,查询每个 $watch
是否变化
由于监视$scope.val
的 $watch
报告了变化,因此强制再执行一次 $digest
循环 新的 $digest
循环未检测到变化
浏览器拿回控制器,更新 $scope.val
新值对应的 dom
$digest
循环的上限是 10 次(超过 10次后抛出一个异常,防止无限循环)。
7、一个 angular 应用应当如何良好地分层?
目录结构的划分
对于小型项目,可以按照文件类型组织,比如:
css js controllers models services filters templates
但是对于规模较大的项目,最好按业务模块划分,比如:
css modules account controllers models services filters templates disk controllers models services filters templates
modules
下最好再有一个 common
目录来存放公共的东西。
逻辑代码的拆分
作为一个 MVVM
框架,Angular
应用本身就应该按照 模型,视图模型(控制器),视图来划分。
这里逻辑代码的拆分,主要是指尽量让 controller
这一层很薄。提取共用的逻辑到 service
中 (比如后台数据的请求,数据的共享和缓存,基于事件的模块间通信等),提取共用的界面操作到 directive
中(比如将日期选择、分页等封装成组件等),提取共用的格式化操作到 filter
中等等。
在复杂的应用中,也可以为实体建立对应的构造函数,比如硬盘(Disk
)模块,可能有列表、新建、详情这样几个视图,并分别对应的有 controller
,那么可以建一个 Disk
构造函数,里面完成数据的增删改查和验证操作,有跟 Disk
相关的 controller
,就注入 Disk
构造器并生成一个实例,这个实例就具备了增删改查和验证方法。这样既层次分明,又实现了复用(让 controller
层更薄了)。
8、angular 应用常用哪些路由库,各自的区别是什么?
Angular1.x
中常用 ngRoute
和 ui.router
,还有一种为 Angular2
设计的 new router
(面向组件)。后面那个没在实际项目中用过,就不讲了。
无论是 ngRoute
还是 ui.router
,作为框架额外的附加功能,都必须以 模块依赖 的形式被引入。
区别
ngRoute
模块是 Angular
自带的路由模块,而 ui.router
模块是基于 ngRoute
模块开发的第三方模块。
ui.router
是基于 state
(状态)的, ngRoute
是基于 url
的,ui.router
模块具有更强大的功能,主要体现在视图的嵌套方面。
使用 ui.router
能够定义有明确父子关系的路由,并通过 ui-view
指令将子路由模版插入到父路由模板的 <p ui-view></p>
中去,从而实现视图嵌套。而在 ngRoute
中不能这样定义,如果同时在父子视图中 使用了 <p ng-view></p>
会陷入死循环。
分属不同团队进行开发的 angular
应用,如果要做整合,可能会遇到哪些问题,如何解决?
可能会遇到不同模块之间的冲突。
比如一个团队所有的开发在 moduleA 下进行,另一团队开发的代码在 moduleB 下
angular.module(&#39;myApp.moduleA&#39;, []) .factory(&#39;serviceA&#39;, function(){ ... }) angular.module(&#39;myApp.moduleB&#39;, []) .factory(&#39;serviceA&#39;, function(){ ... }) angular.module(&#39;myApp&#39;, [&#39;myApp.moduleA&#39;, &#39;myApp.moduleB&#39;])
会导致两个 module
下面的 serviceA
发生了覆盖。
貌似在 Angular1.x
中并没有很好的解决办法,所以最好在前期进行统一规划,做好约定,严格按照约定开发,每个开发人员只写特定区块代码。
9、angular 的缺点有哪些?
强约束
导致学习成本较高,对前端不友好。
但遵守 AngularJS
的约定时,生产力会很高,对 Java
程序员友好。
不利于 SEO
因为所有内容都是动态获取并渲染生成的,搜索引擎没法爬取。
一种解决办法是,对于正常用户的访问,服务器响应 AngularJS 应用的内容;对于搜索引擎的访问,则响应专门针对 SEO 的HTML页面。
性能问题
作为 MVVM 框架,因为实现了数据的双向绑定,对于大数组、复杂对象会存在性能问题。
可以用来 优化 Angular 应用的性能 的办法:
减少监控项(比如对不会变化的数据采用单向绑定)
主动设置索引(指定 track by
,简单类型默认用自身当索引,对象默认使用 $$hashKey
,比如改为 track by item.id
)
降低渲染数据量(比如分页,或者每次取一小部分数据,根据需要再取)
数据扁平化(比如对于树状结构,使用扁平化结构,构建一个 map
和树状数据,对树操作时,由于跟扁平数据同一引用,树状数据变更会同步到原始的扁平数据)
另外,对于Angular1.x ,存在 脏检查 和 模块机制 的问题。
移动端
可尝试 Ionic,但并不完善。
10、解释下什么是$rootScrope
以及和$scope
的区别?
通俗的说$rootScrope
页面所有$scope
的父亲
如何产生$rootScope
和$scope
吧。
step1:Angular解析ng-app
然后在内存中创建$rootScope
。
step2:angular回继续解析,找到{{}}表达式,并解析成变量。
step3:接着会解析带有ng-controller
的p
然后指向到某个controller
函数。这个时候在这个controller
函数变成一个$scope
对象实例。
**11、如何取消 $timeout
, 以及停止一个$watch()
? **
停止 $timeout
我们可以用cancel
:
var customTimeout = $timeout(function () { // your code }, 1000); $timeout.cancel(customTimeout);
停掉一个$watch
:
// .$watch()
会返回一个停止注册的函数
function that we store to a variable var deregisterWatchFn = $rootScope.$watch(‘someGloballyAvailableProperty&#39;, function (newVal) { if (newVal) { // we invoke that deregistration function, to disable the watch deregisterWatchFn(); ... } });
12、Angular Directive中restrict 中分别可以怎样设置?scope中@,=,&有什么区别?
restrict中可以分别设置:
A匹配属性
E匹配标签
C匹配class
M 匹配注释
当然你可以设置多个值比如AEC,进行多个匹配。
在scope中,@,=,&在进行值绑定时分别表示
@
获取一个设置的字符串,它可以自己设置的也可以使用{<!-- -->{yourModel}}
进行绑定的;
=
双向绑定,绑定scope
上的一些属性;
&
用于执行父级scope
上的一些表达式,常见我们设置一些需要执行的函数
13、$apply()
和 $digest()
的区别
安全性:$apply()
可以接收一個參數作為function()
,這個function
會被包裝到一個try … catch
區塊中,所以一旦有異常發生,該例外會被$exceptionHandler service
處理。
$apply
會使ng
進入$digest cycle
, 並從$rootScope
開始遍歷(深度優先)檢查資料變更。
$digest
只會檢查該scope和它的子scope
,當你確定目前操作只影響它們時,用$digest
可以稍微提升性能。
更多程式相關知識,請造訪:程式設計影片! !
以上是13個關於angular的前端面試題(總結)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版
好用的JavaScript開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版
視覺化網頁開發工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。