JavaScript中的值(不等值)是什么意思?

时间:2016-02-17 11:00:11

标签: javascript

我在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;
 }

我不知道目的。

某些事情本身如何不平等?

4 个答案:

答案 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"显然不是NaNisNaN("foo")仍然是True。相反,isNaN([[1]])False,但[[1]]不是有效数字。

count = +count || 0怎么样?这是一个有效的快捷方式,但MDN polyfills尝试尽可能接近标准。 specs说:

  

设n为ToInteger(count)。

其中spec for String.repeat

  

设数为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))