title: 繼續磕面經
toc: true
date: 2018-09-26 17:31:07
categories:javascript
tags:css
Undefined、Null、Boolean、Number、String五種基本數據類型html
typeof
,返回六種結果:undefined、boolean、number、string、object、function前端
typeof ''; // string typeof 1; // number typeof true; // boolean typeof undefined; // undefined typeof null; //object typeof []; // object typeof new Function(); //function typeof new Date(); //object typeof new RegExp(); //object
instanceof
,判斷是不是一個類的實例vue
true instanceof Boolean; // false 1 instanceof Number; // false '' instanceof String; // false [] instanceof Array; // true ({}) instanceof Object; // true (function(){}) instanceof Function; // true new Boolean(true) instanceof Boolean; // true
instanceof
實現原理,沿着原型鏈尋找:java
function myInstanceof(left, right) { left = left.__proto__; right = right.prototype; while (true) { if (left === null) return false; if (left === right) return true; left = left.__proto__; } }
constructor
,一個類的constructor會指向本身的引用。jquery
須要注意的是:webpack
null
和undefined
是無效的對象,所以沒有constructor,須要經過typeof來判斷。''.constructor == String; // true (1).constructor Number; // true true.constructor == Boolean; // true new Function().constructor == Function; // true new Date().constructor == Date; //true
Object.prototype.toString
es6
Object.prototype.toString.call(''); //[object String] Object.prototype.toString.call(1); //[object Number] Object.prototype.toString.call(true); //[object Boolean] Object.prototype.toString.call(undefined); //[object Undefined] Object.prototype.toString.call(null); //[object Null] Object.prototype.toString.call(new Function()); //[object Function] Object.prototype.toString.call(new Date()); //[object Date] Object.prototype.toString.call([]); //[object Array] Object.prototype.toString.call(new RegExp()); //[object RegExp] Object.prototype.toString.call(new Error()); //[object Error] Object.prototype.toString.call(document); //[object HTMLDocument] Object.prototype.toString.call(window); //[object global] window是全局對象global的引用 // 代碼來自 紅塵客棧-古月 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/mozuncangtianbaxue/article/details/77151598?utm_source=copy
基本數據類型會新開闢一個數據段來保存值,web
可是對象的拷貝其實是拷貝了對實際對象的引用,咱們能夠把對象名看作指針。
須要注意的是:slice()和concat()只深拷貝了一級屬性。
遞歸複製全部屬性
function deepClone(arg) { if (arg == null || typeof arg != 'object') return arg; let newObj = Array.isArray(arg) ? [] : {}; for (let key in arg) { if (arg[key] != null && typeof arg[key] == 'object') { newObj[key] = deepClone(arg[key]); } else { newObj[key] = arg[key]; } } return newObj; }
使用JSON的parse和stringify
function deepClone(arg) { return typeof arg == 'object' ? JSON.parse(JSON.stringify(arg)) : arg; }
使用JQuery的extend方法
$.extend([deep], target, object1[, objectN ])
function deepClone(arg) { if (arg == null || typeof arg != 'object') return arg; if (arg instanceof Array) return $.extend(true,[],arg); else return $.extend(true,{},arg); }
單位 | 描述 |
---|---|
em | 它是描述相對於應用在當前元素的字體尺寸,因此它也是相對長度單位。通常瀏覽器字體大小默認爲16px,則2em == 32px; |
ex | 依賴於英文子母小 x 的高度 |
ch | 數字 0 的寬度 |
rem | 根元素(html)的 font-size |
vw | viewpoint width,視窗寬度,1vw=視窗寬度的1% |
vh | viewpoint height,視窗高度,1vh=視窗高度的1% |
vmin | vw和vh中較小的那個。 |
vmax | vw和vh中較大的那個。 |
% | 介紹連接 |
單位 | 描述 |
---|---|
cm | 釐米 |
mm | 毫米 |
in | 英寸 (1in = 96px = 2.54cm) |
px | 像素 (1px = 1/96 of 1in) |
pt | point,大約1/72英寸; (1pt = 1/72in) |
pc | pica,大約6pt,1/6英寸; (1pc = 12 pt) |
參考:https://www.cnblogs.com/dojo-lzz/p/3983335.html
頁面解析渲染該過程主要分爲如下步驟:
雙向綁定
<input v-model="searchText">
等價於:
<input v-bind:value="searchText" v-on:input="searchText = $event.target.value" >
// es5實現 // 最簡單的實現,沒有什麼封裝性 var singleton1 = { attr: 1, method: function() {return this.attr;} }; // 利用構造函數內部解析,不安全 function singleton2 { if (singleton2.instance !== undefined) { return singleton2.instance; } this.name = "xxx"; this.age = "20"; singleton2.instance = this; } // 利用閉包 var singleton3 = (function() { var instance; function constructor() { // blabla } function getInstance() { if (instance === undefined) { instance = new constructor(); } return instance; } return { getInstance: getInstance; }; })(); // ================================================ // es6 實現 // 懶漢式單例 class Singleton1 { // 構造方法 constructor() { // this.xxx = xxx } static getInstance() { if (!this.instance) { this.instance = new Singleton1() } return this.instance } } // 餓漢式單例 class Singleton2 { // 構造方法 constructor() { // this.xxx = xxx } static getInstance() { return this.instance } } Singleton2.prototype.instance = new Singleton2()
在當前做用域下,js運行以前,會把帶有var和function關鍵字的事先聲明,並在內存中安排好。而後再從上到下執行js語句。函數聲明會最早獲得提高,而後是變量聲明。
實際存儲在堆中,在棧中存儲的是堆內存儲地址。
因此能夠把變量名看作指針。
標記清除、引用計數(問題:循環引用,IE9以前BOM和DOM是COM實現的,垃圾收集採用的是引用計數,所以也會出現問題)
基本包裝類型
函數內部判斷this是否爲window
雙向鏈表?map?不知道。。。
無向圖:不斷去掉度爲1的點
有向圖:拓撲排序
<link>
須要十秒,分別在head和body那麼加載時用戶會看到什麼<!-- 做者:toln 連接:https://www.zhihu.com/question/61309490/answer/304391361 來源:知乎 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。 --> HTML的加載不會受到js加載的影響 頁面渲染的大體過程爲,先下載解析HTML並創建DOM樹,再解析css繪製渲染樹。前者搭建頁面結構,後者增添頁面樣式。而在創建DOM樹的過程就會遇到諸如img、外聯css和script標籤,此時就要加載外部資源了。加載資源是由單獨的下載線程進行異步加載的,瀏覽器會並行加載,不過具體並行最大數量是有必定限制的,不一樣瀏覽器可能不同。可是加載css和js資源比較特殊,它們的加載會影響頁面渲染。css加載不會阻塞DOM樹解析,但會阻塞渲染(這是因爲渲染依賴於css,若是不等css加載完就渲染的話那麼等css加載解析完又得從新渲染,可能又要重繪或者回流)。對於js資源的加載,則會阻塞DOM樹的構建和渲染,除非設置了script標籤的異步屬性。 放在head中會在解析DOM樹和渲染頁面前就加載,並阻塞頁面。js正常狀況下加載完就會當即執行,在js腳本中只能訪問當前script以上的DOM,腳本執行結束後再繼續解析DOM。js執行引擎和頁面渲染是由不一樣的線程來執行,但這二者是互斥的,也就是說js執行過程是沒法構建DOM和渲染頁面的。這是一種優化機制,因爲js可能會對DOM及樣式進行修改,若是解析js過程當中同時構建DOM,就可能形成先後內容不一致或者重複構建。因此應該把script放在body中,使頁面更快完成渲染。
function myParse(arg) { arg = arg.split('?')[1].split('&'); let obj = {}; for (let i = 0; i < arg.length; i++) { obj[arg[i].split('=')[0]] = arg[i].split('=')[1]; } return obj; }
rest
不許時,只是到了時間後加入執行隊列
觀察者模式
定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都將獲得通知。
Math.floor(Math.random()*100);
起始行、首部、主體。之間由CR+LF(回車換行)隔開。
header:首部
只有當 域名、協議、端口 都相同時才視爲同源。
方法:
快排、堆排、基數排序
// 插入排序 function insertionSort(arr) { for (var i = 1; i < arr.length; i++) { var tmp = arr[i]; var j = i-1; while (j >= 0 && tmp < arr[j]) { arr[j+1] = arr[j--]; } arr[j+1] = tmp; } return arr; } // 二分插入排序 function binaryInsertionSort(arr) { for (var i = 1; i < arr.length; i++) { var tmp = arr[i], left = 0, right = i-1; while (left <= right) { var mid = parseInt((left + right) / 2); if (arr[mid] < tmp) left = mid + 1; else right = mid-1; } for (var j = i; j > left; j--) { arr[j] = arr[j-1]; } arr[left] = tmp; } return arr; }
標準盒模型和IE盒模型
瀏覽器根據元素的標籤和屬性,來決定元素的具體顯示內容
img、input、textarea、select、obejct、button、label都是替換元素(置換元素)
封裝繼承多態
封裝:把客觀事物封裝成抽象的類,而且類能夠把本身的數據和方法只讓可信的類或者對象操做,對不可信的進行信息隱藏。
繼承:可使用現有類的全部功能,並在無需從新編寫原來的類的狀況下對這些功能進行擴展。
多態:實現多態,有二種方式:覆蓋,重載。
defer、async、建立script插入到DOM中
串行是指多個任務時,各個任務按順序執行,完成一個以後才能進行下一個。
並行指的是多個任務能夠同時執行。
方面 | 進程 | 線程 |
---|---|---|
根本區別 | 操做系統資源分配的基本單位 | 任務調度和執行的基本單位 |
開銷方面 | 每一個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷 | 線程能夠看作是輕量級的進程。同一類線程共享代碼和數據空間,每一個線程都有本身獨立的運行棧和程序計數器,線程之間切換的開銷很小 |
所處環境 | 操做系統中多個進程能夠併發運行 | 同一個進程中能夠有多個線程同時執行(經過CPU調度,在每一個時間片中只有一個線程執行) |
內存分配 | 系統在運行時會爲每一個進程分配不一樣的內存空間 | 除了CPU外,系統不會爲線程分配內存(線程使用的資源來自其所屬進程的資源),線程組之間只能共享資源 |
包含關係 | 進程能夠包含多個線程,且這些線程能夠併發運行 | 線程是進程的一部分,因此線程也被稱爲輕權進程或者輕量級進程 |
管程、信號量
若一個函數在尾位置調用自己(或是一個尾調用自己的其餘函數等),則稱這種狀況爲尾遞歸,是遞歸的一種特殊情形。而形式上只要是最後一個return語句返回的是一個完整函數,它就是尾遞歸。這裏注意:尾調用不必定是遞歸調用,可是尾遞歸必定是尾調用。
<!DOCTYPE html> <html> <head> <title>聖盃佈局</title> <style type="text/css"> .main, .left, .right { position: relative; float: left; min-height: 150px; } .container { padding: 0 300px 0 200px; } .main { width: 100%; background-color: red; } .left { width: 200px; margin-left: -100%; left: -200px; background-color: green; } .right { width: 300px; margin-left: -300px; left: 300px; background-color: blue; } </style> </head> <body> <div class="container"> <div class="main"></div> <div class="left"></div> <div class="right"></div> </div> </body> </html>
<!DOCTYPE html> <html> <head> <title>雙飛翼佈局</title> <style type="text/css"> .container, .left, .right { position: relative; float: left; min-height: 150px; } .main { padding: 0 300px 0 200px; } .container { width: 100%; background-color: red; } .left { width: 200px; margin-left: -100%; background-color: green; } .right { width: 300px; margin-left: -300px; background-color: blue; } </style> </head> <body> <div class="container"> <div class="main"></div> </div> <div class="left"></div> <div class="right"></div> </body> </html>
@keyframes rotate{ from {transform: rotate(0deg);} to {transform: rotate(359deg);} } div { animation: rotate 3s linear infinite; }
https://blog.csdn.net/mapbar_front/article/details/79836443
若是web服務器返回304響應,則表示此請求的本地緩存是最新的,能夠直接使用。這種方法能夠節省帶寬,避免重複響應。
應用層
function add(num) { num += add.num?add.num:0; add.num = num; return add; } add.valueOf = function() { return add.num; };
Number.prototype.add = function(num) {return this+num;}; Number.prototype.reduce = function(num) {return this-num;};
setTimeout
Proxy 能夠理解成,在目標對象以前架設一層「攔截」,外界對該對象的訪問,都必須先經過這層攔截,所以提供了一種機制,能夠對外界的訪問進行過濾和改寫。
Proxy 這個詞的原意是代理,用在這裏表示由它來「代理」某些操做,能夠譯爲「代理器」。
http://es6.ruanyifeng.com/#docs/proxy
Object.create()方法建立一個新對象,使用現有的對象來提供新建立的對象的__proto__。
function oneCount(num) { var re = 0; num = num.toString(2); for (var i = 0; i < num.length; i++) { if (num[i] == '1') re++; } return re; }
HTTP/1.1開始Connection:keep-alive
服務器端問題
443
https://blog.csdn.net/qwertyupoiuytr/article/details/68938963
https://blog.csdn.net/bzfys/article/details/73733917
漸進加強(Progressive Enhancement):一開始就針對低版本瀏覽器進行構建頁面,完成基本的功能,而後再針對高級瀏覽器進行效果、交互、追加功能達到更好的體驗。
優雅降級(Graceful Degradation):一開始就構建站點的完整功能,而後針對瀏覽器測試和修復。好比一開始使用 CSS3 的特性構建了一個應用,而後逐步針對各大瀏覽器進行 hack 使其能夠在低版本瀏覽器上正常瀏覽。
function swap1(a, b) { b = a + b; a = b - a; b = b - a; } // 使用異或 function swap2(a, b) { b = a ^ b; a = b ^ a; b = b ^ a; }
XSS——跨站腳本攻擊
CSRF——跨站請求僞造
SQL注入
對於一個普通的對象來講,若是它的全部property名均爲非負整數,同時也有相應的length屬性,那麼雖然該對象並非由Array構造函數所建立的,它依然呈現出數組的行爲,在這種狀況下,這些對象被稱爲「類數組對象」。
與普通對象不一樣的是,類數組對象擁有一個特性:能夠在類數組對象上應用數組的操做方法。
var o ={0:42,1:52,2:63,length:3} console.log(Array.prototype.join.call(o));//「42,52,63」 console.log(Array.prototype.slice.call(o,1,2));//52
在瀏覽器環境中,document.getElementsByTagName()
語句返回的就是一個類數組對象。
在function調用中,function代碼內的arguments
變量(保存傳入的參數)也是一個類數組對象。
在ECMAScript 5標準中,字符串string就是一個只讀的類數組對象:
var s = "History"; console.log(s[3]);//"t" console.log(Array.prototype.join.call(s, " "));//"H i s t o r y"
for..in循環會把原型(prototype)中方法與屬性給遍歷出來,因此這可能會致使代碼中出現意外的錯誤。
爲了不這個問題,咱們可使用對象的hasOwnProperty()方法來避免這個問題。
加密算法,對稱仍是非對稱。md5,SHA,AES
webpack、AMD、CMD
function myCallback(data) { console.log(data); } function jsonp(url, data, callback) { if (data == 'string') { callback = data; data = {}; } url += url.indexOf('?') == -1 ? '?' : '&'; url += 'callback=' + callback; for (var key in data) { url += '&' + key + '=' + data[key]; } var script = document.createElement('script'); script.setAttribute('src', url); document.querySelector('head').appendChild(script); }
也叫事件代理。
利用事件冒泡,只指定一個事件處理程序,就能夠管理某一類型的全部事件。
使用XMLHttpRequest實現
.center { position: relative; top: 50%; transform: translateX(-50%); }
bind返回修改this後的函數
call和apply當即執行,call順序傳參,apply傳入數組
function addCommas0(num) { num = (num || 0).toString(); var re = ''; while (num.length > 3) { re = ',' + num.slice(-3) + re; num = num.slice(0, num.length-3); } if (num) re = num + re; return re; } function addCommas1(num) { return num.toLocaleString(); } function addCommas2(num) { return (num || 0).toString().replace(/\B(?=(?:\d{3})+\b)/g, ',') }
其中正則方法參考自https://www.cnblogs.com/sivkun/p/7123963.html
\d 等價於[0-9],表示數字字符
關於\b和\B能夠看這個,很易懂
(?=(?:\d{3})+\b)) 裏的 (?= ) 部分表示匹配一個位置,這個位置以後的內容符合這個括號裏的條件,也就是 (?:\d{3})+\b
()表示捕獲分組,()會把每一個分組裏的匹配的值保存起來,使用$n(n是一個數字,表示第n個捕獲組的內容)
(?:)表示非捕獲分組,和捕獲分組惟一的區別在於,非捕獲分組匹配的值不會保存起來
(?:\d{3})+\b 表示一串長度能夠被三整除的數字直至末尾
https://blog.csdn.net/chenjuan1993/article/details/81710022
https://blog.csdn.net/u010683915/article/details/71043188
function getElementsByClassName(className) { if (document.getElementsByClassName) { return document.getElementsByClassName(className); } else { var elements = []; var allNodes = document.getElementsByTagName('*'); for (var i = 0; i < allNodes.length; i++) { var tmpClassNames = allNodes[i].className.replace(/\s+/g,',').split(','); for (var j = 0; j < tmpClassNames.length; j++) { if (tmpClassName[j] == className) { elements.push(allNodes[i]); break; } } } return elements; } }
document.getElementById()
——元素id在ie8如下的瀏覽器不區分id大小寫,並且也返回匹配的name屬性的元素
document.getElementsByName()
——只有部分標籤name可生效(表單、表單元素、img、iframe)
document.getElementsByTagName()
document.getElementsByClassName()
——ie8和ie8如下的ie版本中沒有
CSS選擇器:(不是實時的)
在css中怎麼選,這裏就怎麼選
document.querySelector()
document.querySelectorAll()
https://baijiahao.baidu.com/s?id=1577252811128016864&wfr=spider&for=pc
webpack
首選
gulp
其次
grunt
已經落伍
12px transform
https://www.cnblogs.com/dongdongseven/p/7724106.html
$document.ready()
在DOM加載完畢時執行
window.onload()
在整個頁面全部資源都加載完成時執行
由getter
和setter
定義的屬性稱爲存儲器屬性。
當程序查詢存儲器屬性的值時,JavaScript調用getter
方法(無參數)。
當程序設置存儲器屬性的值時,JavaScript調用setter
方法,將賦值表達式右側的值當作參數傳入setter
。能夠忽略setter
的返回值。
若是屬性同時具備setter
和getter
方法,那麼它是一個讀/寫屬性。
若是隻有getter
方法,那麼就是一個只讀屬性。
若是隻有setter
方法,那麼就是一個只寫屬性,讀取只寫屬性老是返回undefined。
var p = { // 數據屬性 x: 1.0, y: 1.0, // 存儲器屬性 get r() { return Math.sqrt(this.x*this.x + this.y*this.y); }, set r(newValue) { var oldValue = Math.sqrt(this.x*this.x + this.y*this.y); var ratio = newValue/oldValue; this.x *= ratio; this.y *= ratio; } };
Object.defineProperty(obj, prop, descriptor)
obj
要在其上定義屬性的對象。
prop
要定義或修改的屬性的名稱。
descriptor
將被定義或修改的屬性描述符。
configurable | enumerable | value | writable | get | set | |
---|---|---|---|---|---|---|
數據描述符 | Yes | Yes | Yes | Yes | No | No |
存取描述符 | Yes | Yes | No | No | Yes | Yes |
var o = {}; // 建立一個新對象 // 在對象中添加一個屬性與數據描述符的示例 Object.defineProperty(o, "a", { value : 37, writable : true, enumerable : true, configurable : true }); // 對象o擁有了屬性a,值爲37 // 在對象中添加一個屬性與存取描述符的示例 var bValue; Object.defineProperty(o, "b", { get : function(){ return bValue; }, set : function(newValue){ bValue = newValue; }, enumerable : true, configurable : true }); o.b = 38; // 對象o擁有了屬性b,值爲38 // o.b的值如今老是與bValue相同,除非從新定義o.b // 數據描述符和存取描述符不能混合使用 Object.defineProperty(o, "conflict", { value: 0x9f91102, get: function() { return 0xdeadbeef; } }); // throws a TypeError: value appears only in data descriptors, get appears only in accessor descriptors
計算機不能直接理解高級語言,只能直接理解機器語言,因此必需要把高級語言翻譯成機器語言,計算機才能執行高級語言編寫的程序。
翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式只是翻譯的時間不一樣。
解釋性語言的定義:
解釋性語言的程序不須要編譯,在運行程序的時候才翻譯,每一個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就須要逐行翻譯一次,效率比較低。
現代解釋性語言一般把源程序編譯成中間代碼,而後用解釋器把中間代碼一條條翻譯成目標機器代碼,一條條執行。
編譯性語言的定義:
編譯性語言寫的程序在被執行以前,須要一個專門的編譯過程,把程序編譯成爲機器語言的文件,好比exe文件,之後要運行的話就不用從新翻譯了,直接使用編譯的結果就好了(exe文件),由於翻譯只作了一次,運行時不須要翻譯,因此編譯型語言的程序執行效率高。
可讀性
可維護性
可變動性