一、判断数据类型;
常见的判断有typeof、instanceof、 constructor、 prototype,先来看typeof;
var a = "hello world";
var b = 10;
var c = [1, 3, 5];
var d = new Date();
var e = function() {}; console.log(typeof a); // string
console.log(typeof b); // number
console.log(typeof c); // object
console.log(typeof d); // object
console.log(typeof e); // function
其中typeof返回的类型都是字符串形式,需注意,例如:
alert(typeof a == "string") -------------> true
alert(typeof a == String) --------------> false
另外typeof 可以判断function的类型;在判断除Object类型的对象时比较方便。
判断已知对象类型的方法: instanceof。
console.log(c instanceof Array); // true
console.log(d instanceof Date); // true
console.log(e instanceof Function); // true
注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。
根据对象的constructor判断: constructor。
console.log(c.constructor === Array); // true
console.log(d.constructor === Date); // true
console.log(e.constructor === Function); // true
通用且更好的判断方式:Object.prototype.toString。
Object.prototype.toString.call( obj )返回一个字符串, 比如Object.prototype.toString.call( [1,2,3] ) 总是返回"[object Array]" , 而Object.prototype.toString.call( “str”)总是返回"[object String]"。
console.log(Object.prototype.toString.call(a) === "[object String]"); // true
console.log(Object.prototype.toString.call(b) === "[object Number]"); // true
console.log(Object.prototype.toString.call(c) === "[object Array]"); // true
console.log(Object.prototype.toString.call(d) === "[object Date]"); // true
console.log(Object.prototype.toString.call(e) === "[object Function]"); // true
对于Object.prototype.toString,可以编写一个通用的isType函数,代码如下:
var isType = function(type) {
return function(obj) {
return Object.prototype.toString.call(obj) === "[object " + type + "]";
}
}
// 调用
var isString = isType("String");
var isArray = isType("Array");
var isNumber = isType("Number");
var isFunction = isType("Function");
var string = isString("hello world");
var number = isNumber(10);
var array = isArray([]);
var func = isFunction(function() {}); console.log(string); // true
console.log(number); // true
console.log(array); // true
console.log(func); // true
二、函数的柯里化currying;
函数柯里化(function currying)。currying 的概念最早由俄国数学家MosesSchönfinkel 发明,而后由著名的数理逻辑学家Haskell Curry 将其丰富和发展,currying 由此得名。currying 又称部分求值。一个currying 的函数首先会接受一些参数,接受了这些参数之后,该函数并不会立即求值,而是继续返回另外一个函数,刚才传入的参数在函数形成的闭包中被保存起来。待到函数被真正需要求值的时候,之前传入的所有参数都会被一次性用于求值。
通用的function currying(){},
var currying = function(fn) {
var args = [];
return function() {
if (arguments.length === 0) {
return fn.apply(this, args);
} else {
[].push.apply(args, arguments);
return arguments.callee;
}
}
};
关于函数的柯里化怎么运用呢?来看一个例子;
var multi = function () {
var total = 0;
for (var i = 0, c; c = arguments[i++];) {
total += c;
}
return total
};
// 函数柯里化通用实现;
var currying = function(fn) {
var args = [];
return function() {
if (arguments.length === 0) {
return fn.apply(this, args);
} else {
[].push.apply(args, arguments);
return arguments.callee;
}
}
};
var sum = currying(multi);
sum(10, 20, 30);
sum(60)(60);
console.log(sum()); //