JavaScript的組成javascript
JavaScript 由如下三部分組成:css
JS的基本數據類型和引用數據類型html
檢測瀏覽器版本版本有哪些方式?前端
介紹JS有哪些內置對象?java
說幾條寫JavaScript的基本規範?node
如何編寫高性能的JavaScript?git
描述瀏覽器的渲染過程,DOM樹和渲染樹的區別?程序員
瀏覽器的渲染過程:github
DOM樹 和 渲染樹 的區別:web
重繪和迴流(重排)的區別和關係?
如何最小化重繪(repaint)和迴流(reflow)?
script 的位置是否會影響首屏顯示時間?
解釋JavaScript中的做用域與變量聲明提高?
JavaScript做用域:
JavaScript變量聲明提高:
介紹JavaScript的原型,原型鏈?有什麼特色?
原型:
原型鏈:
原型特色:
JavaScript有幾種類型的值
JavaScript如何實現一個類,怎麼實例化這個類?
構造函數法(this + prototype) -- 用 new 關鍵字 生成實例對象
function Mobile(name, price){ this.name = name; this.price = price; } Mobile.prototype.sell = function(){ alert(this.name + ",售價 $" + this.price); } var iPhone7 = new Mobile("iPhone7", 1000); iPhone7.sell();
var Person = { firstname: "Mark", lastname: "Yun", age: 25, introduce: function(){ alert('I am ' + Person.firstname + ' ' + Person.lastname); } }; var person = Object.create(Person); person.introduce(); // Object.create 要求 IE9+,低版本瀏覽器能夠自行部署: if (!Object.create) { Object.create = function (o) { function F() {} F.prototype = o; return new F(); }; }
極簡主義法(消除 this 和 prototype) -- 調用 createNew() 獲得實例對象
var Cat = { age: 3, // 共享數據 -- 定義在類對象內,createNew() 外 createNew: function () { var cat = {}; // var cat = Animal.createNew(); // 繼承 Animal 類 cat.name = "小咪"; var sound = "喵喵喵"; // 私有屬性--定義在 createNew() 內,輸出對象外 cat.makeSound = function () { alert(sound); // 暴露私有屬性 }; cat.changeAge = function(num){ Cat.age = num; // 修改共享數據 }; return cat; // 輸出對象 } }; var cat = Cat.createNew(); cat.makeSound();
class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + this.x + ', ' + this.y + ')'; } } var point = new Point(2, 3);
Javascript如何實現繼承?
function Cat(name,color){ Animal.apply(this, arguments); this.name = name; this.color = color; }
Cat.prototype = new Animal(); Cat.prototype.constructor = Cat;
function extend(Child, Parent) { var p = Parent.prototype; var c = Child.prototype; for (var i in p) { c[i] = p[i]; } c.uber = p; }
function extend(Child, Parent) { var F = function(){}; F.prototype = Parent.prototype; Child.prototype = new F(); Child.prototype.constructor = Child; Child.uber = Parent.prototype; }
class ColorPoint extends Point { constructor(x, y, color) { super(x, y); // 調用父類的constructor(x, y) this.color = color; } toString() { return this.color + ' ' + super.toString(); // 調用父類的toString() } }
談談this對象的理解
eval是作什麼的?
eval的功能是把對應的字符串解析成JS代碼並運行
什麼是 Window 對象? 什麼是 Document 對象?
介紹 DOM 的發展
介紹DOM0,DOM2,DOM3事件處理方式區別
DOM0級事件處理方式:
btn.onclick = func;
btn.onclick = null;
DOM2級事件處理方式:
btn.addEventListener('click', func, false);
btn.removeEventListener('click', func, false);
btn.attachEvent("onclick", func);
btn.detachEvent("onclick", func);
DOM3級事件處理方式:
eventUtil.addListener(input, "textInput", func);
eventUtil
是自定義對象,textInput
是DOM3級事件事件的三個階段
介紹事件「捕獲」和「冒泡」執行順序和事件的執行次數?
事件執行次數(DOM2-addEventListener):元素上綁定事件的個數
事件執行順序:判斷的關鍵是否目標元素
在一個DOM上同時綁定兩個點擊事件:一個用捕獲,一個用冒泡。事件會執行幾回,先執行冒泡仍是捕獲?
事件的代理/委託
事件委託是指將事件綁定目標元素的到父元素上,利用冒泡機制觸發該事件
優勢:
ulEl.addEventListener('click', function(e){ var target = event.target || event.srcElement; if(!!target && target.nodeName.toUpperCase() === "LI"){ console.log(target.innerHTML); } }, false);
IE與火狐的事件機制有什麼區別? 如何阻止冒泡?
IE的事件處理和W3C的事件處理有哪些區別?
綁定事件
刪除事件
事件對象
事件目標
阻止事件默認行爲
阻止事件傳播
W3C事件的 target 與 currentTarget 的區別?
如何派發事件(dispatchEvent)?(如何進行事件廣播?)
var fireEvent = function(element, event){ if (document.createEventObject){ var mockEvent = document.createEventObject(); return element.fireEvent('on' + event, mockEvent) }else{ var mockEvent = document.createEvent('HTMLEvents'); mockEvent.initEvent(event, true, true); return !element.dispatchEvent(mockEvent); } }
什麼是函數節流?介紹一下應用場景和原理?
只有當上一次函數執行後達到規定的時間間隔,才能進行下一次調用。
但要保證一個累計最小調用間隔(不然拖拽類的節流都將無連續效果)
當觸發一個事件時,先用 setTimout 讓這個事件延遲一小段時間再執行。
若是在這個時間間隔內又觸發了事件,就 clearTimeout 原來的定時器,
再 setTimeout 一個新的定時器重複以上流程。
function throttle(method, context) { clearTimeout(methor.tId); method.tId = setTimeout(function(){ method.call(context); }, 100); // 兩次調用至少間隔 100ms } // 調用 window.onresize = function(){ throttle(myFunc, window); }
區分什麼是「客戶區座標」、「頁面座標」、「屏幕座標」?
如何得到一個DOM元素的絕對位置?
分析 ['1', '2', '3'].map(parseInt) 答案是多少?
parseInt('1', 0); // 1 parseInt('2', 1); // NaN parseInt('3', 2); // NaN
new 操做符具體幹了什麼?
用原生JavaScript的實現過什麼功能嗎?
解釋一下這段代碼的意思嗎?
[].forEach.call($$("*"), function(el){ el.style.outline = "1px solid #" + (~~(Math.random()*(1<<24))).toString(16); })
[].forEach.call(NodeLists)
// 使用 call 函數將數組遍歷函數 forEach 應到節點元素列表el.style.outline = "1px solid #333"
// 樣式 outline 位於盒模型以外,不影響元素佈局位置(1<<24)
// parseInt("ffffff", 16) == 16777215 == 2^24 - 1 // 1<<24 == 2^24 == 16777216Math.random()*(1<<24)
// 表示一個位於 0 到 16777216 之間的隨機浮點數~~Math.random()*(1<<24)
// ~~
做用至關於 parseInt 取整(~~(Math.random()*(1<<24))).toString(16)
// 轉換爲一個十六進制-JavaScript實現異步編程的方法?
web開發中會話跟蹤的方法有哪些
說幾條寫JavaScript的基本規範?
Javascript如何實現繼承?
function Parent(){ this.name = 'wang'; } function Child(){ this.age = 28; } Child.prototype = new Parent();//繼承了Parent,經過原型 var demo = new Child(); alert(demo.age); alert(demo.name);//獲得被繼承的屬性 }
javascript建立對象的幾種方式?
javascript建立對象簡單的說,無非就是使用內置對象或各類自定義對象,固然還能夠用JSON;但寫法有不少種,也能混合使用
person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};
function Person(){} var person=new Person();//定義一個function,若是使用new"實例化",該function能夠看做是一個Class person.name="Mark"; person.age="25"; person.work=function(){ alert(person.name+" hello..."); } person.work();
function Pet(name,age,hobby){ this.name=name;//this做用域:當前對象 this.age=age; this.hobby=hobby; this.eat=function(){ alert("我叫"+this.name+",我喜歡"+this.hobby+",是個程序員"); } } var maidou =new Pet("麥兜",25,"coding");//實例化、建立對象 maidou.eat();//調用eat方法
var wcDog =new Object(); wcDog.name="旺財"; wcDog.age=3; wcDog.work=function(){ alert("我是"+wcDog.name+",汪汪汪......"); } wcDog.work();
function Dog(){ } Dog.prototype.name="旺財"; Dog.prototype.eat=function(){ alert(this.name+"是個吃貨"); } var wangcai =new Dog(); wangcai.eat();
function Car(name,price){ this.name=name; this.price=price; } Car.prototype.sell=function(){ alert("我是"+this.name+",我如今賣"+this.price+"萬元"); } var camry =new Car("凱美瑞",27); camry.sell();
null,undefined 的區別?
寫一個通用的事件偵聽器函數
// event(事件)工具集,來源:github.com/markyun markyun.Event = { // 頁面加載完成後 readyEvent : function(fn) { if (fn==null) { fn=document; } var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = fn; } else { window.onload = function() { oldonload(); fn(); }; } }, // 視能力分別使用dom0||dom2||IE方式 來綁定事件 // 參數: 操做的元素,事件名稱 ,事件處理程序 addEvent : function(element, type, handler) { if (element.addEventListener) { //事件類型、須要執行的函數、是否捕捉 element.addEventListener(type, handler, false); } else if (element.attachEvent) { element.attachEvent('on' + type, function() { handler.call(element); }); } else { element['on' + type] = handler; } }, // 移除事件 removeEvent : function(element, type, handler) { if (element.removeEventListener) { element.removeEventListener(type, handler, false); } else if (element.datachEvent) { element.detachEvent('on' + type, handler); } else { element['on' + type] = null; } }, // 阻止事件 (主要是事件冒泡,由於IE不支持事件捕獲) stopPropagation : function(ev) { if (ev.stopPropagation) { ev.stopPropagation(); } else { ev.cancelBubble = true; } }, // 取消事件的默認行爲 preventDefault : function(event) { if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } }, // 獲取事件目標 getTarget : function(event) { return event.target || event.srcElement; }, // 獲取event對象的引用,取到事件的全部信息,確保隨時能使用event; getEvent : function(e) { var ev = e || window.event; if (!ev) { var c = this.getEvent.caller; while (c) { ev = c.arguments[0]; if (ev && Event == ev.constructor) { break; } c = c.caller; } } return ev; } };
什麼是閉包(closure),爲何要用它?
閉包的特性:
javascript 代碼中的"use strict";是什麼意思 ? 使用它區別是什麼?
如何判斷一個對象是否屬於某個類?
// 使用instanceof (待完善) if(a instanceof Person){ alert('yes'); }
new操做符具體幹了什麼呢?
var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj);
js延遲加載的方式有哪些?
Ajax 是什麼? 如何建立一個Ajax?
ajax的全稱:Asynchronous Javascript And XML
同步和異步的區別?
documen.write和 innerHTML的區別
DOM操做——怎樣添加、移除、移動、複製、建立和查找節點?
(1)建立新節點
(2)添加、移除、替換、插入
(3)查找
那些操做會形成內存泄漏?
漸進加強和優雅降級
Javascript垃圾回收方法
- 這是JavaScript最多見的垃圾回收方式,當變量進入執行環境的時候,好比函數中聲明一個變量,垃圾回收器將其標記爲「進入環境」,當變量離開環境的時候(函數執行結束)將其標記爲「離開環境」
- 垃圾回收器會在運行的時候給存儲在內存中的全部變量加上標記,而後去掉環境中的變量以及被環境中變量所引用的變量(閉包),在這些完成以後仍存在標記的就是要刪除的變量了
引用計數(reference counting)
在低版本IE中常常會出現內存泄露,不少時候就是由於其採用引用計數方式進行垃圾回收。引用計數的策略是跟蹤記錄每一個值被使用的次數,當聲明瞭一個 變量並將一個引用類型賦值給該變量的時候這個值的引用次數就加1,若是該變量的值變成了另一個,則這個值得引用次數減1,當這個值的引用次數變爲0的時 候,說明沒有變量在使用,這個值無法被訪問了,所以能夠將其佔用的空間回收,這樣垃圾回收器會在運行的時候清理掉引用次數爲0的值佔用的空間
js繼承方式及其優缺點
原型鏈繼承的缺點
借用構造函數(類式繼承)
組合式繼承
defer和async
用過哪些設計模式?
工廠模式:
-
function createObject(name,age,profession){//集中實例化的函數var obj = new Object(); obj.name = name; obj.age = age; obj.profession = profession; obj.move = function () { return this.name + ' at ' + this.age + ' engaged in ' + this.profession; }; return obj; } var test1 = createObject('trigkit4',22,'programmer');//第一個實例var test2 = createObject('mike',25,'engineer');//第二個實例
構造函數模式
請解釋一下 JavaScript 的同源策略
爲何要有同源限制?
缺點
實現一個函數clone,能夠對JavaScript中的5種主要的數據類型(包括Number、String、Object、Array、Boolean)進行值複製
Object.prototype.clone = function(){
var o = this.constructor === Array ? [] : {}; for(var e in this){ o[e] = typeof this[e] === "object" ? this[e].clone() : this[e]; } return o; }
說說嚴格模式的限制
如何刪除一個cookie
var date = new Date(); date.setDate(date.getDate() - 1);//真正的刪除
setDate()方法用於設置一個月的某一天
document.cookie = 'user='+ encodeURIComponent('name') + ';expires = ' + new Date(0)
編寫一個方法 求一個字符串的字節長度
function GetBytes(str){ var len = str.length; var bytes = len; for(var i=0; i<len; i++){ if (str.charCodeAt(i) > 255) bytes++; } return bytes; } alert(GetBytes("你好,as"));
請解釋什麼是事件代理
attribute和property的區別是什麼?
頁面編碼和被請求的資源編碼若是不一致如何處理?
<meta>
設置 charset把<script>
放在</body>
以前和以後有什麼區別?瀏覽器會如何解析它們?
</body>
結束後出現<script>
或任何元素的開始標籤,都是解析錯誤</body>
以前沒有區別</body>
,視做<script>
仍在 body 體內。省略</body>
和</html>
閉合標籤符合HTML標準,服務器能夠利用這一標準儘量少輸出內容延遲加載JS的方式有哪些?
<script>
屬性 defer="defer" (腳本將在頁面完成解析時執行)異步加載JS的方式有哪些?
<script>
屬性 async="async" (一旦腳本可用,則會異步執行)JavaScript 中,調用函數有哪幾種方式?
簡單實現 Function.bind 函數?
if (!Function.prototype.bind) { Function.prototype.bind = function(that) { var func = this, args = arguments; return function() { return func.apply(that, Array.prototype.slice.call(args, 1)); } } } // 只支持 bind 階段的默認參數: func.bind(that, arg1, arg2)(); // 不支持如下調用階段傳入的參數: func.bind(that)(arg1, arg2);
列舉一下JavaScript數組和對象有哪些原生方法?
數組:
對象:
Array.splice() 與 Array.splice() 的區別?
slice -- 「讀取」數組指定的元素,不會對原數組進行修改
splice
JavaScript 對象生命週期的理解?
哪些操做會形成內存泄漏?