2017-01-14 11 views
2

一般的なjavascriptでお願いします。console.logがnullの場合、==は動作しますが、===ではないのはなぜですか?

私はユーザーがFacebookへの投稿を共有したいかどうかを示すフラグがあります。クリックすると、ユーザーがすでにFacebookブックトークンを持っているかどうかがチェックされます。また、トークンが有効かどうか。

いずれかが真でない場合は、Facebookにサインインするようにユーザーに求めます。

今のところコードはうまく動作します。しかし、長い間私はif(facebookToken === null)をしていた

それを無視していた。私が==に切り替えるまでは、それは機能しました。

これはなぜですか? 、

shareToFacebookPress() { 
    const timeNow = Date.now(); 
    const facebookToken = this.props.facebook_token; 
    console.log(facebookToken); 
    const facebookExpiry = this.props.facebook_token_expiry * 1000; 
    console.log(facebookExpiry); 
    if (facebookToken == null || facebookExpiry < timeNow) { 
     console.log("doesn't exist"); 
     this.props.signInFacebook(); 
    } else { 
     this.state.shareToFacebook ? 
     this.setState({ shareToFacebook: false }) : 
     this.setState({ shareToFacebook: true }); 
    } 
    } 

きっと===直接比較を、私は値logginコンソールだとバックnullを取得した場合:私は、コンソールにログインし、それがこの作品私のコードではnull

として戻ってきましたよ確かにif(value === null)は本当と同じでなければなりませんか?

これは不可能なようです。ここで何が起こっていますか?

value場合は、コンソールnullにログとtrueに一致しないこと、なぜ私はif(value === null)していますか?

確かに、コンソールログの場合nullそれはそれでなければならないのですか?

私がconsole.log(null)によって印刷さ==

+2

「ヌル」でしたか? IIRCの場合、 'value == null'を比較するときの唯一の値は' true'に 'null'と' undefined'です。 – Rafael

+0

yup 100%データベース内にゼロレコードがあり、コンソールログに 'null 'があります – bloppit

+1

null ===未定義// false null ==未定義// true –

答えて

-1

nullを使用していた場合は理にかなっている、"null"として戻って来ていないが、それ自体でちょうどリテラル式、per MDN description of nullです。 nullは、前述のvalueのようなグローバルオブジェクトのプロパティではなく、むしろオブジェクトです。実際には、オブジェクトを値(またはプロパティ)と比較しています。===でこれまで何をしていますか?したがって、値の型とnullは異なるため、if(value === null)falseになります。ただし、==を使用してif(value == null)をチェックすると、チェックの前に型変換が実行されます。したがってvaluenullは、チェックの直前に同じタイプを保持しています。valuenullを比較することができます。しかし、注意すべき点の1つは、==が平等のチェックにおいて非常に寛容であり、間違いを起こしやすいことです。

+0

[*抽象的な等価比較*アルゴリズム](http://ecma-international.org/ecma-262/7.0/index.html#sec-abstract-equality-comparison)の規則を使用して型を等しくすると、評価は[*厳密な等価比較アルゴリズム*](http://ecma-international.org/ecma-262/7.0/index.html#sec-strict-equality-comparison)と同じです。 – RobG

+0

-1、申し訳ありません。あなたは "タイプ"という言葉を誤解しているようです。 'null'の型は' object'です。構文上、 'null'はリテラルですが、そのリテラルは値を表し、プロパティがその値をとることは絶対に可能です。 (例えば、 'window.foo = null'を実行した後、' window.foo === null'は 'true'になります) – ruakh

+0

私はあなたの答えを編集したことがわかりますが、それはまだ間違っています。 。 – ruakh

関連する問題