ストラト
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()→例外TypeErrorstring
:の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(入力引数、ヒント番号) |
キャスト演算子
プラス記号(+)
+
単独で使用される単項演算子、として、右ターン数のオペランドの型を強制的に、すなわち、右側のオペランドは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' // '11' 42 + '' // '42'
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である場合にNaN 3を、返すfalseに。xとyの値が同じであれば2、戻りtrueにそうでない場合、falseに。3.当事者の一方がある場合は0または-0及びその他がある+0または-0、返しtrueに。 弦 双方は、正確に同じ文字シーケンスで返すtrueに。それ以外の場合は、返し偽。 ブーリアン 双方は、真または偽、返す真、そうでない場合はfalse。 オブジェクト 両側が同じオブジェクトを参照し、そして返しtrueに。それ以外の場合は、返し偽 NaN == NaN // false -0 == +0 // true
ヌル与未定義
null == undefined // true
文字列と数字
文字列は、つまり、デジタルと比較されます
ToNumber(字符串) == 数字
。10 == '10' // true 10 == 'a' // false /* 十六进制 '0xa' => 十进制 10 */ 10 == '0Xa' // true
ブールタイプおよび他のタイプ
boolean型は、デジタルに変換され、その後、他のタイプと比較され、
ToNumber(布尔类型) == 其他类型
0 == false // true '1' == true // true null == false // false undefined == false // false
非オブジェクト型とオブジェクト型
元の型のオブジェクト型に変換し、その比較されます
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
それを理解することは困難である場合には
[] == ![]
[] == ![] // true /* 第一步: !的优先级比 == 高,所以 ![] 解析为 !Boolean([]),结果为 true. 现在: [] == true 第二布: 布尔类型与其他类型进行比较,解析为 ToNumber(true), 结果为 0. 现在: [] == 0 第三步: 对象类型与非对象类型进行比较,解析为 ToPrimitive([], 'number'),结果为 0. 现在: 0 == 0 // true */
[null] == ''
[null] == '' // true [undefined] == '' // true /* [null].toString() 以及 [undefined].toString() 均返回空字符串 '' 因为 null 与 undefined 均没有 toString 和 valueOf 方法。 */
0 == '\n'
0 == '\n' // true 0 == '\t\r\n' // true /* 上述语句被解析为 ToNumber('\n'), 返回结果为 0. */
备注
理解了类型转换,你会发现并非一定要抛弃==
去使用===
。