var getTypeStr = Object.prototype.toString.call; getTypeStr({}); // 你认为结果是什么?
为什么呢?
toString.call 他是基于构造函数去调用的, 也应该算是函数内部的. 所以你根本没有必要纠结这个问题. 他就是这么特殊.
@danielsss 不明白…
根据ecma-262的规范,call方法需要在func对象上调用。当IsCallable(func)为false的时候,会抛出TypeError。所以chrome中的错误是:TypeError: undefined is not a function
http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.4.4
var type = function(obj) { var map = { '[object Array]': 'array', '[object Object]': 'object', '[object String]': 'string', '[object Number]': 'number', '[object Boolean]': 'boolean', '[object Null]': 'null', '[object Function]': 'function' }; var t = Object.prototype.toString.call(obj); return map[t]; }
根据你代码的意思,你可能是需要类似于这种功能。希望对你有帮助。
@ruanyl 赞!
@ruanyl 还可以加一个 '[object Undefined]',谢谢!
'[object Undefined]'
var getTypeStr = Object.prototype.toString.call.bind(Object.prototype.toString);
这样就可以了。 @ruanyl 说得很靠谱,所以如果不做bind,getTypeStr就是没有指定一个方法的call(call执行时的this不是一个函数),所以会报错。
炒冷饭的bind
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
toString.call 他是基于构造函数去调用的, 也应该算是函数内部的. 所以你根本没有必要纠结这个问题. 他就是这么特殊.
@danielsss 不明白…
根据ecma-262的规范,call方法需要在func对象上调用。当IsCallable(func)为false的时候,会抛出TypeError。所以chrome中的错误是:TypeError: undefined is not a function
http://www.ecma-international.org/ecma-262/5.1/#sec-15.3.4.4
根据你代码的意思,你可能是需要类似于这种功能。希望对你有帮助。
@ruanyl 赞!
@ruanyl 赞!
@ruanyl 还可以加一个
'[object Undefined]',谢谢!这样就可以了。 @ruanyl 说得很靠谱,所以如果不做bind,getTypeStr就是没有指定一个方法的call(call执行时的this不是一个函数),所以会报错。
炒冷饭的bind