摘要:字面量方式這是最簡單最基本的一種方法。簡單的構造函數方式通過這樣的形式創建對象。結合上面的簡單構造函數和原型,一個完整的構造函數應該是這樣的還有一種方法就是提供的簡單實現下中的,,創建一個對象談談對象的理解。避免使用表達式又稱動態屬性。
要點:數據類型、面向對象、繼承、閉包、插件、作用域、跨域、原型鏈、模塊化、自定義事件、異步裝載回調、模板引擎、Nodejs等。
JS基本類型有什么?引用類型有什么?基本類型:number,string,boolean,undefined,null
引用類型:基本類型以外的都是引用類型,如object/array/function/date等等
關于基本類型與引用類型的區別可以詳細看看@Naraku_的這篇文章:
[ JS 進階 ] 基本類型 引用類型 簡單賦值 對象引用
概況起來有這么幾個要點:
1.我們無法給基本類型的對象添加屬性和方法;
var m1 = 123; m1.name = "abc"; console.log(m1.name); //輸出:undefined
2.基本類型對象的比較是值比較,而引用類型對象的比較是引用比較;
var m1 = 123, m2 = 123; console.log(m1 === m2); //輸出:true var o1 = {}, o2 = {}; console.log(o1 === o2); //輸出:false
3.基本類型對象是存儲在棧內存中的,而引用類型對象其實是一個存儲在棧內存中的一個堆內存地址。
4.基本類型對象賦值時(執行=號操作),是在棧內存中創建一個新的空間,然后將值復制一份到新的空間里。
5.引用類型對象賦值時(執行=號操作),也是在棧內存中復制一份一樣的值,但這個值是一個堆內存地址,所以被賦值的那個對象跟前者其實是一個對象。
var o1 = {}; var o2 = o1; o1.name = "abc"; console.log(o1.name); // --> abc console.log(o2.name); // --> abc o2.age = "123"; console.log(o1.age); // --> 123 console.log(o2.age); // --> 123JS中的常見對置對象類
js的常見內置對象類:Date,Array,Math、Number、Boolean、String、Array、RegExp、Function...
來一道容易錯的小題1.大家都知道typeof null輸出Object。那么null instanceof Object嗎?
console.log( typeof null ) //輸出Object console.log( null instanceof Object) //輸出什么?
答案:false
雖然typeof null輸出Object,但null不是Object的一個實例。null是一個基本類型。之所以typeof null輸出Object,跟瀏覽器的實現有關。
這個問題經常會被問道,會寫JavaScript的人都會創建對象,時時刻刻都在用對象,但真被問起這個問題,估計很多人都沒認真思考過。 網上關于這個問題的答案也非常多,說法還不太一樣,什么構造函數方法/原型方法/混合方法等等,亂七八糟的。 在這里,我試試捋一捋,希望能夠給你一個清晰的答案。
1.字面量方式:
這是最簡單最基本的一種方法。
var obj = {};//創建了一個空的對象
字面量方法有兩種常用的形式。 一種是簡單字面量,像上面那樣先創建一個空對象,然后再給這個對象加屬性和函數。
var obj = {}; obj.attr1 = 123; obj.attr2 = "abc"; obj.func1 = function(){...}; obj.func2 = function(){...};
另一種是嵌入式字面量,像寫JSON數據似的,直接在大括號中寫屬性和函數。
var obj = { attr1 : 123, attr2 : "abc", func1 : function(){...}, func2 : function(){...} };
2.簡單的構造函數方式
通過new Person()這樣的形式創建對象。用new這個關鍵字是為了討好習慣了C++/Java的程序員的使用習慣。但也是JS的一大敗筆(大牛都是這么說的,我只是有樣學樣)。
function Person(name,age){ this.name = name; this.age = age; } var p1 = new Person("Peter",20); var p2 = new Person("Jack",21);
3.原型方式
function Person(){} Person.prototype.say = function(){...}; var p1 = new Person(); var p2 = new Person();
跟簡單的構造函數形式不同的是,綁在this上的name/age是p1/p2對象獨占的(私有的),而綁在prototype上的say方法是p1/p2對象共享的(公有的)。
4.構造函數+原型
有的人把這種方式稱為“混合模式”,其實不是什么獨特的模式,而是因為單純地使用構造函數和單純地使用原型方式都是不合適的。 試想一下,類的概念就是希望屬于這個類的對象有著相同名稱的屬性和方法,但屬性是私有的,方法是共享的,你叫什么名字,幾歲,是你這對象私有的屬性,但說話這動作是大家都一樣,只是內容不一樣而已,所有方法應該共享的。 結合上面的簡單構造函數和原型,一個完整的構造函數應該是這樣的:
function Person(name,age){ this.name = name; this.age = age; } Person.prototype.say = function(){ console.log("My name is "+this.name+". I"m "+this.age+" years old."); } var p1 = new Person("Peter",20); var p2 = new Person("Jack",21);
還有一種方法就是ES5提供的Object.create()
簡單實現下JS中的Map,forEach,reduceArray.prototype.map = function (fn) { var resultArray = []; for (var i = 0,len = this.length; i < len ; i++) { resultArray[i] = fn.apply(this,[this[i],i,this]); } return resultArray; } Array.prototype.forEach = function (fn) { for (var i = 0,len = this.length; i < len ; i++) { fn.apply(this,[this[i],i,this]); } } Array.prototype.reduce= function (fn) { var formerResult = this[0]; for (var i = 1,len = this.length; i < len ; i++) { formerResult = fn.apply(this,[formerResult,this[i],i,this]); } return formerResult; }
1.創建一個對象
function Person(name, age) { this.name = name; this.age = age; this.sing = function() { alert(this.name) } }
2.談談This對象的理解。
this是js的一個關鍵字,隨著函數使用場合不同,this的值會發生變化。
但是總有一個原則,那就是this指的是調用函數的那個對象。
this一般情況下:是全局對象Global。 作為方法調用,那么this就是指這個對象
3.事件、IE與火狐的事件機制有什么區別? 如何阻止冒泡?
我們在網頁中的某個操作(有的操作對應多個事件)。例如:當我們點擊一個按鈕就會產生一個事件。是可以被 JavaScript 偵測到的行為。
事件處理機制:IE是事件冒泡、火狐是 事件捕獲;
ev.stopPropagation();
4.什么是閉包(closure),為什么要用?
待完善 執行say667()后,say667()閉包內部變量會存在,而閉包內部函數的內部變量不會存在.使得Javascript的垃圾回收機制GC不會收回say667()所占用的資源,因為say667()的內部函數的執行需要依賴say667()中的變量。這是對閉包作用的非常直白的描述. function say667() { // Local variable that ends up within closure var num = 666; var sayAlert = function() { alert(num); } num++; return sayAlert; } var sayAlert = say667(); sayAlert()//執行結果應該彈出的667
5.如何判斷一個對象是否屬于某個類?
使用instanceof (待完善)
if(a instanceof Person){ alert("yes"); }
6.new操作符具體干了什么呢?
1、創建一個空對象,并且 this 變量引用該對象,同時還繼承了該函數的原型。
2、屬性和方法被加入到 this 引用的對象中。
3、新創建的對象由 this 所引用,并且最后隱式的返回 this 。
var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj);
7.JSON 的了解
JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。它是基于JavaScript的一個子集。數據格式簡單, 易于讀寫, 占用帶寬小
{"age":"12", "name":"back"}
8.js延遲加載的方式有哪些
defer和async、動態創建DOM方式(用得最多)、按需異步載入js
9.ajax 是什么?ajax 的交互模型?同步和異步的區別?如何解決跨域問題?
待完善
通過異步模式,提升了用戶體驗
優化了瀏覽器和服務器之間的傳輸,減少不必要的數據往返,減少了帶寬占用
Ajax在客戶端運行,承擔了一部分本來由服務器承擔的工作,減少了大用戶量下的服務器負載。
Ajax的最大的特點是什么。
Ajax可以實現動態不刷新(局部刷新)
readyState屬性 狀態 有5個可取值: 0=未初始化 ,1=正在加載 2=以加載,3=交互中,4=完成
ajax的缺點
1、ajax不支持瀏覽器back按鈕。
2、安全問題 AJAX暴露了與服務器交互的細節。
3、對搜索引擎的支持比較弱。
4、破壞了程序的異常機制。
5、不容易調試。
跨域: jsonp、 iframe、window.name、window.postMessage、服務器上設置代理頁面
10.模塊化怎么做?
立即執行函數,不暴露私有成員
var module1 = (function(){
var _count = 0;
var m1 = function(){
//...
};
var m2 = function(){
//...
};
return {
m1 : m1,
m2 : m2
};
})();
11.對Node的優點和缺點提出了自己的看法:
*(優點)因為Node是基于事件驅動和無阻塞的,所以非常適合處理并發請求, 因此構建在Node上的代理服務器相比其他技術實現(如Ruby)的服務器表現要好得多。 此外,與Node代理服務器交互的客戶端代碼是由javascript語言編寫的, 因此客戶端和服務器端都用同一種語言編寫,這是非常美妙的事情。 *(缺點)Node是一個相對新的開源項目,所以不太穩定,它總是一直在變, 而且缺少足夠多的第三方庫支持。看起來,就像是Ruby/Rails當年的樣子。
12.異步加載的方式
(1) defer,只支持IE
(2) async:
(3) 創建script,插入到DOM中,加載完畢后callBack
documen.write和 innerHTML的區別 document.write只能重繪整個頁面 innerHTML可以重繪頁面的一部分
13.告訴我答案是多少?
(function(x){
delete x; alert(x);
})(1+5);
函數參數無法delete刪除,delete只能刪除通過for in訪問的屬性。
當然,刪除失敗也不會報錯,所以代碼運行會彈出“1”。
14.JS中的call()和apply()方法的區別?
例子中用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,所以運行結果為:alert(4);
注意:js 中的函數其實是對象,函數名是對 Function 對象的引用。
function add(a,b)
{
alert(a+b);
}
function sub(a,b)
{
alert(a-b);
}
add.call(sub,3,1);
15.Jquery與jQuery UI 有啥區別?
*jQuery是一個js庫,主要提供的功能是選擇器,屬性修改和事件綁定等等。 *jQuery UI則是在jQuery的基礎上,利用jQuery的擴展性,設計的插件。 提供了一些常用的界面元素,諸如對話框、拖動行為、改變大小行為等等
16.jquery 中如何將數組轉化為json字符串,然后再轉化回來?
jQuery中沒有提供這個功能,所以你需要先編寫兩個jQuery的擴展:
$.fn.stringifyArray = function(array) { return JSON.stringify(array) } $.fn.parseArray = function(array) { return JSON.parse(array) } 然后調用: $("").stringifyArray(array)
17.JavaScript中的作用域與變量聲明提升?
其他部分
(HTTP、正則、優化、重構、響應式、移動端、團隊協作、SEO、UED、職業生涯)
*基于Class的選擇性的性能相對于Id選擇器開銷很大,因為需遍歷所有DOM元素。 *頻繁操作的DOM,先緩存起來再操作。用Jquery的鏈式調用更好。 比如:var str=$("a").attr("href"); *for (var i = size; i < arr.length; i++) {} for 循環每一次循環都查找了數組 (arr) 的.length 屬性,在開始循環的時候設置一個變量來存儲這個數字,可以讓循環跑得更快: for (var i = size, length = arr.length; i < length; i++) {} 前端開發的優化問題(看雅虎14條性能優化原則)。 (1) 減少http請求次數:CSS Sprites, JS、CSS源碼壓縮、圖片大小控制合適;網頁Gzip,CDN托管,data緩存 ,圖片服務器。 (2) 前端模板 JS+數據,減少由于HTML標簽導致的帶寬浪費,前端用變量保存AJAX請求結果,每次操作本地變量,不用請求,減少請求次數 (3) 用innerHTML代替DOM操作,減少DOM操作次數,優化javascript性能。 (4) 當需要設置的樣式很多時設置className而不是直接操作style。 (5) 少用全局變量、緩存DOM節點查找的結果。減少IO讀取操作。 (6) 避免使用CSS Expression(css表達式)又稱Dynamic properties(動態屬性)。 (7) 圖片預加載,將樣式表放在頂部,將腳本放在底部 加上時間戳。 (8) 避免在頁面的主體布局中使用table,table要等其中的內容完全下載之后才會顯示出來,顯示比div+css布局慢。
http狀態碼有那些?分別代表是什么意思?
100-199 用于指定客戶端應相應的某些動作。 200-299 用于表示請求成功。 300-399 用于已經移動的文件并且常被包含在定位頭信息中指定新的地址信息。 400-499 用于指出客戶端的錯誤。400 1、語義有誤,當前請求無法被服務器理解。401 當前請求需要用戶驗證 403 服務器已經理解請求,但是拒絕執行它。 500-599 用于支持服務器錯誤。 503 – 服務不可用
一個頁面從輸入 URL 到頁面加載顯示完成,這個過程中都發生了什么?(流程說的越詳細越好)
你所知道的頁面性能優化方法有那些?
除了前端以外還了解什么其它技術么?你最最厲害的技能是什么?
AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)規范區別?
18.談談你認為怎樣做能是項目做的更好?
19.你對前端界面工程師這個職位是怎么樣理解的?它的前景會怎么樣?
20.加班的看法
加班就像借錢,原則應當是------救急不救窮
21.平時如何管理你的項目,如何設計突發大規模并發架構?
先期團隊必須確定好全局樣式(globe.css),編碼模式(utf-8) 等
編寫習慣必須一致(例如都是采用繼承式的寫法,單樣式都寫成一行);
標注樣式編寫人,各模塊都及時標注(標注關鍵樣式調用的地方);
頁面進行標注(例如 頁面 模塊 開始和結束);
CSS跟HTML 分文件夾并行存放,命名都得統一(例如style.css)
JS 分文件夾存放 命民以該JS 功能為準英文翻譯;
圖片采用整合的 images.png png8 格式文件使用 盡量整合在一起使用方便將來的管理
那些操作會造成內存泄漏? 內存泄漏指任何對象在您不再擁有或需要它之后仍然存在。 垃圾回收器定期掃描對象,并計算引用了每個對象的其他對象的數量。如果一個對象的引用數量為 0(沒有其他對象引用過該對象),或對該對象的惟一引用是循環的,那么該對象的內存即可回收。 setTimeout 的第一個參數使用字符串而非函數的話,會引發內存泄漏。 閉包、控制臺日志、循環(在兩個對象彼此引用且彼此保留時,就會產生一個循環)
23.你說你熱愛前端,那么應該WEB行業的發展很關注吧? 說說最近最流行的一些東西吧?
Node.js、Mongodb、npmM、MVVM、MEAN
24.你有了解我們公司嗎?說說你的認識?
因為我想去阿里,所以我針對阿里的說
最羨慕就是在雙十一購物節,350.19億元,每分鐘支付79萬筆。海量數據,居然無一漏單、無一故障。太厲害了。
25.移動端(比如:Android IOS)怎么做好用戶體驗?
作為一名前端工程師,無論工作年頭長短都應該必須掌握的知識點有:
1、DOM結構 —— 兩個節點之間可能存在哪些關系以及如何在節點之間任意移動。 2、DOM操作 ——如何添加、移除、移動、復制、創建和查找節點等。 3、事件 —— 如何使用事件,以及IE和標準DOM事件模型之間存在的差別。 4、XMLHttpRequest —— 這是什么、怎樣完整地執行一次GET請求、怎樣檢測錯誤。 5、嚴格模式與混雜模式 —— 如何觸發這兩種模式,區分它們有何意義。 6、盒模型 —— 外邊距、內邊距和邊框之間的關系,及IE8以下版本的瀏覽器中的盒模型 7、塊級元素與行內元素 —— 怎么用CSS控制它們、以及如何合理的使用它們 8、浮動元素——怎么使用它們、它們有什么問題以及怎么解決這些問題。 9、HTML與XHTML——二者有什么區別,你覺得應該使用哪一個并說出理由。 10、JSON —— 作用、用途、設計結構。
他們也許不懂交互設計,但是沒人比他們懂交互設計的實現,和每一個細節。 他們也許不懂視覺設計,但是沒人比他們懂視覺設計如何變為現實。 他們也許不懂后臺數據庫,但是他們其實才是數據的第一消費者。 他們也許不是產品經理,但是產品的質量幾乎都是由他們來決定。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78759.html
摘要:基礎鞏固基礎總結使用已經好幾年了,由于工作主要是做服務端開發,在工作中逐漸發現的使用范圍原來越廣泛。這里要注意,務必將基礎部分掌握牢靠,磨刀不誤砍柴功,只有將基礎部分掌握并建立起系統的知識體系,在后面學習衍生的其他模式才能游刃有余。 基礎鞏固:JavaScript基礎總結 使用JavaScript已經好幾年了,由于工作主要是做服務端開發,在工作中逐漸發現JavaScript的使用范圍原...
摘要:中基礎數據類型數據類型名稱數據類型說明只有一個值,即,聲明變量的初始值。只有一個值,即,表示空指針,的值是派生的值。由零或多個位字符組成只有兩個值,即和該類型使用來表示整數和浮點數。中的對象其實就是一組數據和功能的集合。 JavaScript 中基礎數據類型 數據類型名稱 數據類型說明 Undefined 只有一個值,即 undefined ,聲明變量的初始值。 Nul...
摘要:本書主要探索函數式編程的核心思想。我們在中應用的僅僅是一套基本的函數式編程概念的子集。我稱之為輕量級函數式編程。通常來說,關于函數式編程的書籍都熱衷于拓展閱讀者的知識面,并企圖覆蓋更多的知識點。,本書統稱為函數式編程者。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者 譯者團隊(排名不分先后)...
摘要:設計模式是以面向對象編程為基礎的,的面向對象編程和傳統的的面向對象編程有些差別,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續了解設計模式必須要先搞懂面向對象編程,否則只會讓你自己更痛苦。 JavaScript 中的構造函數 學習總結。知識只有分享才有存在的意義。 是時候替換你的 for 循環大法了~ 《小分享》JavaScript中數組的那些迭代方法~ ...
摘要:前端面試題及答案總結掘金技術征文金三銀四,金九銀十,用來形容求職最好的幾個月。因為的存在,至少在被標準化的那一刻起,就支持異步編程了。然而異步編程真正發展壯大,的流行功不可沒。 showImg(https://segmentfault.com/img/bVVQOH?w=640&h=319); 1、2017前端面試題及答案總結 |掘金技術征文 金三銀四,金九銀十,用來形容求職最好的幾個月...
摘要:前綴規范每個局部變量都需要有一個類型前綴,按照類型可以分為表示字符串。例如,表示以上未涉及到的其他對象,例如,表示全局變量,例如,是一種區分大小寫的語言。布爾值與字符串相加將布爾值強制轉換為字符串。 基本概念 javascript是一門解釋型的語言,瀏覽器充當解釋器。js執行時,在同一個作用域內是先解釋再執行。解釋的時候會編譯function和var這兩個關鍵詞定義的變量,編譯完成后從...
閱讀 2985·2021-10-12 10:17
閱讀 1589·2021-09-01 11:38
閱讀 1081·2019-08-30 15:44
閱讀 3479·2019-08-26 18:36
閱讀 507·2019-08-26 13:25
閱讀 1884·2019-08-26 10:29
閱讀 2835·2019-08-23 15:58
閱讀 759·2019-08-23 12:59