ホームページ  >  記事  >  ウェブフロントエンド  >  Javascriptの暗黙的な変換を使用するにはどうすればよいですか? (コード例)

Javascriptの暗黙的な変換を使用するにはどうすればよいですか? (コード例)

不言
不言転載
2019-01-11 11:07:162629ブラウズ

この記事の内容は、JavaScript の暗黙的変換の使用方法についてです。 (コードサンプル) は、参考にしていただければ幸いです。

2 つの変数が等しいかどうかを判断することは、プログラミングにおいて非常に重要な操作です。
文字列、数値、ブール値の同等性を比較する場合、問題は比較的単純です。しかし、オブジェクトを比較するとなると、問題は複雑になります。 ECMAScript の元の等価演算子と不等号演算子は、比較を実行する前にオブジェクトを同様の型に変換しました。その後、この換算が合理的かどうかについて疑問を呈する人もいた。
最後に、ECMAScript の解決策は、2 つの演算子のセットを提供することです:
等価と不等号 - 最初に変換してから比較、合同と不等号 - 変換せずに比較のみ。
ここでは平等についてのみ説明します。

"== 等しい場合の暗黙的な変換

「==」演算子の場合、通常は暗黙的な変換 (強制変換) が最初に実行され、その後それらの等価性が比較されます。 。

暗黙的な変換ルール:

1. オペランドの 1 つがブール値の場合、等しいかどうかを比較する前に数値に変換します。は 0 に変換され、true は 1 に変換されます。

2。一方のオペランドが文字列で、もう一方のオペランドが数値の場合、等価性を比較する前に文字列を数値に変換します。
Convert文字列から数値への変換:

(1) 数値文字列は対応する 10 進数値に変換されます。
(2) 空の文字列は 0 に変換されます。
(3) 残りはすべて変換されます。 to NaN; (NaN は、それ自体を含め、どの値とも等しくありません)

3. 一方のオペランドがオブジェクトで、もう一方のオペランドがオブジェクトでない場合は、オブジェクトの valueOf() メソッドを呼び出し、取得した基本型の値を使用します。前のルールに従って比較するには;

以下では、簡単な例を通じて JS の基礎となる変換ルールを見ていきます。

    // 根据隐式转换规则第三条 调用对象的 valueOf 方法
    [].valueOf() // []

    // 这时就变成 [] == false ,又回到原来的情况,这时JS底层又是怎么处理的呢?
    // 其实 JS 的底层在调用 valueOf 得到的返回结果如果不是原始值时,就会调用对象的 toString 方法将对象转换成字符串。对于这个过程我们可以通过一下的例子来验证。

    [].valueOf() // []
    [].toString() // ''
    //上面是 这两个方法的 默认行为,在下面的例子中我们不改变默认行为
    [].__proto__.valueOf = () => { console.log('valueOf'); return []; }
    [].__proto__.toString = () => { console.log('toString'); return ''; }
    [] == false
    // 运行的结果为 valueOf toString true
    // 这样就验证了上述的说明


      // 我们还可以通过下面的方式,从侧面在次验证 JS底层默认的转换行为

    [].__proto__.valueOf = () => { console.log('valueOf'); return ''; }
    [].__proto__.toString = () => { console.log('toString'); return ''; }
    [] == false
    // valueOf true

    [].__proto__.valueOf = () => { console.log('valueOf'); return []; }
    [].__proto__.toString = () => { console.log('toString'); return []; }
    [] == false
    // JS 报错 Uncaught TypeError: Cannot convert object to primitive value

次に、例を見てみましょう。空のオブジェクトが false に等しくないのはなぜでしょうか。通常の観点から見ると、配列はオブジェクトです。なぜ空の配列が false に等しく、空のオブジェクトが false に等しくないのですか?

    //现在我们可以参照上面隐式转换的过程,对空对象手动的执行这个过程,结果如下
    ({}).valueOf() // {}
    ({}).toString() // '[object Object]'

    // 这时我们发现 空对象 与 空数组默认行为的区别了,在 toString 方法上,由于数组会对继承自对象的 toString 方法进行重写,将数组中的每个元素通过 ',' 链接成一个字符串
    // 这时就变成了 '[object Object]' == false 
    // 根据规则第二条,得到最后结果 false

暗黙的な変換に関する特別なルール:

  1. null と unknown は等しいです。

  2. null と unknown は、等しいかどうかを比較する前に他の値に変換することはできません。

  3. オペランドの 1 つが NaN の場合、等価演算子は false を返し、不等号演算子は true を返します。

  4. 両方のオペランドがオブジェクトである場合、それらが同じオブジェクトであるかどうかを比較します。 (参照型のアドレスが同じか比較)

    null == undefined  // true
    NaN == NaN         // false
    NaN != NaN         // true
    false == 0         // true
    undefined == 0     // true
    null == 0          // true

以上がJavascriptの暗黙的な変換を使用するにはどうすればよいですか? (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。