4

我最近遇到了一些 javascript 的问题,该问题与我的编程背景的每一个骨骼都背道而驰。Javascript 经常对我这样做,所以我并不感到惊讶。

我有这样的功能......

function x(param1, booleanParam, arrayParam){
    ....
}

我收到一个运行时错误,说arrayParam.length没有定义。在调试时,我看到这是真的,并去找出原因。原来我在函数调用中忘记了逗号......

x(param1, true [arrayJunk]);

我遇到的问题是弄清楚为什么要打这个电话?为什么这不是编译错误,Javascript 是如何看到这个并认为,“是的,这似乎可以工作!”

提前感谢您可以分享的任何启发!

4

4 回答 4

3

那是一个索引表达式。
它的语法与someArray[someIndex].

它最终也会undefined作为第二个参数传递,除非arrayJunk碰巧是布尔基元的属性名称。

于 2012-06-04T16:40:24.213 回答
2

会发生以下情况:

  • JavaScript 引擎转换trueBoolean对象(不是原语)
  • 然后它尝试访问存储在arrayParam该对象中的属性名称
  • 属性不存在,所以它返回 undefined

如果arrayParam是字符串"toString",它将返回一个函数对象

于 2012-06-04T16:44:24.263 回答
0

在这种情况下,表达式被解释为索引。本质上与

someArray[42]

所以它被视为带有 2 个参数而不是 3 个参数的函数调用

于 2012-06-04T16:41:37.043 回答
0

许多动态语言不会检查您是否向函数传递了太多或太少的参数。

虽然这有时可以掩盖错误,但它也允许您滚动自己的默认参数方案。

于 2012-06-04T16:44:26.330 回答