Javascript 为什么1[“foo”返回未定义而不是错误?
今天我遇到了一件用Javascript编写的奇怪事情。 在Chrome控制台中执行时:Javascript 为什么1[“foo”返回未定义而不是错误?,javascript,Javascript,今天我遇到了一件用Javascript编写的奇怪事情。 在Chrome控制台中执行时: > 1["foo"] Chrome控制台返回: undefined 不过我以为会有错误。怎么可能呢?我通过研究Underline.js(一个旧版本)invoke方法(该方法似乎使用JavaScript属性)得出了这个结论: // Invoke a method (with arguments) on every item in a collection. _.invoke = functio
> 1["foo"]
Chrome控制台返回:
undefined
不过我以为会有错误。怎么可能呢?我通过研究Underline.js(一个旧版本)invoke
方法(该方法似乎使用JavaScript属性)得出了这个结论:
// 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'}
任何东西,甚至原语,本质上都是对象,可以有成员(属性、方法等)。所有有问题的代码都在试图在
1
上找到名为foo
的成员,但未找到该成员,因此返回未定义的。“今天我遇到了Javascript中的一件奇怪的事情。”。。这种情况每天都发生在我身上,哈哈,但这比平常更奇怪:你正在使用“括号符号”试图访问1
对象上的foo
属性。1.foo.foo
将是一个错误。出于同样的原因1['toString']
将返回ƒtoString(){[native code]}
。所有js类型都是具有属性和方法的对象。