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文件),由于翻译只作了一次,运行时不须要翻译,因此编译型语言的程序执行效率高。
可读性
可维护性
可变动性