参考:
碰到的一些面试问题 - CSDN 博客javascript
原理是:动态插入 script 标签,经过 script 标签引入一个 js 文件,这个 js 文件载入成功后会执行咱们在 url 参数中指定的函数,而且会把咱们须要的 json 数据做为参数传入。css
因为同源策略的限制,XmlHttpRequest 只容许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,能够经过 script 标签实现跨域请求,而后在服务端输出 JSON 数据并执行回调函数,从而解决了跨域的数据请求。html
优势是兼容性好,简单易用,支持浏览器与服务器双向通讯。缺点是只支持 GET 请求。前端
Jsonp(JSON with Padding) 是 json 的一种 "使用模式",可让网页从别的域名(网站)那获取资料,即跨域读取数据。html5
前端:java
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> function callback(data){ document.write('jsonp获取到的数据:'+JSON.stringify(data)); } </script> <script type="text/javascript" src="http://localhost:8848"></script> </body> </html>
后端(Node.js):mysql
const http = require('http') http.createServer(function(request, response){ response.write('callback('+JSON.stringify({a:123,b:456})+')'); response.end(); }).listen(8848);
将页面的 document.domain 设为同一个域名。前提条件:这两个域名必须属于同一个基础域名(一级域名),并且所用的协议,端口都要一致,不然没法利用 document.domain 进行跨域。jquery
eg:css3
www.domain.com blog.domain.com 设置document.domain为domain.com qqq.www.domain.com ppp.www.domain.com 设置document.domain为www.domain.com
window 对象有个 name 属性,该属性有个特征:即在一个窗口 (window) 的生命周期内, 窗口载入的全部的页面都是共享一个 window.name 的,每一个页面对 window.name 都有读写的权限,window.name 是持久存在一个窗口载入过的全部页面中的程序员
做用域链的做用是保证执行环境里有权访问的变量和函数是有序的,做用域链的变量只能向上访问,变量访问到 window 对象即被终止,做用域链向下访问变量是不被容许的。
Node.js:
const http = require('http') const url = require('url') http.createServer(function(request, response){ var params = url.parse(request.url, true).query; if(undefined == params.t){ var html = ` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> var XHR = new XMLHttpRequest(); XHR.open('get', 'http://localhost:8848?t=a'); XHR.send(null); XHR.onreadystatechange = function () { if (XHR.readyState === 4) { if ( XHR.status === 200 ) { document.write('AJAX获取到的内容为:'+XHR.responseText); } } } </script> </body> </html>`; response.write(html); response.end(); } if('a' == params.t){ response.write('hello world'); response.end(); } }).listen(8848);
HTTP 协议一般承载于 TCP 协议之上,在 HTTP 和 TCP 之间添加一个安全协议层(SSL 或 TSL),这个时候,就成了咱们常说的 HTTPS。
默认 HTTP 的端口号为 80,HTTPS 的端口号为 443。
由于网络请求须要有不少的服务器路由器的转发。中间的节点均可能篡改信息,而若是使用 HTTPS,密钥在你和终点站才有。https 之因此比 http 安全,是由于他利用 SSL 或 TSL 协议传输。它包含证书,卸载,流量转发,负载均衡,页面适配,浏览器适配,refer 传递等。保障了传输过程的安全性。
AMD 是 RequireJS 在推广过程当中对模块定义的规范化产出。
CMD 是 SeaJS 在推广过程当中对模块定义的规范化产出。
AMD 是提早执行,CMD 是延迟执行。
AMD 推荐的风格经过返回一个对象作为模块对象,CommonJS 的风格经过对 module.exports 或 exports 的属性赋值来达到暴露模块对象的目的。
CMD 模块方式
define(function(require, exports, module) { // 模块代码 });
开启了 GPU 硬件加速模式:
以下设置实际上是为了渲染 3D 样式,但咱们设置值为 0 后,并无真正使用 3D 效果,但浏览器却所以开启了 GPU 硬件加速模式。这种 GPU 硬件加速在当今 PC 机及移动设备上都已普及,在移动端的性能提高是至关显著地,因此建议你们在作动画时能够尝试一下开启 GPU 硬件加速。
-webkit-transform:transition3d(0,0,0)
// 或者
-webkit-transform:translateZ(0)
栈的插入和删除操做都是在一端进行的,而队列的操做倒是在两端进行的。
队列先进先出,栈先进后出。
栈只容许在表尾一端进行插入和删除,而队列只容许在表尾一端进行插入,在表头一端进行删除
栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。
堆区(heap) — 通常由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收。
堆(数据结构):堆能够被当作是一棵树,如:堆排序;
栈(数据结构):一种先进后出的数据结构。
由 pivotkey 分红两半递归 1-4
jquery 源码封装在一个匿名函数的自执行环境中,有助于防止变量的全局污染,而后经过传入 window 对象参数,可使 window 对象做为局部变量使用,好处是当 jquery 中访问 window 对象的时候,就不用将做用域链退回到顶层做用域了,从而能够更快的访问 window 对象。一样,传入 undefined 参数,能够缩短查找 undefined 时的做用域链。
(function( window, undefined ) { //用一个函数域包起来,就是所谓的沙箱 //在这里边var定义的变量,属于这个函数域内的局部变量,避免污染全局 //把当前沙箱须要的外部变量经过函数参数引入进来 //只要保证参数对内提供的接口的一致性,你还能够随意替换传进来的这个参数 window.jQuery = window.$ = jQuery; })( window );
jquery 将一些原型属性和方法封装在了 jquery.prototype 中,为了缩短名称,又赋值给了 jquery.fn,这是很形象的写法。
有一些数组或对象的方法常常能使用到,jQuery 将其保存为局部变量以提升访问速度。
jquery 实现的链式调用能够节约代码,所返回的都是同一个对象,能够提升代码效率。
一是字面量重写原型会中断关系,使用引用类型的原型,而且子类型还没法给超类型传递参数。
借用构造函数虽然解决了刚才两种问题,但没有原型,则复用无从谈起。因此咱们须要原型链 + 借用构造函数的模式,这种模式称为组合继承
组合式继承是比较经常使用的一种继承方法,其背后的思路是 使用原型链实现对原型属性和方法的继承,而经过借用构造函数来实现对实例属性的继承。这样,既经过在原型上定义方法实现了函数复用,又保证每一个实例都有它本身的属性。
浮动的框能够从左或右开始,直到他的外边缘碰到包含框或另外一个浮动框的边框为止。因为浮动框不在文档的普通流中,因此文档的普通流的块框表现得就像浮动框不存在同样。浮动的块框会漂浮在文档普通流的块框上。(BFC)
通常是一个盒子里使用了 CSS float 浮动属性,致使父级对象盒子不能被撑开,这样 CSS float 浮动就产生了
伪元素清除
.clearfix {
zoom:1; //兼容ie 6 7
}
.clearfix:after {
content:".";
display:block;
height:0;
clear:both;
visibility:hidden;
}
工厂模式(Factory Pattern)是 Java 中最经常使用的设计模式之一。这种类型的设计模式属于建立型模式,它提供了一种建立对象的最佳方式。
在工厂模式中,咱们在建立对象时不会对客户端暴露建立逻辑,而且是经过使用一个共同的接口来指向新建立的对象。
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于建立型模式,它提供了一种建立对象的最佳方式。
这种模式涉及到一个单一的类,该类负责建立本身的对象,同时确保只有单个对象被建立。这个类提供了一种访问其惟一的对象的方式,能够直接访问,不须要实例化该类的对象。
注意:
1 单例类只能有一个实例。
1. 单例类必须本身建立本身的惟一实例。
1. 单例类必须给全部其余对象提供这一实例。
使用闭包主要是为了设计私有的方法和变量。闭包的优势是能够避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易形成内存泄露。在 js 中,函数即闭包,只有函数才会产生做用域的概念
闭包有三个特性:
cookie 虽然在持久保存客户端数据提供了方便,分担了服务器存储的负担,但仍是有不少局限性的。
弊端: 数量和长度的限制
优势: 极高的扩展性和可用性
在较高版本的浏览器中,js 提供了 sessionStorage 和 globalStorage。在 HTML5 中提供了 localStorage 来取代 globalStorage。
html5 中的 Web Storage 包括了两种存储方式:sessionStorage 和 localStorage。
sessionStorage 用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问而且当会话结束后数据也随之销毁。所以 sessionStorage 不是一种持久化的本地存储,仅仅是会话级别的存储。
而 localStorage 用于持久化的本地存储,除非主动删除数据,不然数据是永远不会过时的。
Web Storage 的概念和 cookie 类似,区别是它是为了更大容量存储设计的。Cookie 的大小是受限的,而且每次你请求一个新的页面的时候 Cookie 都会被发送过去,这样无形中浪费了带宽,另外 cookie 还须要指定做用域,不能够跨域调用。
除此以外,Web Storage 拥有 setItem,getItem,removeItem,clear 等方法,不像 cookie 须要前端开发者本身封装 setCookie,getCookie。
可是 cookie 也是不能够或缺的:cookie 的做用是与服务器进行交互,做为 HTTP 规范的一部分而存在 ,而 Web Storage 仅仅是为了在本地 “存储” 数据而生
浏览器的支持除了 IE7及如下不支持外,其余标准浏览器都彻底支持 (ie 及 FF 需在 web 服务器里运行),值得一提的是 IE 老是办好事,例如 IE七、IE6 中的 userData 其实就是 javascript 本地存储的解决方案。经过简单的代码封装能够统一到全部的浏览器都支持 web storage。
localStorage 和 sessionStorage 都具备相同的操做方法,例如 setItem、getItem 和 removeItem 等
1. cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
2. cookie 不是很安全,别人能够分析存放在本地的 COOKIE 并进 COOKIE 欺骗,考虑到安全应当使用 session。
3. session 会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 COOKIE。
4. 单个 cookie 保存的数据不能超过 4K,不少浏览器都限制一个站点最多保存 20 个 cookie。
display:none 隐藏对应的元素,在文档布局中再也不给它分配空间,它各边的元素会合拢,就当他历来不存在。
visibility:hidden 隐藏对应的元素,可是在文档布局中仍保留原来的空间。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #d1{ height: 100px; overflow: none; border: 3px solid black; } #d1 > div{ height: 200px; background: pink; } #d2{ height: 50px; overflow: hidden; border: 3px solid red; } #d2 > div{ height: 200px; background: green; } </style> </head> <body> <div id="d1"> d1 <div></div> </div> <div id="d2"> d2 <div></div> </div> </body> </html>
共同点:对内联元素设置 float 和 absolute 属性,可让元素脱离文档流,而且能够设置其宽高。
不一样点:float 仍会占据位置,absolute 会覆盖文档流中的其余元素。
box-sizing 属性主要用来控制元素的盒模型的解析模式。默认值是 content-box。
标准浏览器下,按照 W3C 规范对盒模型解析,一旦修改了元素的边框或内距,就会影响元素的盒子尺寸,就不得不从新计算元素的盒子尺寸,从而影响整个页面的布局。
# myid
.myclassname
div, h1, p
h1 + p
ul > li
li a
\*
a[rel = "external"]
a: hover, li:nth-child
优先级:!important > 内联 > id > class > tag
元素的每一个
元素。
元素的每一个
元素。
元素的每一个
元素。
元素。
元素。
::selection
(用户选中部分)BFC,块级格式化上下文,一个建立了新的 BFC 的盒子是独立布局的,盒子里面的子元素的样式不会影响到外面的元素。在同一个 BFC 中的两个毗邻的块级盒在垂直方向(和布局方向有关系)的 margin 会发生折叠。
1,去掉或者丢失样式的时候可以让页面呈现出清晰的结构
2,有利于 SEO:和搜索引擎创建良好沟通,有助于爬虫抓取更多的有效信息:爬虫依赖于标签来肯定上下文和各个关键字的权重;
3,方便其余设备解析(如屏幕阅读器、盲人阅读器、移动设备)以意义的方式来渲染网页;
4,便于团队开发和维护,语义化更具可读性,是下一步吧网页的重要动向,遵循 W3C 标准的团队都遵循这个标准,能够减小差别化。
HTML5 如今已经不是 SGML 的子集,主要是关于图像,位置,存储,多任务等功能的增长。
纯表现的元素:basefont,big,center,font, s,strike,tt,u;
对可用性产生负面影响的元素:frame,frameset,noframes;
IE8/IE7/IE6支持经过document.createElement方法产生的标签, 能够利用这一特性让这些浏览器支持HTML5新标签, 固然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架 <!--[if lt IE 9]> <script> src="http://html5shim.googlecode.com/svn/trunk/html5.js"</script> <![endif]--> 如何区分: DOCTYPE声明\新增的结构元素\功能元素
null 是一个表示” 无” 的对象,转为数值时为 0;undefined 是一个表示” 无” 的原始值,转为数值时为 NaN。
当声明的变量还未被初始化时,变量的默认值为 undefined。
null 用来表示还没有存在的对象,经常使用来表示函数企图返回一个不存在的对象。
undefined 表示” 缺乏值”,就是此处应该有一个值,可是尚未定义。典型用法是:
1 变量被声明了,但没有赋值时,就等于 undefined。
1. 调用函数时,应该提供的参数没有提供,该参数等于 undefined。
1. 对象没有赋值的属性,该属性的值为 undefined。
1. 函数没有返回值时,默认返回 undefined。
做为函数的参数,表示该函数的参数不是对象。
1. 做为对象原型链的终点。
defer 和 async、动态建立 DOM 方式(建立 script,插入到 DOM 中,加载完毕后 callBack)、按需异步载入 js
内存泄漏指任何对象在您再也不拥有或须要它以后仍然存在。
垃圾回收器按期扫描对象,并计算引用了每一个对象的其余对象的数量。若是一个对象的引用数量为 0(没有其余对象引用过该对象),或对该对象的唯一引用是循环的,那么该对象的内存便可回收。
setTimeout 的第一个参数使用字符串而非函数的话,会引起内存泄漏。
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
Get 是经过地址栏来传值,而 Post 是经过提交表单来传值。
然而,在如下状况中,请使用 POST 请求:
ajax 的缺点
1 ajax 不支持浏览器 back 按钮。
1. 安全问题 AJAX 暴露了与服务器交互的细节。
1. 对搜索引擎的支持比较弱。
1. 破坏了程序的异常机制。
1. 不容易调试。
Promise 对象用于表示一个异步操做的最终状态(完成或失败),以及其返回的值。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise
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; }
实际的话得看编码
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; } document.write(GetBytes("你好,as"));
MySQL 是传统的关系型数据库,MongoDB 则是非关系型数据库
mongodb 以 BSON 结构(二进制)进行存储,对海量数据存储有着很明显的优点。
对比传统关系型数据库, NoSQL 有着很是显著的性能和扩展性优点,与关系型数据库相比,MongoDB 的优势有:
因此:
对于 html 的标准属性来讲,attribute 和 property 是同步的,是会自动更新的,
可是对于自定义的属性来讲,他们是不一样步的
事件代理(Event Delegation),又称之为事件委托。是 JavaScript 中经常使用绑定事件的经常使用技巧。顾名思义,“事件代理” 便是把本来须要绑定的事件委托给父元素,让父元素担当事件监听的职务。事件代理的原理是 DOM 元素的事件冒泡。使用事件代理的好处是能够提升性能。
全部通讯都是单向的。
MVVM 是 Model-View-ViewModel 的简写。它本质上就是 MVC 的改进版。MVVM 就是将其中的 View 的状态和行为抽象化,让咱们将视图 UI 和业务逻辑分开。