原文连接在这里,大部分答案是按照本身的理解修改的,也请你们理解为主。javascript
Undefined、Null、Boolean、Number、String、 ECMAScript 2015 新增:Symbol(建立后独一无二且不可变的数据类型 )
构造器对象:Object、Array、Boolean、Number、String、Function、RegExp、Date、Error 普通对象:Math、JSON Object 是 JavaScript 中全部对象的父对象
参考:http://www.ibm.com/developerw...css
1.不要在同一行声明多个变量。 2.请使用 ===/!==来比较true/false或者数值 3.使用对象字面量替代new Array这种形式 4.不要使用全局函数。 5.Switch语句必须带有default分支 6.函数不该该有时候有返回值,有时候没有返回值。 7.For循环必须使用大括号 8.If语句必须使用大括号 9.for-in循环中的变量 应该使用var关键字明确限定做用域,从而避免做用域污染。
每一个对象都会在其内部初始化一个原型属性,这个原型指向的是一个对象,这个对象一样有一个原型属性,这样一层一层向上,直到Object对象。当咱们访问一个对象的属性时,若是当前对象内部不存在这个属性,那么就会去它的原型上去找这个属性,它的原型又会有本身的原型属性,这样沿着找下去,就是咱们平时所说的原型链的概念。html
关系:instance.constructor.prototype = instance.__proto__ 特色: JavaScript对象是经过引用来传递的,咱们建立的每一个实例对象中并无一份属于本身的原型副本。 因此当咱们修改原型时,与之相关的对象也会继承这一改变。
当咱们须要一个属性的时,Javascript引擎会先看当前对象中是否有这个属性, 若是没有的话, 就会查找他的Prototype对象是否有这个属性,如此递推下去,一直检索到 Object 对象。 function Func(){} Func.prototype.name = "Sean"; Func.prototype.getInfo = function() { return this.name; } var person = new Func();//如今能够参考var person = Object.create(oldObject); console.log(person.getInfo()); //person拥有了Func的属性和方法 //"Sean" console.log(Func.prototype); // Func { name="Sean", getInfo=function()}
栈:原始数据类型(Undefined,Null,Boolean,Number,String) 堆:引用数据类型(对象、数组和函数) 两种类型的区别是:存储位置不一样。 原始数据类型是直接存储在栈(stack)中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,因此放入栈中存储; 引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。若是存储在栈中,将会影响程序运行的性能; 引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址, 取得地址后从堆中得到实体。
1.转换函数 parseInt(str),parseFloat(str); 1.1 parseFloat('12.3'); //12.3 1.2 parseFloat('12.3b'); //12.3 2.强制类型转换 Number(str) 2.1 Number('12.3') //12.3 2.2 Number('12.3b') //NaN 3.JS方法 var num = str - 0; 3.1 var num = '12.3' - 0; //12.3 3.2 var num = '12.3b' - 0; //NaN 4.正则表达式,'12.3b'.match(/(\d)+(\.)?(\d)+/g)[0] * 1, 可是这个不太靠谱,提供一种思路而已。
function commafy(num){ return num && num.toString() .replace(/(\d)(?=(\d{3})+\.)/g, function(match, p1){ // !replace函数:把正则匹配到的值用函数的返回值来替换 return match + ','; }); }
这个正则的原理是:匹配 【后面紧跟着3位数字的倍数加一个小数点】 的数字,要注意 【后面紧跟着的三位数字加一个小数点】 不会被匹配进去哦,也就是(?=x)
里面的x
不会被匹配进去。其实共匹配了两次,第一次匹配到的子字符串是"2"
,因后面紧跟着"345678."
,第二次匹配到的是"5"
,因后面紧跟着"678."
。并且其实函数改成return p1 + ','
也能够达到一样的替换效果。前端
方法一:
var arr = [1,2,3,4,5,6,7,8,9,10]; function randSort1(arr){ for(var i = 0,len = arr.length;i < len; i++ ){ var rand = parseInt(Math.random()*len); var temp = arr[rand]; arr[rand] = arr[i]; arr[i] = temp; } return arr; } console.log(randSort1(arr));
方法二:
var arr = [1,2,3,4,5,6,7,8,9,10]; function randSort2(arr){ var mixedArray = []; while(arr.length > 0){ var randomIndex = parseInt(Math.random()*arr.length); mixedArray.push(arr[randomIndex]); arr.splice(randomIndex, 1); } return mixedArray; } console.log(randSort2(arr));
方法三:
var arr = [1,2,3,4,5,6,7,8,9,10]; arr.sort(function(){ return Math.random() - 0.5; }) console.log(arr);
一、原型链 二、借用构造函数 三、组合继承(原型链+借用构造函数) 四、原型式继承 五、寄生式继承 六、寄生组合式继承
原理:把父类的一个实例赋给子类的prototype属性。html5
function Super() { this.superProperty = 'super'; this.arr = [1]; } Super.prototype.getSuperValue = function() { return this.superProperty; } function Sub() { this.subProperty = 'sub'; } //注意,下面一行就是继承了,将Super的一个实例赋值给Sub.prototype Sub.prototype = new Super(); Sub.prototype.getSubValue = function() { return this.subProperty; } var obj = new Sub(); obj.getSubValue(); //'sub' obj.getSuperValue(); //'super' 能够调用继承自Super对象的方法 //Sub的不一样实例共享Super对象的属性 var obj2 = new Sub(); obj.arr.push(2); obj.arr; //[1,2] obj2.arr; //[1,2]
优势:简单。
缺点:
子类之间会共享继承来的属性和方法,其中,共享引用类型属性是咱们不但愿看到的(在这里是arr);
建立子类时,没法向父类构造函数传参。java
原型继承原型图:node
原理:在子类构造函数内部调用超类构造函数。即用call或apply方法给子类构造函数中的this
调用父类构造函数,使子类构造函数构造出来实例对象拥有父类拥有的属性,从而实现继承。react
function Super() { this.arr = [1,2,3]; this.getArr() { return this.arr; } } function Sub() { Super.call(this); } var obj = new Sub(); obj.arr.push(4); obj.arr; //[1,2,3,4] var obj2 = new Sub(); obj2.arr;// [1,2,3] 不共享引用类型属性! 能够向父类构造函数传递参数: function Super(name) { this.name = name; } function Sub(name) { Super.call(this, name); } var obj = new Sub("Darcy"); obj.name; // Darcy
优缺点:
优势:实例间不会共享引用类型属性;能够向超类传递参数。
缺点:没法实现函数复用,即,相同的函数在每一个实例中都有一份,影响性能,消耗内存。(在这里为getArr()
)jquery
原理:原型链 + 借用构造函数。
既用原型链实现了对原型属性和方法的继承(须要共享的),也经过构造函数实现了对实例属性的继承(不须要共享的)。既实现了函数复用,也使得每一个实例都有本身的属性。git
function Super(name) { this.name = name; this.arr = [1,2,3]; } Super.prototype.getName = function() { return this.name; } function Sub(name, age) { Super.call(this, name); this.age = age; } Sub.prototype = new Super(); //给Sub.prototype赋值为Super的实例对象 //上面这句实际上是给Sub.prototype从新赋值, //使得Sub.prototype这个对象本身没有了constructor属性, //这时若是去找Sub.prototype.constructor, //会沿着原型链继续向上找到Super(name), //因此咱们须要让Sub的构造函数从新指回Sub Sub.prototype.constructor = Sub; Sub.prototype.getAge = function() { return this.age; } var obj1 = new Sub("Darcy", 18); obj1.arr.push(4); obj1.arr; //[1,2,3,4] delete obj1.arr; //这时若是删除obj1经过调用Super的构造函数自身拥有的实例属性arr, //再读取arr时,就会沿着原型链向上查找, //找到经过Sub.prototype = new Super()获得的arr属性 obj1.arr; // [1,2,3] obj1.getName(); //"Darcy" obj1.getAge(); //18 var obj2 = new Sub("Iris", 17); obj2.arr; // [1,2,3] obj2.getName(); //"Iris" obj2.getAge(); // 17
优势:
1.经过借用构造函数,使得继承的父类的引用类型属性再也不共享。
2.经过借用构造函数,使得能够在建立子类时,向父类构造函数传参。
3.经过原型继承,使得能够共享继承来的函数,而不须要每一个实例中都保存一份。
缺点:原型继承和借用构造函数分别调用了一次父类的构造函数,一共调用了两次父类的构造函数。
原理:借助原型,基于已有对象建立新对象。把父类的原型复制一份,赋给子类的原型。
//核心代码: function object(o) { function F() {}; F.prototype = o; return new F(); } //其实就是ES5中的Object.create(superObj, argsObj) 返回一个实例对象 var person = { name: "Darcy", friends: ["Iris", "Nichol"] } var anotherPerson = Object.create(person, {name: {value: "Stella"}}); anotherPerson; //{name: "Stella"}
优势:
若是想让一个对象与另外一个对象保持相似,原型式继承是很贴切的。
缺点:
与原型链同样,共享继承来的引用类型的属性的值是咱们不但愿的。
原理:寄生式继承是与原型式继承紧密相关的一种思路,即建立一个仅用于封装继承过程的函数,函数内部以某种方式来加强对象,最后再像真的作了全部工做同样返回对象。
具体实现:定义一个子类构造函数,内部新建一个临时对象,经过Object.create(original)使用原型式继承继承父类对象,而后加上子类对象本身的其余属性,最后返回这个临时对象。
//核心代码 function createAnother(original) { var clone = Object.create(original); //此处用到了原型式继承,返回的是一个实例对象 clone.sayHi = function() { c("Hi"); }; return clone; } var person = { //父类实例 name: "Nicholas", friends: ["Shelby","Court","Van"] }; var anotherPerson = createAnother(person); anotherPerson.sayHi();
寄生式继承在主要考虑对象而不是建立自定义类型和构造函数时,是十分有用的。可是若是考虑到用寄生式继承为对象添加函数等,因为没有用到原型,作不到函数复用,会致使效率下降。
原理:这个名字并非很贴切,虽然叫寄生组合式继承,可是和寄生式继承关系不是很大,主要是用原型式继承来实现原型属性的继承,用借用构造函数模式继承实例属性。寄生组合式继承和组合继承的区别在于:
1.在继承原型属性时,组合继承用原型链继承了整个父类(经过将父类实例赋值给子类构造函数的原型对象来实现),这使子类的原型上有了一份父类的实例属性,而咱们其实已经经过借用构造函数在子类实例上生成了父类的实例属性,因此多了一份实例属性。而寄生组合式继承没有用
sub.prototype = new Array()
,是用原型式继承Object.create(super.prototype)
作到了只继承父类的原型属性,不继承父类的实例属性。
2.组合继承调用了两次超类型构造函数,寄生组合式继承调用了一次(避免了new Super()
)。
//核心代码 function inheritProperty(sub, superObj) { sub.prototype = Object.create(superObj.prototype); //把super.prototype做为sub.prototype的值, //避免了new Super(),就少调用了一次 Super()构造函数 sub.prototype.constructor = sub; //加强对象 } function Super(name) { this.name = name; this.arr = [1,2,3]; } Super.prototype.getName = function() { return this.name; } function Sub(name, age) { Super.call(this, name); //借用构造函数 this.age = age; } inheritProperty(Sub, Super); //调用实现寄生组合式继承的函数 Sub.prototype.getAge = function() { return this.age; } var obj1 = new Sub("Darcy", 18); obj1.arr.push(4); obj1.arr; //[1,2,3,4] delete obj1.arr; //这时若是删除obj1经过调用Super的构造函数自身拥有的实例属性arr, //再读取arr时,就会沿着原型链向上查找,发现找不到了 obj1.arr; // undefined obj1.getName(); //"Darcy" obj1.getAge(); //18 var obj2 = new Sub("Iris", 17); obj2.arr; // [1,2,3] obj2.getName(); //"Iris" obj2.getAge(); // 17
寄生组合式继承原型链图:
优缺点:
这种继承方式理论上是完美的,可是因为出现的较晚,人们大多数使用的是组合继承模式。
javascript建立对象简单的说,无非就是使用内置对象或各类自定义对象,固然还能够用JSON; 但写法有不少种,也能混合使用。
一、对象字面量的方式
var person={ firstname:"Mark", lastname:"Yun", age:25, eyecolor:"black" };
二、用function来模拟无参的构造函数
function Person(){} //定义一个function,若是使用new"实例化",该function能够看做是一个Class var person=new Person(); person.name="Mark"; person.age="25"; person.work=function(){ alert(person.name+" hello..."); } person.work();
三、用function来模拟有参构造函数来实现(用this关键字定义构造的上下文属性)
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方法
四、使用Object.create()
方法
var Animal = { type: "Invertebrates", //"无脊椎动物" displayType: function() { console.log(this.type); } } var animal1 = Object.create(Animal); animal1.displayType(); // Invertebrates var fish = Object.create(Animal); fish.type = "Fishes"; fish.displayType(); // Fishes
五、用工厂方式来建立(内置对象)
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();
外层函数没法查看内层函数的内部细节,但内层函数能够查看其外层函数细节,直至全局环境中的细节。 当须要从内层函数查找某一属性或方法时,会如今当前做用域查找,若是没有找到,就会到它的上一层做用域查找, 直至全局环境,这种组织形式就是做用域链。
全局环境中的this,指的是 window
构造函数中的this,指的是实例对象
对象方法中的this,指的是调用这个方法的对象
事件触发中的this,指的是触发这个事件的对象,特殊的是,IE中的attachEvent中的this老是指向全局对象Window
它的功能是把对应的字符串解析成JS代码并运行; 应该避免使用eval,不安全,且很是耗性能(2次,一次解析成js语句,一次执行)。 由JSON字符串转换为JSON对象的时候能够用eval,var obj =eval('('+ str +')');
window对象是指浏览器打开的窗口。 document对象是对HTML文档对象的一个只读引用,window对象的一个属性。
1. null 用来表示一个【对象】是“没有值”的,也就是值为“空”; undefined 用来表示一个【变量】声明了没有初始化(赋值); 2. typeof undefined //"undefined" 例如变量被声明了,但没有赋值时,Javascript会将其默认值设为undefined typeof null //"object" null : 是一个对象(空对象, 没有任何属性和方法); 常被放在:指望一个对象,可是不引用任何对象的参数位置。也就是说对象的初始化,例如: var obj = null; console.log(typeof obj === "object"); // true 3. 在验证null时,必定要使用 `===` ,由于 `==` 没法区分 null 和 undefined null == undefined // true null === undefined // false
再来一个例子:
null Q:有张三这我的么? A:有! Q:张三有房子么? A:没有! undefined Q:有张三这我的么? A:有! Q: 张三有多少岁? A: 不知道(没有被告诉)
参考阅读:undefined与null的区别
// 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; } };
["1", "2", "3"].map(parseInt)
答案是多少?parseInt(val, radix)能解析一个字符串,返回一个整数,radix表示要解析的数字的基数,该值可选,不传默认为10。 【radix介于 2 ~ 36 之间,而且字符串中的数字不能大于radix才能正确返回数字结果值。若是值为0或空,则为默认值10。】 但此处 map 传了 3 个参数 (value, index, array),因此parseInt拿到前面两个参数value和index。 重写parseInt函数测试一下: function parseInt(str, radix) { return 'parseInt(' + str + ', ' + radix + ')'; }; var a=["1", "2", "3"]; a.map(parseInt); // ["parseInt(1, 0)", "parseInt(2, 1)", "parseInt(3, 2)"] value不能大于radix的缘由是:二进制里面,没有数字3,致使出现超范围的radix赋值和不合法的进制解析,才会返回NaN。 因此["1", "2", "3"].map(parseInt) 答案也就是:[1, NaN, NaN]
详细解析:http://blog.csdn.net/justjava...
事件是咱们在网页中的某个操做(有的操做对应多个事件),是能够被 JavaScript 侦测到的行为。例如:当咱们点击一个按钮就会产生一个事件。
事件处理机制:IE只支持事件冒泡,Firefox同时支持事件捕获和事件冒泡两种事件处理模型。
ev.stopPropagation();
(旧ie的方法ev.cancelBubble = true;
)。
闭包是由
函数和它引用的外部词法环境
组合而成的。最多见的方式就是在一个函数内嵌套另外一个函数,利用内部函数访问其引用的外部函数的词法环境中的参数和变量,能够将函数内的变量和方法传递到函数外,且不会被垃圾回收机制回收,始终保存在内存中。
闭包的应用:
1.使外部函数的词法环境的变量始终保存在内存中
2.保存变量现场(for循环为li列表绑定事件)
3.封装(共享函数,私有变量)
1.使外部函数的词法环境的变量始终保存在内存中
执行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
2.保存变量现场(for循环为li列表绑定事件)
//li节点的onclick事件都能正确的弹出当前被点击的li索引 <ul id="testUL"> <li> index = 0</li> <li> index = 1</li> <li> index = 2</li> <li> index = 3</li> </ul> <script type="text/javascript"> var nodes = document.getElementsByTagName("li"); for(i = 0;i<nodes.length;i+= 1){ nodes[i].onclick = (function(i){ return function() { console.log(i); } //不用闭包的话,值每次都是4 })(i); } </script>
use strict
是一种ECMAscript 5 添加的(严格)运行模式,使得 Javascript 在更严格的条件下运行,消除Javascript语法的一些不合理、不严谨之处,减小一些怪异行为,使编码更加规范化。
区别:
默认支持的糟糕特性都会被禁用,好比不能用with;
全局变量必须用var关键字显式声明;
函数必须声明在顶层,不容许声明在非函数代码块内,好比if和for的大括号内;
arguments.callee也不容许使用;
消除代码运行的一些不安全之处,保证代码运行的安全,限制函数中的arguments修改;
严格模式下的eval函数的行为和非严格模式的也不相同;
提升编译器效率,增长运行速度。
1.使用instanceof if(a instanceof Person){ alert('yes'); } 2.使用constructor if(a.constructor === Person){}
一、建立一个空对象,而且 this 变量引用该对象,同时还继承了该函数的原型。 二、属性和方法被加入到 this 引用的对象中。 三、新建立的对象由 this 所引用,而且最后隐式的返回 this 。 var obj = {}; obj.__proto__ = Base.prototype; Base.call(obj);
hasOwnProperty
javaScript中hasOwnProperty函数方法是返回一个布尔值,指出一个对象是否具备指定名称的属性。此方法没法检查该对象的原型链中是否具备该属性;该属性必须是对象自己的一个成员。
使用方法:
obj.hasOwnProperty(proName) 其中参数obj是必选项。一个对象的实例。 proName是必选项。一个属性名称的字符串值。 若是 obj 具备指定名称的属性,那么JavaScript中hasOwnProperty函数方法返回 true,反之则返回 false。
官网地址: http://json.org/json-zh.html
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 它是基于JavaScript的一个子集。数据格式简单, 易于读写, 占用带宽小 如:{"age":"12", "name":"back"} JSON字符串转换为JSON对象: var obj =eval('('+ str +')'); var obj = str.parseJSON(); var obj = JSON.parse(str); JSON对象转换为JSON字符串: var last=obj.toJSONString(); var last=JSON.stringify(obj);
[].forEach.call($$("*"),function(a){ a.style.outline="1px solid #"+(~~(Math.random()*(1<<24))).toString(16) })
给页面上的全部元素添加outline,颜色随机。
defer和async 动态建立DOM方式:建立script,插入到DOM中,加载完毕后callBack(用得最多) 按需异步载入js
ajax的全称:Asynchronous Javascript And XML。 异步传输+js+xml。 所谓异步,在这里简单地解释就是:向服务器发送请求的时候,咱们没必要等待结果,而是能够同时作其余的事情,等到有告终果它本身会根据设定进行后续操做,与此同时,页面是不会发生整页刷新的,提升了用户体验。 (1)建立XMLHttpRequest对象,也就是建立一个异步调用对象 (2)建立一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息 (3)设置响应HTTP请求状态变化的函数 (4)发送HTTP请求 (5)获取异步调用返回的数据 (6)使用JavaScript和DOM实现局部刷新
一、在ajax发送请求前加上 anyAjaxObj.setRequestHeader("If-Modified-Since","0")。 二、在ajax发送请求前加上 anyAjaxObj.setRequestHeader("Cache-Control","no-cache")。 三、在URL后面加上一个随机数: "fresh=" + Math.random();。 四、在URL后面加上时间搓:"nowtime=" + new Date().getTime();。 五、若是是使用jQuery,直接这样就能够了 $.ajaxSetup({cache:false})。这样页面的全部ajax都会执行这条语句就是不须要保存缓存记录。
同步的概念应该是来自于OS中关于同步的概念:不一样进程为协同完成某项工做而在前后次序上调整(经过阻塞,唤醒等方式).同步强调的是顺序性.谁先谁后.异步则不存在这种顺序性.
同步:浏览器访问服务器请求,用户看获得页面刷新,从新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操做。
异步:浏览器访问服务器请求,用户正常操做,浏览器后端进行请求。等请求完,页面不刷新,新内容也会出现,用户看到新内容。
CORS,jsonp、 iframe、window.name、window.postMessage、服务器上设置代理页面
CORS:设置 Access-Control-Allow-Origin
JSONP原理:利用script标签能够访问跨域的请求的原理。 首先在网页上添加一个script标签,设置这个script标签的src属性用于向服务器请求JSON数据 ,src属性的查询字符串须要加callback函数,用来指定回调函数的名字 。而这个函数是在资源加载以前就已经在前端定义好的,它接受一个参数并利用这个参数作一些事情。向服务器请求后,服务器会将JSON数据放在指定名字的回调函数里做为其参数传回来。这时,由于函数已经在前端定义好了,因此会直接调用。
页面编码和被请求的资源编码若是不一致如何处理?
[ 当即执行函数](http://benalman.com/news/2010/11/immediately-invoked-function-expression/),不暴露私有成员 var module1 = (function(){ var _count = 0; var m1 = function(){ //... }; var m2 = function(){ //... }; return { m1 : m1, m2 : m2 }; })(); (待完善)
AMD(Modules/Asynchronous-Definition)、CMD(Common Module Definition)规范区别?
> AMD 规范在这里:https://github.com/amdjs/amdjs-api/wiki/AMD > CMD 规范在这里:https://github.com/seajs/seajs/issues/242 Asynchronous Module Definition,异步模块定义,全部的模块将被异步加载,模块加载不影响后面语句运行。全部依赖某些模块的语句均放置在回调函数中。 区别:
对于依赖的模块,AMD 是提早执行,CMD 是延迟执行。不过 RequireJS 从 2.0 开始,也改为能够延迟执行(根据写法不一样,处理方式不一样)。CMD 推崇 as lazy as possible.
CMD 推崇依赖就近,AMD 推崇依赖前置。看代码:
// CMD define(function(require, exports, module) {
a = require('./a')
a.doSomething()
// 此处略去 100 行
var b = require('./b') // 依赖能够就近书写
b.doSomething()
// ...
}) // AMD 默认推荐 define(['./a', './b'], function(a, b) { // 依赖必须一开始就写好
a.doSomething()
// 此处略去 100 行
b.doSomething()
// ...
})
requireJS的核心原理是什么?(如何动态加载的?如何避免屡次加载的?如何
缓存的?)
参考:http://annn.me/how-to-realize-cmd-loader/
JS模块加载器的轮子怎么造,也就是如何实现一个模块加载器?
谈一谈你对ECMAScript6的了解?
ECMAScript6 怎么写class么,为何会出现class这种东西?
document.write只能重绘整个页面 innerHTML能够重绘页面的一部分
(1)建立新节点 createDocumentFragment() //建立一个DOM片断 createElement() //建立一个具体的元素 createTextNode() //建立一个文本节点 (2)添加、移除、替换、插入 appendChild() removeChild() replaceChild() insertBefore() //在已有的子节点前插入一个新的子节点 (3)查找 getElementsByTagName() //经过标签名称 getElementsByName() //经过元素的Name属性的值(IE容错能力较强,会获得一个数组,其中包括id等于name值的) getElementById() //经过元素Id,惟一性
.apply()
只有两个参数,第一个参数是调用当前函数的对象,第二个参数是一个数组,里面的值是传入当前调用的函数的参数。.cal()
能够有多个参数,第一个参数仍是调用当前函数的对象,而要传入当前调用的函数的参数是直接用第二、三、4...个参数传入的。
例子中用 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);
Object: create, toString,valueOf,hasOwnProperty Array: isArray, splice,forEach,find,concat,pop,push,reverse,shift,slice
JS 怎么实现一个类。怎么实例化这个类
JavaScript中的做用域与变量声明提高?
如何编写高性能的Javascript?
那些操做会形成内存泄漏?
JQuery的源码看过吗?能不能简单概况一下它的实现原理?
jQuery.fn的init方法返回的this指的是什么对象?为何要返回this?
jquery中如何将数组转化为json字符串,而后再转化回来?
jQuery 的属性拷贝(extend)的实现原理是什么,如何实现深拷贝?
jquery.extend 与 jquery.fn.extend的区别?
jquery.extend 为jquery类添加类方法,能够理解为添加静态方法
jquery.fn.extend:
源码中jquery.fn = jquery.prototype,因此对jquery.fn的扩展,就是为jquery类添加成员函数
使用:
jquery.extend扩展,须要经过jquery类来调用,而jquery.fn.extend扩展,全部jquery实例均可以直接调用。
jQuery 的队列是如何实现的?队列能够用在哪些地方?
谈一下Jquery中的bind(),live(),delegate(),on()的区别?
JQuery一个对象能够同时绑定多个事件,这是如何实现的?
是否知道自定义事件。jQuery里的fire函数是什么意思,何时用?
jQuery 是经过哪一个方法和 Sizzle 选择器结合的?(jQuery.fn.find()进入Sizzle)
针对 jQuery性能的优化方法?
Jquery与jQuery UI 有啥区别?
*jQuery是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等。 *jQuery UI则是在jQuery的基础上,利用jQuery的扩展性,设计的插件。 提供了一些经常使用的界面元素,诸如对话框、拖动行为、改变大小行为等等
JQuery的源码看过吗?能不能简单说一下它的实现原理?
jquery 中如何将数组转化为json字符串,而后再转化回来?
jQuery中没有提供这个功能,因此你须要先编写两个jQuery的扩展:
$.fn.stringifyArray = function(array) { return JSON.stringify(array) } $.fn.parseArray = function(array) { return JSON.parse(array) } 而后调用: $("").stringifyArray(array)
jQuery和Zepto的区别?各自的使用场景?
针对 jQuery 的优化方法?
*基于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++) {}
Zepto的点透问题如何解决?
jQueryUI如何自定义组件?
需求:实现一个页面操做不会整页刷新的网站,而且能在浏览器前进、后退时正确响应。给出你的技术实现方案?
如何判断当前脚本运行在浏览器仍是node环境中?(阿里)
this === window ? 'browser' : 'node';
经过判断Global对象是否为window,若是不为window,当前脚本没有运行在浏览器中
移动端最小触控区域是多大?
jQuery 的 slideUp动画 ,若是目标元素是被外部事件驱动, 当鼠标快速地连续触发外部元素事件, 动画会滞后的反复执行,该如何处理呢?
jquery stop(): 如:$("#div").stop().animate({width:"100px"},100);
把 Script 标签 放在页面的最底部的body封闭以前 和封闭以后有什么区别?浏览器会如何解析它们?
移动端的点击事件的有延迟,时间是多久,为何会有? 怎么解决这个延时?(click 有 300ms 延迟,为了实现safari的双击事件的设计,浏览器要知道你是否是要双击操做。)
知道各类JS框架(Angular, Backbone, Ember, React, Meteor, Knockout...)么? 能讲出他们各自的优势和缺点么?
Underscore 对哪些 JS 原生对象进行了扩展以及提供了哪些好用的函数方法?
解释JavaScript中的做用域与变量声明提高?
那些操做会形成内存泄漏?
内存泄漏指任何对象在您再也不拥有或须要它以后仍然存在。
垃圾回收器按期扫描对象,并计算引用了每一个对象的其余对象的数量。若是一个对象的引用数量为 0(没有其余对象引用过该对象),或对该对象的唯一引用是循环的,那么该对象的内存便可回收。
setTimeout 的第一个参数使用字符串而非函数的话,会引起内存泄漏。
闭包、控制台日志、循环(在两个对象彼此引用且彼此保留时,就会产生一个循环)
JQuery一个对象能够同时绑定多个事件,这是如何实现的?
多个事件同一个函数:
$("div").on("click mouseover", function(){});
多个事件不一样函数
$("div").on({ click: function(){}, mouseover: function(){} });
Node.js的适用场景?
(若是会用node)知道route, middleware, cluster, nodemon, pm2, server-side rendering么?
解释一下 Backbone 的 MVC 实现方式?
什么是“前端路由”?何时适合使用“前端路由”? “前端路由”有哪些优势和缺点?
Chrome,Safari浏览器内核。
如何测试前端代码么? 知道BDD, TDD, Unit Test么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
前端templating(Mustache, underscore, handlebars)是干吗的, 怎么用?
简述一下 Handlebars 的基本用法?
简述一下 Handlerbars 的对模板的基本处理流程, 如何编译的?如何缓存的?
检测浏览器版本版本有哪些方式?
功能检测、userAgent特征检测 好比:navigator.userAgent //"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36"
What is a Polyfill?
polyfill 是“在旧版浏览器上复制标准 API 的 JavaScript 补充”,能够动态地加载 JavaScript 代码或库,在不支持这些标准 API 的浏览器中模拟它们。 例如,geolocation(地理位置)polyfill 能够在 navigator 对象上添加全局的 geolocation 对象,还能添加 getCurrentPosition 函数以及“坐标”回调对象,全部这些都是 W3C 地理位置 API 定义的对象和函数。由于 polyfill 模拟标准 API,因此可以以一种面向全部浏览器将来的方式针对这些 API 进行开发,一旦对这些 API 的支持变成绝对大多数,则能够方便地去掉 polyfill,无需作任何额外工做。
作的项目中,有没有用过或本身实现一些 polyfill 方案(兼容性处理方案)?
好比: html5shiv、Geolocation、Placeholder
咱们给一个dom同时绑定两个点击事件,一个用捕获,一个用冒泡。会执行几回事件,会先执行冒泡仍是捕获?
使用JS实现获取文件扩展名?
function getFileExtension(filename) {
return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
}
String.lastIndexOf() 方法返回指定值(本例中的'.')在调用该方法的字符串中最后出现的位置,若是没找到则返回 -1。
对于'filename'和'.hiddenfile',lastIndexOf的返回值分别为0和-1无符号右移操做符(»>) 将-1转换为4294967295,将-2转换为4294967294,这个方法能够保证边缘状况时文件名不变。
String.prototype.slice() 从上面计算的索引处提取文件的扩展名。若是索引比文件名的长度大,结果为""。
Object.is() 与原来的比较操做符“ ===”、“ ==”的区别?
两等号判等,会在比较时进行类型转换; 三等号判等(判断严格),比较时不进行隐式类型转换,(类型不一样则会返回false); Object.is 在三等号判等的基础上特别处理了 NaN 、-0 和 +0 ,保证 -0 和 +0 再也不相同, 但 Object.is(NaN, NaN) 会返回 true. Object.is 应被认为有其特殊的用途,而不能用它认为它比其它的相等对比更宽松或严格。
react-router 路由系统的实现原理?
React中如何解决第三方类库的问题?
原来公司工做流程是怎么样的,如何与其余人协做的?如何夸部门合做的?
你遇到过比较难的技术问题是?你是如何解决的?
设计模式 知道什么是singleton, factory, strategy, decrator么?
常使用的库有哪些?经常使用的前端开发工具?开发过什么应用或组件?
页面重构怎么操做?
网站重构:在不改变外部行为的前提下,简化结构、添加可读性,而在网站前端保持一致的行为。 也就是说是在不改变UI的状况下,对网站进行优化,在扩展的同时保持一致的UI。 对于传统的网站来讲重构一般是: 表格(table)布局改成DIV+CSS 使网站前端兼容于现代浏览器(针对于不合规范的CSS、如对IE6有效的) 对于移动平台的优化 针对于SEO进行优化 深层次的网站重构应该考虑的方面 减小代码间的耦合 让代码保持弹性 严格按规范编写代码 设计可扩展的API 代替旧有的框架、语言(如VB) 加强用户体验 一般来讲对于速度的优化也包含在重构中 压缩JS、CSS、image等前端资源(一般是由服务器来解决) 程序的性能优化(如数据读写) 采用CDN来加速资源加载 对于JS DOM的优化 HTTP服务器的文件缓存
列举IE与其余浏览器不同的特性?
一、事件不一样之处: 触发事件的元素被认为是目标(target)。而在 IE 中,目标包含在 event 对象的 srcElement 属性; 获取字符代码、若是按键表明一个字符(shift、ctrl、alt除外),IE 的 keyCode 会返回字符代码(Unicode),DOM 中按键的代码和字符是分离的,要获取字符代码,须要使用 charCode 属性; 阻止某个事件的默认行为,IE 中阻止某个事件的默认行为,必须将 `returnValue` 属性设置为 false,Mozilla 中,须要调用 preventDefault() 方法; 中止事件冒泡,IE 中阻止事件进一步冒泡,须要设置 cancelBubble 为 true,Mozzilla 中,须要调用 stopPropagation();
99%的网站都须要被重构是那本书上写的?
网站重构:应用web标准进行设计(第2版)
什么叫优雅降级和渐进加强?
优雅降级:Web站点在全部新式浏览器中都能正常工做,若是用户使用的是老式浏览器,则代码会针对旧版本的IE进行降级处理了,使之在旧式浏览器上以某种形式降级体验却不至于彻底不能用。 如:border-shadow 渐进加强:从被全部浏览器支持的基本功能开始,逐步地添加那些只有新版本浏览器才支持的功能,向页面增长不影响基础浏览器的额外样式和功能的。当浏览器支持时,它们会自动地呈现出来并发挥做用。 如:默认使用flash上传,但若是浏览器支持 HTML5 的文件上传功能,则使用HTML5实现更好的体验;
是否了解公钥加密和私钥加密。
通常状况下是指私钥用于对数据进行签名,公钥用于对签名进行验证; HTTP网站在浏览器端用公钥加密敏感数据,而后在服务器端再用私钥解密。
WEB应用从服务器主动推送Data到客户端有那些方式?
html5提供的Websocket 不可见的iframe WebSocket经过Flash XHR长时间链接 XHR Multipart Streaming <script>标签的长时间链接(可跨域)
对Node的优势和缺点提出了本身的见解?
*(优势)由于Node是基于事件驱动和无阻塞的,因此很是适合处理并发请求, 所以构建在Node上的代理服务器相比其余技术实现(如Ruby)的服务器表现要好得多。 此外,与Node代理服务器交互的客户端代码是由javascript语言编写的, 所以客户端和服务器端都用同一种语言编写,这是很是美妙的事情。 *(缺点)Node是一个相对新的开源项目,因此不太稳定,它老是一直在变, 并且缺乏足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子。
你有用过哪些前端性能优化的方法?
(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布局慢。 对普通的网站有一个统一的思路,就是尽可能向前端优化、减小数据库操做、减小磁盘IO。向前端优化指的是,在不影响功能和体验的状况下,能在浏览器执行的不要在服务端执行,能在缓存服务器上直接返回的不要到应用服务器,程序能直接取得的结果不要到外部取得,本机内能取得的数据不要到远程取,内存能取到的不要到磁盘取,缓存中有的不要去数据库查询。减小数据库操做指减小更新次数、缓存结果减小查询次数、将数据库执行的操做尽量的让你的程序完成(例如join查询),减小磁盘IO指尽可能不使用文件系统做为缓存、减小读写文件次数等。程序优化永远要优化慢的部分,换语言是没法“优化”的。
http状态码有那些?分别表明是什么意思?
简单版 [
100 Continue 继续,通常在发送post请求时,已发送了http header以后服务端将返回此信息,表示确认,以后发送具体参数信息
200 OK 正常返回信息
201 Created 请求成功而且服务器建立了新的资源
202 Accepted 服务器已接受请求,但还没有处理
301 Moved Permanently 请求的网页已永久移动到新位置。
302 Found 临时性重定向。
303 See Other 临时性重定向,且老是使用 GET 请求新的 URI。
304 Not Modified 自从上次请求后,请求的网页未修改过。
400 Bad Request 服务器没法理解请求的格式,客户端不该当尝试再次使用相同的内容发起请求。
401 Unauthorized 请求未受权。
403 Forbidden 禁止访问。
404 Not Found 找不到如何与 URI 相匹配的资源。
500 Internal Server Error 最多见的服务器端错误。
503 Service Unavailable 服务器端暂时没法处理请求(多是过载或维护)。
] 完整版 1**(信息类):表示接收到请求而且继续处理 100——客户必须继续发出请求 101——客户要求服务器根据请求转换HTTP协议版本 2**(响应成功):表示动做被成功接收、理解和接受 200——代表该请求被成功地完成,所请求的资源发送回客户端 201——提示知道新文件的URL 202——接受和处理、但处理未完成 203——返回信息不肯定或不完整 204——请求收到,但返回信息为空 205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件 206——服务器已经完成了部分用户的GET请求 3**(重定向类):为了完成指定的动做,必须接受进一步处理 300——请求的资源可在多处获得 301——本网页被永久性转移到另外一个URL 302——请求的网页被转移到一个新的地址,但客户访问仍继续经过原始URL地址,重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。 303——建议客户访问其余URL或访问方式 304——自从上次请求后,请求的网页未修改过,服务器返回此响应时,不会返回网页内容,表明上次的文档已经被缓存了,还能够继续使用 305——请求的资源必须从服务器指定的地址获得 306——前一版本HTTP中使用的代码,现行版本中再也不使用 307——申明请求的资源临时性删除 4**(客户端错误类):请求包含错误语法或不能正确执行 400——客户端请求有语法错误,不能被服务器所理解 401——请求未经受权,这个状态代码必须和WWW-Authenticate报头域一块儿使用 HTTP 401.1 - 未受权:登陆失败 HTTP 401.2 - 未受权:服务器配置问题致使登陆失败 HTTP 401.3 - ACL 禁止访问资源 HTTP 401.4 - 未受权:受权被筛选器拒绝 HTTP 401.5 - 未受权:ISAPI 或 CGI 受权失败 402——保留有效ChargeTo头响应 403——禁止访问,服务器收到请求,可是拒绝提供服务 HTTP 403.1 禁止访问:禁止可执行访问 HTTP 403.2 - 禁止访问:禁止读访问 HTTP 403.3 - 禁止访问:禁止写访问 HTTP 403.4 - 禁止访问:要求 SSL HTTP 403.5 - 禁止访问:要求 SSL 128 HTTP 403.6 - 禁止访问:IP 地址被拒绝 HTTP 403.7 - 禁止访问:要求客户证书 HTTP 403.8 - 禁止访问:禁止站点访问 HTTP 403.9 - 禁止访问:链接的用户过多 HTTP 403.10 - 禁止访问:配置无效 HTTP 403.11 - 禁止访问:密码更改 HTTP 403.12 - 禁止访问:映射器拒绝访问 HTTP 403.13 - 禁止访问:客户证书已被吊销 HTTP 403.15 - 禁止访问:客户访问许可过多 HTTP 403.16 - 禁止访问:客户证书不可信或者无效 HTTP 403.17 - 禁止访问:客户证书已经到期或者还没有生效 404——一个404错误代表可链接服务器,但服务器没法取得所请求的网页,请求资源不存在。eg:输入了错误的URL 405——用户在Request-Line字段定义的方法不容许 406——根据用户发送的Accept拖,请求资源不可访问 407——相似401,用户必须首先在代理服务器上获得受权 408——客户端没有在用户指定的饿时间内完成请求 409——对当前资源状态,请求不能完成 410——服务器上再也不有此资源且无进一步的参考地址 411——服务器拒绝用户定义的Content-Length属性请求 412——一个或多个请求头字段在当前请求中错误 413——请求的资源大于服务器容许的大小 414——请求的资源URL长于服务器容许的长度 415——请求资源不支持请求项目格式 416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段 417——服务器不知足请求Expect头字段指定的指望值,若是是代理服务器,多是下一级服务器不能知足请求长。 5**(服务端错误类):服务器不能正确执行一个正确的请求 HTTP 500 - 服务器遇到错误,没法完成请求 HTTP 500.100 - 内部服务器错误 - ASP 错误 HTTP 500-11 服务器关闭 HTTP 500-12 应用程序从新启动 HTTP 500-13 - 服务器太忙 HTTP 500-14 - 应用程序无效 HTTP 500-15 - 不容许请求 global.asa Error 501 - 未实现 HTTP 502 - 网关错误 HTTP 503:因为超载或停机维护,服务器目前没法使用,一段时间后可能恢复正常
注:这题胜在区分度高,知识点覆盖广,再不懂的人,也能答出几句,而高手能够根据本身擅长的领域自由发挥,从URL规范、HTTP协议、DNS、CDN、数据库查询、到浏览器流式解析、CSS规则构建、layout、paint、onload/domready、JS执行、JS API绑定等等;
参考:《What really happens when you navigate to a URL》
输入地址
浏览器对URL进行检查,首先判断协议,若是是http就按照web来处理,而后调用浏览器内核中的对应方法,好比WebView中的loadUrl方法。
经过DNS域名解析获取域名对应的 IP 地址
浏览器向 web 服务器发送一个 HTTP 请求,而且会随请求带上这个域名下的cookie
服务器处理请求并返回一个 HTTP 响应
若是这是一个重定向的响应,浏览器会根据重定向的URL再发送一个HTTP请求
当得到服务器发回的响应后,浏览器开始下载html文档
创建DOM树,同时发送请求获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS等等)
载入解析到的资源文件,构建CSSOM,而后与DOM一块儿生成Render Tree
计算每一个节点在屏幕中的位置,按照算出来的规则,把内容显示到屏幕上。
JS根据DOM API操做DOM,执行事件绑定等,页面显示完成
你发现快要过年了,因而想给你的女友买一件毛衣,你打开了www.taobao.com。这时你的浏览器首先查询DNS服务器,将www.taobao.com转换成ip地址。不过首先你会发现,你在不一样的地区或者不一样的网络(电信、联通、移动)的状况下,转换后的ip地址极可能是不同的,这首先涉及到负载均衡的第一步,经过DNS解析域名时将你的访问分配到不一样的入口,同时尽量保证你所访问的入口是全部入口中可能较快的一个(这和后文的CDN不同)。
你经过这个入口成功的访问了www.taobao.com的实际的入口ip地址。这时你产生了一个PV,即Page
View,页面访问。每日每一个网站的总PV量是形容一个网站规模的重要指标。淘宝网全网在平日(非促销期间)的PV大概是16-25亿之间。同时做为一个独立的用户,你此次访问淘宝网的全部页面,均算做一个UV(Unique
Visitor用户访问)。最近臭名昭著的12306.cn的日PV量最高峰在10亿左右,而UV量却远小于淘宝网十余倍,这其中的缘由我相信你们都会知道。由于同一时刻访问www.taobao.com的人数过于巨大,因此即使是生成淘宝首页页面的服务器,也不可能仅有一台。仅用于生成www.taobao.com首页的服务器就可能有成百上千台,那么你的一次访问时生成页面给你看的任务便会被分配给其中一台服务器完成。这个过程要保证公正、公平、平均(暨这成百上千台服务器每台负担的用户数要差很少),这一很复杂的过程是由几个系统配合完成,其中最关键的即是LVS,Linux
Virtual Server,世界上最流行的负载均衡系统之一,正是由目前在淘宝网供职的章文嵩博士开发的。通过一系列复杂的逻辑运算和数据处理,用于此次给你看的淘宝网首页的HTML内容便生成成功了。对web前端稍微有点常识的童鞋都应该知道,下一步浏览器会去加载页面中用到的css、js、图片等样式、脚本和资源文件。可是可能相对较少的同窗才会知道,你的浏览器在同一个域名下并发加载的资源数量是有限制的,例如ie6-7是两个,ie8是6个,chrome各版本不大同样,通常是4-6个。我刚刚看了一下,我访问淘宝网首页须要加载126个资源,那么如此小的并发链接数天然会加载好久。因此前端开发人员每每会将上述这些资源文件分布在好多个域名下,变相的绕过浏览器的这个限制,同时也为下文的CDN工做作准备。
据不可靠消息,在双十一当天高峰,淘宝的访问流量最巅峰达到871GB/S。这个数字意味着须要178万个4mb带宽的家庭宽带才能负担的起,也彻底有能力拖垮一个中小城市的所有互联网带宽。那么显然,这些访问流量不可能集中在一块儿。而且你们都知道,不一样地区不一样网络(电信、联通等)之间互访会很是缓慢,可是你却发现不多发现淘宝网访问缓慢。这即是CDN,Content
Delivery
Network,即内容分发网络的做用。淘宝在全国各地创建了数十上百个CDN节点,利用一些手段保证你访问的(这里主要指js、css、图片等)地方是离你最近的CDN节点,这样便保证了大流量分散已经在各地访问的加速。
这便出现了一个问题,那就是倘若一个卖家发布了一个新的宝贝,上传了几张新的宝贝图片,那么淘宝网如何保证全国各地的CDN节点中都会同步的存在这几张图片供用户使用呢?这里边就涉及到了大量的内容分发与同步的相关技术。淘宝开发了分布式文件系统TFS(taobao
file system)来处理这类问题。好了,这时你终于加载完了淘宝首页,那么你习惯性的在首页搜索框中输入了'毛衣'二字并敲回车,这时你又产生了一个PV,而后,淘宝网的主搜索系统便开始为你服务了。它首先对你输入的内容基于一个分词库进行的分词操做。众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中全部的字连起来才能描述一个意思。例如,英文句子I
am a
student,用中文则为:“我是一个学生”。计算机能够很简单经过空格知道student是一个单词,可是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分红有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我
是 一个 学生。进行分词以后,还须要根据你输入的搜索词进行你的购物意图分析。用户进行搜索时经常有以下几类意图:(1)浏览型:没有明确的购物对象和意图,边看边买,用户比较随意和感性。Query例如:”2010年10大香水排行”,”2010年流行毛衣”,
“zippo有多少种类?”;(2)查询型:有必定的购物意图,体如今对属性的要求上。Query例如:”适合老人用的手机”,”500元
手表”;(3)对比型:已经缩小了购物意图,具体到了某几个产品。Query例如:”诺基亚E71 E63″,”akg k450
px200″;(4)肯定型:已经作了基本决定,重点考察某个对象。Query例如:”诺基亚N97″,”IBM
T60″。经过对你的购物意图的分析,主搜索会呈现出彻底不一样的结果来。以后的数个步骤后,主搜索系统便根据上述以及更多复杂的条件列出了搜索结果,这一切是由一千多台搜索服务器完成。而后你开始逐一点击浏览搜索出的宝贝。你开始查看宝贝详情页面。常常网购的亲们会发现,当你买过了一个宝贝以后,即使是商家屡次修改了宝贝详情页,你仍然可以经过‘已买到的宝贝’查看当时的快照。这是为了防止商家对在商品详情中承诺过的东西赖帐不认。那么显然,对于每一年数十上百亿比交易的商品详情快照进行保存和快速调用不是一个简单的事情。这其中又涉及到数套系统的共同协做,其中较为重要的是Tair,淘宝自行研发的分布式KV存储方案。
而后不管你是否真正进行了交易,你的这些访问行为便忠实的被系统记录下来,用于后续的业务逻辑和数据分析。这些记录中访问日志记录即是最重要的记录之一,可是前边咱们得知,这些访问是分布在各个地区不少不一样的服务器上的,而且因为用户众多,这些日志记录都很是庞大,达到TB级别很是正常。那么为了快速及时传输同步这些日志数据,淘宝研发了TimeTunnel,用于进行实时的数据传输,交给后端系统进行计算报表等操做。
你的浏览数据、交易数据以及其它不少不少的数据记录均会被保留下来。使得淘宝存储的历史数据垂手可得的便达到了十数甚至更多个PB(1PB=1024TB=1048576GB)。如此巨大的数据量通过淘宝系统1:120的极限压缩存储在淘宝的数据仓库中。而且经过一个叫作云梯的,由2000多台服务器组成的超大规模数据系统不断的进行分析和挖掘。
从这些数据中淘宝可以知道小到你是谁,你喜欢什么,你的孩子几岁了,你是否在谈恋爱,喜欢玩魔兽世界的人喜欢什么样的饮料等,大到各行各业的零售状况、各种商品的兴衰消亡等等海量的信息。
说了这么多,其实也只是叙述了淘宝上正在运行的成千上万个系统中的寥寥几个。即使是你仅仅访问一次淘宝的首页,所涉及到的技术和系统规模都是你彻底没法想象的,是淘宝2000多名顶级的工程师们的心血结晶,其中甚至包括长江学者、国家科学技术最高奖得主等众多大牛。一样,百度、腾讯等的业务系统也毫不比淘宝简单。你须要知道的是,你天天使用的互联网产品,看似简单易用,背后却凝聚着不可思议的智慧与劳动。
详细版: 一、浏览器会开启一个线程来处理这个请求,对 URL 分析判断若是是 http 协议就按照 Web 方式来处理; 二、调用浏览器内核中的对应方法,好比 WebView 中的 loadUrl 方法; 三、经过DNS解析获取网址的IP地址,设置 UA 等信息发出第二个GET请求; 四、进行HTTP协议会话,客户端发送报头(请求报头); 五、进入到web服务器上的 Web Server,如 Apache、Tomcat、Node.JS 等服务器; 六、进入部署好的后端应用,如 PHP、Java、JavaScript、Python 等,找到对应的请求处理; 七、处理结束回馈报头,此处若是浏览器访问过,缓存上有对应资源,会与服务器最后修改时间对比,一致则返回304; 八、浏览器开始下载html文档(响应报头,状态码200),同时使用缓存; 九、文档树创建,根据标记请求所需指定MIME类型的文件(好比css、js),同时设置了cookie; 十、页面开始渲染DOM,JS根据DOM API操做DOM,执行事件绑定等,页面显示完成。
部分地区用户反应网站很卡,请问有哪些可能性的缘由,以及解决方法?
从打开app到刷新出内容,整个过程当中都发生了什么,若是感受慢,怎么定位问题,怎么解决?
除了前端之外还了解什么其它技术么?你最最厉害的技能是什么?
你用的驾轻就熟用的熟练地编辑器&开发环境是什么样子?
Sublime Text 3 + 相关插件编写前端代码
Google chrome 、Mozilla Firefox浏览器 +firebug 兼容测试和预览页面UI、动画效果和交互功能
Node.js+Gulp
git 用于版本控制和Code Review
对前端工程师这个职位是怎么样理解的?它的前景会怎么样?
前端是最贴近用户的程序员,比后端、数据库、产品经理、运营、安全都近。
一、实现界面交互
二、提高用户体验
三、有了Node.js,前端能够实现服务端的一些事情
前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好, 参与项目,快速高质量完成实现效果图,精确到1px; 与团队成员,UI设计,产品经理的沟通; 作好的页面结构,页面重构和用户体验; 处理hack,兼容、写出优美的代码格式; 针对服务器的优化、拥抱最新前端技术。
你怎么看待Web App 、hybrid App、Native App?
你移动端前端开发的理解?(和 Web 前端开发的主要区别是什么?)
你对加班的见解?
加班就像借钱,原则应当是------救急不救穷
平时如何管理你的项目?
先期团队必须肯定好全局样式(globe.css),编码模式(utf-8) 等; 编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行); 标注样式编写人,各模块都及时标注(标注关键样式调用的地方); 页面进行标注(例如 页面 模块 开始和结束); CSS跟HTML 分文件夹并行存放,命名都得统一(例如style.css); JS 分文件夹存放 命名以该JS功能为准的英文翻译。 图片采用整合的 images.png png8 格式文件使用 尽可能整合在一块儿使用方便未来的管理
如何设计突发大规模并发架构?
当团队人手不足,把功能代码写完已经须要加班的状况下,你会作前端代码的测试吗?
说说最近最流行的一些东西吧?常去哪些网站?
ES6\WebAssembly\Node\MVVM\Web Components\React\React Native\Webpack 组件化
知道什么是SEO而且怎么优化么? 知道各类meta data的含义么?
移动端(Android IOS)怎么作好用户体验?
清晰的视觉纵线、 信息的分组、极致的减法、 利用选择代替输入、 标签及文字的排布方式、 依靠明文确认密码、 合理的键盘利用、
简单描述一下你作过的移动APP项目研发流程?
你在如今的团队处于什么样的角色,起到了什么明显的做用?
你认为怎样才是全端工程师(Full Stack developer)?
介绍一个你最得意的做品吧?
你有本身的技术博客吗,用了哪些技术?
对前端安全有什么见解?
是否了解Web注入攻击,说下原理,最多见的两种攻击(XSS 和 CSRF)了解到什么程度?
项目中遇到国哪些印象深入的技术难题,具体是什么问题,怎么解决?。
最近在学什么东西?
你的优势是什么?缺点是什么?
如何管理前端团队?
最近在学什么?能谈谈你将来3,5年给本身的规划吗?
1. 极客标签: http://www.gbtags.com/ 2. 码农周刊: http://weekly.manong.io/issues/ 3. 前端周刊: http://www.feweekly.com/issues 4. 慕课网: http://www.imooc.com/ 5. div.io: http://div.io 6. Hacker News: https://news.ycombinator.com/news 7. InfoQ: http://www.infoq.com/ 8. w3cplus: http://www.w3cplus.com/ 9. Stack Overflow: http://stackoverflow.com/ 10.w3school: http://www.w3school.com.cn/ 11.mozilla: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript
备注:
在 github 项目的右上角,有三个按钮,分别是 watch、star、fork,新来的同窗注意不要用错了,无休止的邮件提醒会给你形成没必要要的信息干扰。 当你选择Watching,表示你之后会关注这个项目的所有动态,之后只要这个项目发生变更,被别人提交了pull request、被发起了issue等状况你都会收到邮件通知。 star至关因而点赞或收藏,方便之后查找。 fork表示你想要补充完善这个项目的内容。