js 中的事件委托或是事件代理详解
异步流程控制方法
谈谈两种设计模式
1:工厂模式
主要好处就是可以消除对象间的耦合,通过使用工程方法而不是 new 关键字。将所有实例化的代码集中在一个位置防止代码重复。
工厂模式解决了重复实例化的问题 ,但还有一个问题,那就是识别问题,因为根本无法搞清楚他们到底是哪个对象的实例。
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');//第二个实例
2:构造函数模式
使用构造函数的方法 ,即解决了重复实例化的问题 ,又解决了对象识别的问题,该模式与工厂模式的不同之处在于:
1.构造函数方法没有显示的创建对象 (new Object());
2.直接将属性和方法赋值给 this 对象;
3.没有 renturn 语句。
null 和 undefined 的区别?
对未初始化的变量执行
typeof
操作符会返回undefined
值,对未声明的变量执行typeof
操作符同样也会返回undefined
值,所以我们在编写代码的过程中应该显示的初始化变量,那么当typeof
返回undefined
的时候,我们就知道被检测的变量还没有被声明而不是还没有初始化。、undefined
值是派生自null
值的,他们的相等性测试要返回true
alert(null == undefined);//true
alert(null === undefined);//false
null
值表示一个空对象指针,而这也正是使用typeof
操作符检测null
值会返回“object”
的原因。如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为
null
,而不是其他值,这样一来,只要直接检查 `null“ 值就可以知道相应的变量是否已经保存了一个对象的引用。
if (car != null){
//对 car 对象执行某些操作
}
- 无论在什么情况下都没有必要把一个变量的值显示的设置为
undefined
,可以同样的规则对null
却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null
值。这样做不仅可以体现null
作为空对象指针的惯例,而且也有助于进一步区分null
和undefined
。
谈谈 JS 严格模式
编写一个函数实现对 Object,Array,Boolean,Number,String 这五种主要数据类型进行值复制
function clone(obj) {
var o;
switch (typeof obj) {
case "undefined":
break;
case "string":
o = obj + "";
break;
case "number":
o = obj - 0;
break;
case "boolean":
o = obj;
break;
case "object": // object 分为两种情况 对象(Object)或数组(Array)
if (obj === null) {
o = null;
} else {
if (Array.isArray(obj)) {
o = [];
for (var i = 0; i < obj.length; i++) {
o.push(clone(obj[i]));
}
} else {
o = {};
for (var k in obj) {
o[k] = clone(obj[k]);
}
}
}
break;
default:
o = obj;
break;
}
return o;
}