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 对象生命周期的理解?
哪些操做会形成内存泄漏?