一:Object.prototype.toString.call(param) 可以用来判断传入参数的构造类型 在toString方法被调用时,会执行下面的操作步骤: 1 如果this的值为undefined,则返回"[object Undefined]". 2 如果this的值为null,则返回"[object Null]". 3 让O成为调用ToObject(this)的结果. 4 让class成为O的内部属性[[Class]]的值. 5 返回三个字符串"[object ", class, 以及 "]"连接后的新字符串. 可以看出,比ES3多了1,2,3步.第1,2步属于新规则,比较特殊, 因为"Undefined"和"Null"并不属于[[class]]属性的值。经统计,可返回的类型有"Arguments", "Array", "Boolean", "Date", "Error", "Function", "JSON", "Math", "Number", "Object", "RegExp", "String"比ES3多了2种分别是arguments对象的[[class]] 二:引用对象其实就是函数对象 Array.constructor ==Function.constructor true String.constructor ==Function.constructor true Object.constructor ==Function.constructor true 三:每个function定义的对象有一个prototype属性,prototype属性是指向 prototype对象的,而每个prototype对象都有一个constructor属性,每个constructor属性又指向一个constructor对象也就函数本身。 使用new生成的对象就没有这个prototype属性。 四:深度克隆:(这个函数还是非常不完善的。) var cloneObj = function(obj){ var str, newobj = obj.constructor === Array ? [] : {}; if(typeof obj !== 'object'){ return; } else if(window.JSON){ str = JSON.stringify(obj), //序列化对象 newobj = JSON.parse(str); //还原 } else { for(var i in obj){ newobj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i]; } } return newobj; };