参考 Javascript密码花园 http://www.jb51.net/onlineread/JavaScript-Garden-CN/
null 和undefined 不是对象,其他的都是对象。* 需要注意的是数字直接量,因为javascript数字直接量采用浮点型
所以类似 2.tostring() 会出错, 而2..toString() 则是正常的(ECMAScript3,暂不知道5有没有针对这个问题做处理),但是可以采用(2).toString()解决这个问题
1.var foo = Object.create(Object.prototype);
Object.create(null).toString() 会报错,因为创建了一个空对象。
2.var foo = {};
3.var foo = new Object();
var foo = {name:Jocelyn};
foo.name; //Jocelyn
foo['name'] ; // Jocelyn
var address = “”;
for(var i = 0; i < 4; i++) {
address += customer[‘address' + i];
}
var len = foo && foo.name && foo.name.length //利用&&运算符的短路属性
/**
把p中的所有可枚举类型复制到o 并返回o
如果o和p包含同名属性,取p的属性
这个函数并不处理setter和getter以及复制属性
**/
function extend(o,p) {
for(prop in p) {
o[prop] = p[prop];
}
return o;
}
/**
把p中的所有可枚举类型复制到o 并返回o
如果o和p包含同名属性,o中属性不受影响
这个函数并不处理setter和getter以及复制属性
**/
function merge(o,p) {
for(prop in p) {
if(o.hasOwnProperty[prop]) continue;
o[prop] = p[prop];
}
return o;
}
/**
如果o中得属性在p中没有同名属性,则从o中删除这个属性,并返回o
**/
function restrict(o,p) {
for(prop in o) { //遍历o中所有属性
if(!(prop in p)) delete o[prop]; //如果 p中不存在,则删除之
}
return o;
}
/**
如果o中的属性在p中存在同名属性,则从o中删除这个属性,并返回o
**/
function subtract(o,p) {
for(prop in p) {
delete o[prop];
}
return o;
}
/**
返回一个新对象,这个对象同时拥有o的属性和p的属性
如果o和p中有重名属性,取p中得属性值
**/
function union(o,p) {
return extend(extebd({},o),p);
}
/**
返回一个新对象,这个对象同时拥有o的属性和p的属性
很像求o,p的交集,但p中得属性值会被忽略
**/
function intersection(o,p) {
return restrict(extend({},o),p);
}
/**
返回一个数组,这个数组包含的事o中可枚举的自有属性的名字
**/
function keys(o) {
if(typeof o !== "object") throw TypeError(); //参数必须似乎对象
var result=[]; //定义返回数组
for(prop in o) { //遍历对象
if(o.hasOwnProperty(prop)) { //判断是否自有属性
result.push(prop);
}
}
return result;
}
/**
给Object.prototype添加一个不可枚举的属性 extend() 方法
这个方法继承自调用它的对象,将作为参数传入的对象的属性一一复制
除了值之外,也复制属性的所有特性,除非在目标对象中存在同名属性
参数对象的所有自有属性(包括不可枚举的属性)也会被一一复制
**/
Object.defineProperty(Object.prototype添加一个不可枚举的属性,
'extend',
{
writable : true,
enumerable : false,
configurable :true,
value : function(o) {
var names = Object.getOwnPropertyNames(o); //得到所有自有属性,包括不可枚举类型
for( var i = 0; i < names.length; i++) {
if(names[i] in this) continue;
//获取o中得属性描述符
var desc = Object.getOwnPropertyDescriptor(o,names[i]);
//用它给this创建一个属性
Object.defineProperty(this,names[i],desc);
}
}
});
var empty = [];
var misc = [1.1, ‘true’,];
var a = new Array();
var a = new Array(10); //(此种情况很可能出现稀疏数组)
/**
检查对象的类属性来判断是不是数组
**/
var isArray = Function.isArray || function (o) {
return typeof o === "object" &&
Object.prototype.toString.call(o) === "[Object Array]";
}
/**
检测类数组对象
**/
function isArrayLike(o) {
if(o && typeof o === "object" &&
isFinite(o.length) &&
o.length >= 0 &&
o.length === Math.floor(o.length) &&
o.length < 2^32 )
return true;
else
return false;
}
//类数组对象调用数组方法兼容模式
Array.join = Array.join || function(a,sep) {
return Array.prototype.join.call(a,sep);
};
Array.slice = Array.slice || function(a,from,to) {
return Array.prototype.slice.call(a,from,to);
};
Array.map = Array.map || function(a,f,thisArg) {
return Array.prototype.map.call(a,f,thisArg);
};
Array.filter = Array.filter || function(f) {
return Array.prototype.filter.call(f);
};
Array.reduce = Array.reduce || function(f,d,v,i,a) {
return Array.prototype.reduce.call(f,d,v,i,a);
};