JavaScript由一下三部分组成:
浏览器的渲染过程:
DOM树和渲染树的区别:
JavaScript作用域:
JavaScript变量声明提升:
原型:
原型链:
原型特点:
JavaScript对象是通过引用来传递的,当修改原型时,与之相关的对象也会继承这一改变
1.构造函数法(this+prototype)--用new关键字生成实例化对象
缺点:用到了this和prototype,编写复制,可读性差
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();
2.Object.create法--用Object.create()生成实例对象
缺点:不能实现私有属性和私有方法,实例对象直接也不能共享数据
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();
};
}
3.极简主义法(消除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();
4.ES6语法糖class--用new关键字 生成实例对象
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
var point = new Point(2, 3);
1.构造函数绑定:使用call或apply方法,将父对象的构造函数绑定在子对象上
function Cat(name,color){
Animal.apply(this,arguments);
this.name = name;
this.color = color;
}
2.实例继承:将子对象的prototype指向父对象的一个实例
Cat.prototype = new Animal();
Cat.prototype.contructor = Cat;
3.拷贝继承:如果把父对象的所有属性和方法,拷贝进子对象
function extend(Child,Parent){
var p = Parent.prototype;
var c = Child.prototype;
for (var i in p) {
c[i] = p[i]
}
c.uber = p;
}
4.原型继承:将子对象的prototype指向父对象的prototype
function extend(Child,Parent){
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.contructor = Child;
Child.uber = Parent.prototype
}
5.ES6语法糖extends:class ColorPoint extends Point{}
class ColorPoint extends Point {
constructor(x, y, color) {
super(x, y); // 调用父类的constructor(x, y)
this.color = color;
}
toString() {
return this.color + ' ' + super.toString(); // 调用父类的toString()
}
}
eval的功能是把对应的字符串解析成js代码并运行
介绍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
用原生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)
// 转换为一个十六进制-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创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON;但写法有很多种,也能混合使用
1.对象字面量的方式
person = {firstname:'mark',lastname:'Yun',age:25,eyecolor:'black'}
2.function来模拟无参的构造函数
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();
3.用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方法
4.用工厂方式来创建(内置对象)
var wcDog =new Object();
wcDog.name="旺财";
wcDog.age=3;
wcDog.work=function(){
alert("我是"+wcDog.name+",汪汪汪......");
}
wcDog.work();
5.用原型方式来创建
function Dog(){
}
Dog.prototype.name="旺财";
Dog.prototype.eat=function(){
alert(this.name+"是个吃货");
}
var wangcai =new Dog();
wangcai.eat();
6.用混合方式来创建
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;
}
};
同步和异步的区别?
documen.write和 innerHTML的区别
DOM操作——怎样添加、移除、移动、复制、创建和查找节点?
(1)创建新节点
(2)添加、移除、替换、插入
(3)查找
Ajax 是什么? 如何创建一个Ajax?
ajax的全称:Asynchronous Javascript And XML
渐进增强和优雅降级
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; iif (str.charCodeAt(i) > 255) bytes++;
}
return bytes;
}
alert(GetBytes("你好,as"));
请解释什么是事件代理
attribute和property的区别是什么?
页面编码和被请求的资源编码如果不一致如何处理?
设置 charset把放在
之前和之后有什么区别?浏览器会如何解析它们?
结束后出现
或任何元素的开始标签,都是解析错误
之前没有区别