为什么`+ [[]] + [[]]`返回一个字符串?

时间:2016-09-28 19:15:50

标签: javascript

有一条声明CustomActivity * customActivity = [[CustomActivity alloc]init]; CustomItemProvider *itemProvider = [[CustomItemProvider alloc] initWithPlaceholderItem:_itemsArray]; NSArray *activityItems = [NSArray arrayWithObjects:itemProvider, NSLocalizedString(@"Attached is a file.", nil), nil]; UIActivityViewController *avc = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:@[customActivity]]; float iOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; if (iOSVersion < 9.0) { avc.excludedActivityTypes = @[UIActivityTypePostToFacebook, UIActivityTypeAirDrop, UIActivityTypeCopyToPasteboard, UIActivityTypeMessage, UIActivityTypePostToFlickr, UIActivityTypePostToTwitter, UIActivityTypePostToVimeo, UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeSaveToCameraRoll, UIActivityTypePostToTencentWeibo,UIActivityTypeAssignToContact, UIActivityTypeAddToReadingList]; } else { avc.excludedActivityTypes = @[UIActivityTypePostToFacebook, UIActivityTypeAirDrop, UIActivityTypeCopyToPasteboard, UIActivityTypeMessage, UIActivityTypePostToFlickr, UIActivityTypePostToTwitter, UIActivityTypePostToVimeo, UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeSaveToCameraRoll, UIActivityTypePostToTencentWeibo,UIActivityTypeAssignToContact, UIActivityTypeAddToReadingList, UIActivityTypeOpenInIBooks]; } [self presentViewController:avc animated:YES completion:nil]; 。控制台返回&#34; 0&#34; (一个字符串)。 当语句为+[[]] + [[]]时,控制台返回0(一个数字)。 如果+[[]]为0,第一个如何返回字符串?

2 个答案:

答案 0 :(得分:3)

这里的语法树看起来像

            +
           / \
          /   \
         +   [   ]
         |     |
         |     |
       [   ]  [ ]
         |
         |
        [ ]

也就是说,二进制+的左侧操作数是一元+操作的结果,而右侧操作数是[[]]表达式的结果

左侧是runtime semantics of the unary + operator运算符的一个数字,它调用ToNumber

右侧是一个对象,它在ToPrimitive的第9步中由evaluation of the + operator(通过调用对象的toString方法)强制转换为字符串基元。对于数组,toString返回由逗号连接的数组内容的字符串形式,在本例中为空字符串。

您可以通过覆盖某个对象上的toString并查看更改后的结果来验证这一点:

var a = [];
a.toString = function() { return "foo"; };
console.log(0 + a);

这将产生"0foo"

答案 1 :(得分:1)

+[[]] - 有一元运算符。

一元+运算符将其操作数转换为数字类型。一元 - 运算符将其操作数转换为数字类型,然后将其否定。

您的表达非常+[[]][[]] 其中'[[]]'由于二进制+运算符而转换为空字符串。

因此是0 + '' = '0'