ジャバスクリプト:型変換

ストラト


JavaScriptの型変換は、ピットとなっているが、実際に、それはまた、コードの量を減らします。

たToPrimitive


Symbol.toPrimitiveが内蔵されたシンボル値は、オブジェクトが元の値に変換される場合、この関数が呼び出されると、オブジェクトのプロパティの値の関数として存在します。

この関数が呼び出されると、それは文字列パラメータ渡されたhint元の値に変換されることが予想タイプを表すが。hint値パラメータである"number""string""default"のいずれか。

// 一个没有提供 Symbol.toPrimitive 属性的对象,参与运算时的输出结果
let obj1 = {};
console.log(+obj1);     // NaN
console.log(`${obj1}`); // "[object Object]"
console.log(obj1 + ""); // "[object Object]"

// 接下面声明一个对象,手动赋予了 Symbol.toPrimitive 属性,再来查看输出结果
let obj2 = {
  [Symbol.toPrimitive](hint) {
    if (hint == "number") {
      return 10;
    }
    if (hint == "string") {
      return "hello";
    }
    return true;
  }
};
console.log(+obj2);     // 10      -- hint 参数值是 "number"
console.log(`${obj2}`); // "hello" -- hint 参数值是 "string"
console.log(obj2 + ""); // "true"  -- hint 参数值是 "default"

上記から分かるように、たToPrimitiveヒント変換プロセスパラメータに依存しています。

  • number:のvalueOf()→のtoString()→例外TypeError
  • string:のvalueOf()→例外TypeError→のtoString()
  • default:同じ番号

オブジェクト 返却値
アレイ オブジェクト自体の配列を返します。
ブーリアン ブール値。
日付 ミリ秒のUTCの1回目のカウントで1970年1月真夜中の先頭から蓄積時間。
関数 自分自身をする機能です。
数値。
オブジェクト オブジェクトそのもの。これがデフォルトです。
文字列値。
シンボル シンボル自体
数学とエラーオブジェクトがvalueOfメソッドを持っていません。

オブジェクト 返却値
アレイ [1、2、3] => "1,2,3"
ブーリアン 偽=>「偽」
日付 文字列のUTCを返します。
関数 ソースコードの現在の機能を表す文字列を返します。
現在の値を表す文字列を返します。
オブジェクト 「[対象オブジェクト]」
文字列そのもの。
シンボル "シンボル()"

注意:[null].toString()だけでなく、[undefined].toString()すべてが空の文字列を返します""

ToBoolean


ES5 9.2仕様のイスタンブールのキャスト(ToBoolean)偽値(偽)が存在することになるだけで、以下に記載されているが、残りは(真の)真の値です。

  • 未定義
  • ヌル
  • + 0、-Oは、NaN
  • 「」(空文字列)
/*
 以下 a、b、c 存储的是指向对象的指针,并非假值
*/
let a = new Number(0);
let b = new Boolean(false);
let c = new String('');

Boolean(a) // true
Boolean(b) // true
Boolean(c) // true

Boolean(0) // false
Boolean(false) // false
Boolean('') // false

ToNumber


オブジェクト 返却値
未定義 NaNの
ヌル 0
ブーリアン 0> =偽、真=> 1
帰国
それは解決できないStringNumericLiteralを、両方のNaNを返します
オブジェクト たToPrimitive(入力引数、ヒント番号)

注:StringNumericLiteral

キャスト演算子


プラス記号(+)

+単独で使用される単項演算子、として、右ターン数のオペランドの型を強制的に、すなわち、右側のオペランドはToNumberの使用()。

+1 // 1
+'1.2' // 1.2
+[] // 0
+[1, 2, 3] // NaN
+{} // NaN

感嘆符(!)

!軍は、右のオペランドの型ブールに回し、そして逆真、偽、右オペランドを使用することでしょう!ToBoolean()。

!true // false
!0 // true
![] // false
!'' // true
!undefined // true
!null // true

!!true // true
!!undefined // false
!!null // false

四事業者


以下のルールを追加します:

  1. 前記文字列操作の一つは、文字列は他に変換されます。

    1 + '1' // '11'
    42 + '' // '42'
  2. 1は文字列または数値でない場合は、文字列または数値に変換します。

    false + true // 1
    3 + [1, 2, 3] // '31,2,3'
    ([] + {}) // '[object Object]'
    
    /* {} + [] 的结果为 0, 是因为从左往右解析,{} 为一个代码块,+[] 被解析为将 [] 转为 number, 即 0。*/
    {} + [] // 0
    ({} + []) // "[object Object]"

    注意:

    /* 会出现以下情况,是因为 + 'b' 解释为 ToNumber('b') */
    'a' + + 'b' // "aNaN"

また操作以外の操作については、双方が数値演算に変換されます。

1 * '2' // 2
[] * {} // NaN
1 * [1, 2, 3] // NaN

let obj = {
    valueOf: () => {
        return 1
    }
}

obj * 2 // 2

==と===


以下のための==(比較的等しい)、 ===絶対に等しい)、書籍やブログのほとんどが旧のみチェック値として解釈されている等しく、後者のタイプの値をチェックし、実際に、これは間違っている、等しく、正しい解釈をする必要があります:旧比較した場合、キャストを可能にし、後者は許されません

11.9.3 ES5仕様では、それはコンクリートのすべてのタイプは、以下の状況に分けることができるカバー、比較的同等の挙動を定義します。

  1. 両側同じタイプ

    タイプ 結果
    未定義
    ヌル
    そのうちの一つが1である場合にNaN 3を、返すfalseにxとyの値が同じであれば2、戻りtrueにそうでない場合、falseに3.当事者の一方がある場合は0または-0及びその他がある+0または-0、返しtrueに
    双方は、正確に同じ文字シーケンスで返すtrueにそれ以外の場合は、返し
    ブーリアン 双方は、または、返す、そうでない場合はfalse
    オブジェクト 両側が同じオブジェクトを参照し、そして返しtrueにそれ以外の場合は、返し
    NaN == NaN // false
    -0 == +0 // true
  2. ヌル与未定義

    null == undefined // true
  3. 文字列と数字

    文字列は、つまり、デジタルと比較されますToNumber(字符串) == 数字

    10 == '10' // true
    10 == 'a' // false
    /* 十六进制 '0xa' => 十进制 10 */
    10 == '0Xa' // true
  4. ブールタイプおよび他のタイプ

    boolean型は、デジタルに変換され、その後、他のタイプと比較され、ToNumber(布尔类型) == 其他类型

    0 == false // true
    '1' == true // true
    null == false // false
    undefined == false // false
  5. 非オブジェクト型とオブジェクト型

    元の型のオブジェクト型に変換し、その比較されます ToPrimitive(对象类型) == 非对象类型

    [1] == 1 // true
    [1, 2] == 1 // false
    
    /* b.toString() 返回 '111' */
    let a = '111';
    let b = Object(a);
    a == b // true
    
    /* null 与 undefined 不能被封装为 object, 即 Object(null) 的返回结果与 Object() 的一样 */
    let c = null;
    let d = Object(c);
    c == d // false
    
    let e = undefined;
    let f = Object(e);
    e == f // false

それを理解することは困難である場合には


  1. [] == ![]

    [] == ![] // true
    
    /*
    第一步: !的优先级比 == 高,所以 ![] 解析为 !Boolean([]),结果为 true.
    现在: [] == true
    
    第二布: 布尔类型与其他类型进行比较,解析为 ToNumber(true), 结果为 0.
    现在: [] == 0
    
    第三步: 对象类型与非对象类型进行比较,解析为 ToPrimitive([], 'number'),结果为 0.
    现在: 0 == 0 // true
    */
  2. [null] == ''

    [null] == '' // true
    [undefined] == '' // true
    
    /*
    [null].toString() 以及 [undefined].toString() 均返回空字符串 ''
    因为 null 与 undefined 均没有 toString 和 valueOf 方法。
    */
  3. 0 == '\n'

    0 == '\n' // true
    0 == '\t\r\n' // true
    
    /*
    上述语句被解析为 ToNumber('\n'), 返回结果为 0.
    */

    具体解释:'\n\t\r' == 0 is true?

备注


理解了类型转换,你会发现并非一定要抛弃==去使用===

おすすめ

転載: www.cnblogs.com/guolao/p/11364779.html
おすすめ