我在this MDN文档中显示的polyfill中看到了这些片段:
// Casts the value of the variable to a number.
// So far I understand it ...
count = +count;
// ... and here my understanding ends.
if (count != count) {
count = 0;
}
我不知道目的。
某些事情本身如何不平等?
答案 0 :(得分:5)
在JavaScript中,NaN是唯一不等于自身的值。这是对NaN的检查。
答案 1 :(得分:4)
当计数为NaN
时,这是测试,因为只有NaN != NaN
。
答案 2 :(得分:2)
Othere的答案已经提到为什么需要检查。但是,如果期望值是像count = +count || 0; // so if count = NaN which is a falsy value then 0 will be assigned.
那样的假值,还有另一种方法可以指定默认值。
如果您有以下条件,则不需要if条件:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
//Push
let settings = UIUserNotificationSettings(forTypes: .Alert, categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
if let options: NSDictionary = launchOptions {
let remoteNotification = options.objectForKey(UIApplicationLaunchOptionsRemoteNotificationKey) as? NSDictionary
if let notification = remoteNotification {
self.application(application, didReceiveRemoteNotification: notification as! [NSObject : AnyObject])
}
}
return true
}
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
let ckNotification = CKNotification(fromRemoteNotificationDictionary: userInfo as! [String : NSObject])
if ckNotification.notificationType == .Query {
let queryNotification = ckNotification as! CKQueryNotification
let recordID = queryNotification.recordID
let container = CKContainer.defaultContainer()
let privateDatabase = container.privateCloudDatabase
privateDatabase.fetchRecordWithID(recordID!) {newRecord, error in
if error != nil {
print(error)
} else {
NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
print(newRecord)
})
}
}
}
}
答案 3 :(得分:0)
我会试着总结一下已经说过的话
if (count != count) {
检查count
是否为NaN
。根据{{3}}:
ECMAScript代码测试值X是否为NaN的可靠方法是X!== X形式的表达式。当且仅当X是NaN时,结果才为真。
(在这种情况下无关紧要,但根据标准要求,填充物使用!=
代替!==
。
您可能想问,为什么不使用isNaN
?因为isNaN
没有按照其名称暗示 - 它不会检查值是否为NaN
,而是检查值是否 NaN
转换为数字时。例如,"foo"
显然不是NaN
,isNaN("foo")
仍然是True
。相反,isNaN([[1]])
为False
,但[[1]]
不是有效数字。
count = +count || 0
怎么样?这是一个有效的快捷方式,但MDN polyfills尝试尽可能接近标准。 specs说:
设n为ToInteger(count)。
设数为ToNumber(参数)。
...
如果number为NaN,则返回+0。
请注意,它没有说“call isNaN”,它说“如果数字 NaN”,找到的方法是将number
与自身进行比较。
另一个选项是ToInteger
,与全局isNaN
不同,它不会强迫其论证。当且仅当x 实际上 NaN
Number.isNaN(x)
才会返回true
Number.isNaN("foo") => false
Number.isNaN([[11]]) => false
Number.isNaN(0/0) => true
因此,神秘的比较运算符if (count !== count)
可以替换为if (Number.isNaN(count))
。