今天,我遇到了Java语言中的一件奇怪的事情。 在Chrome控制台中执行以下命令时:
> 1["foo"]
Chrome控制台返回:
undefined
虽然我期待一个错误。这怎么可能?通过研究似乎使用该JavaScript属性的underscore.js(旧版本)invoke
方法,可以得出结论:
// Invoke a method (with arguments) on every item in a collection.
_.invoke = function(obj, method) {
var args = slice.call(arguments, 2);
var isFunc = _.isFunction(method);
return _.map(obj, function(value) {
var func = isFunc ? method : value[method];
return func == null ? func : func.apply(value, args);
});
};
如您所见,value
可以是数字,并且如果1["foo"]
引发错误,则该代码将是不安全的,因为我可能会错误地执行以下操作:
var a = {'foo' : 1}
_.invoke(a, 'foo'}
答案 0 :(得分:4)
所有内容,甚至是基元,本质上都是对象,可以具有成员(属性,方法等)。有问题的代码正在尝试在1
上找到名称为foo
的成员,但找不到该成员,因此返回了undefined
。