你可以在JavaScript中有多个可选参数
假设您有一个功能狗,它需要3个参数,一个需要,2个可选。
dog(dogsName, [tripsOutOfTheCountry], [numberOfDoctorsVisits])
我知道你可以检查未定义但是如果这个人没有提供tripOutOfTheCountry,因为它是可选的,只是提供他们认为是numberOfDoctorsVisits。
示例运行:
dog("Rusty", 10)
他们为numberofDoctorsVisits输入10,将tripsOutOfTheCountry留空,因为它是可选的。
所以真的程序似乎tripOutOfTheCountry为10,这是真正的数字医生访问
有没有办法避免这种情况。我不认为除了用户为tripsOutOfTheCountry输入0之外还有其他办法。
将上述示例修改为dog("Rusty, 0, 10)
我只是提出这个问题,因为我不知道是否可能。
P.S。对不起老生的例子
答案 0 :(得分:2)
在任何不支持调用时命名参数的语言中都存在同样的问题,但只是传递参数位置。如果你能明确规定每个参数,你可以手动弄清楚它是什么;例如如果参数具有不同的类型(如数字和函数),则可以测试分配给什么的内容,并根据预期的类型和顺序进行转换。许多想要公开灵活API的库可以做到这一点,例如:只需查看somewhat controversially允许的变体。这就是你的全部,Javascript根本无法帮助你。
执行此操作的常用方法是传递具有显式名称的对象:
015-12-18 11:19:07.449 collaboration[4761:357519] *** Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/UITableView.m:7962
2015-12-18 11:19:07.453 collaboration[4761:357519] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView (<UITableView: 0x7c9f6400; frame = (16 58; 288 412); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x7a7a4170>; layer = <CALayer: 0x7a7a3250>; contentOffset: {0, 0}; contentSize: {288, 44}>) failed to obtain a cell from its dataSource (<collaboration.chatViewController: 0x7a7a0750>)'
*** First throw call stack:
(
0 CoreFoundation 0x00304a14 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x02233e02 objc_exception_throw + 50
2 CoreFoundation 0x003048aa +[NSException raise:format:arguments:] + 138
3 Foundation 0x00946d26 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 118
4 UIKit 0x00ede528 -[UITableView _configureCellForDisplay:forIndexPath:] + 228
5 UIKit 0x00eeb3cf -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 877
6 UIKit 0x00eeb4e1 -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 90
7 UIKit 0x00ebb948 -[UITableView _updateVisibleCellsNow:isRecursive:] + 3347
8 UIKit 0x00eda0d6 __29-[UITableView layoutSubviews]_block_invoke + 52
9 UIKit 0x00ef519e -[UITableView _performWithCachedTraitCollection:] + 88
10 UIKit 0x00ed9fab -[UITableView layoutSubviews] + 214
11 UIKit 0x00e30008 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 810
12 libobjc.A.dylib 0x02248059 -[NSObject performSelector:withObject:] + 70
13 QuartzCore 0x05bf580a -[CALayer layoutSublayers] + 144
14 QuartzCore 0x05be94ee _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 388
15 QuartzCore 0x05be9352 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
16 QuartzCore 0x05bdbe8b _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 317
17 QuartzCore 0x05c0fe03 _ZN2CA11Transaction6commitEv + 561
18 QuartzCore 0x05c11674 _ZN2CA11Transaction17flush_transactionEv + 50
19 UIKit 0x00d94dfa _afterCACommitHandler + 197
20 CoreFoundation 0x0021dffe __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
21 CoreFoundation 0x0021df5e __CFRunLoopDoObservers + 398
22 CoreFoundation 0x002138dc __CFRunLoopRun + 1340
23 CoreFoundation 0x002130e6 CFRunLoopRunSpecific + 470
24 CoreFoundation 0x00212efb CFRunLoopRunInMode + 123
25 GraphicsServices 0x05696664 GSEventRunModal + 192
26 GraphicsServices 0x056964a1 GSEventRun + 104
27 UIKit 0x00d63bfa UIApplicationMain + 160
28 collaboration 0x000b125c main + 140
29 libdyld.dylib 0x02c97a21 start + 1
30 ??? 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)