今回は、JS での暗黙的変換の使用についていくつかまとめてみます。JS での暗黙的変換を使用する際の 注意事項 について、実際のケースを見てみましょう。
js 内の異なる データ型 間の比較と変換のルールは次のとおりです:
1. オブジェクトとブール値の比較
オブジェクトとブール値を比較する場合、オブジェクトはまず文字列に変換され、次に数値に変換され、ブール値は直接数値に変換されます
[] == true; //false []转换为字符串'',然后转换为数字0,true转换为数字1,所以为false
2. オブジェクトと文字列の比較
オブジェクトと文字列を比較する場合、オブジェクトは文字列に変換されてから 2 つが比較されます。
りー3. オブジェクトと数値の比較
オブジェクトを数値と比較する場合、オブジェクトはまず文字列に変換され、次に数値に変換されて、その数値と比較されます。
りー4. 文字列と数値の比較
文字列と数値を比較する場合、文字列は数値に変換されてから 2 つが比較されます。
りー5. 文字列とブール値の比較
文字列とブール値を比較する場合、両方を数値に変換して比較します。
りー6. ブール値と数値の比較
ブール値を数値と比較する場合、ブール値は数値に変換され、2 つが比較されます。
[1,2,3] == '1,2,3' // true [1,2,3]转化为'1,2,3',然后和'1,2,3', so结果为true;
2 つの型を比較する場合、それらが同じ型でない場合は、図に示すように、対応する 型変換 を実行します。たとえば、オブジェクトがブール型で比較される場合、オブジェクト => 文字列 => 数値ブール = >番号。
さらに、「特別な注意」が必要なものをいくつか見てみましょう。
興味深い質問を見てみましょう
rreee
これら 2 つの結果は両方とも true です。最初の結果は、object=> string=> value 0 が数値 0 に変換されます。2 番目の結果は、先頭に ! が付いています。つまり、ブール値に直接変換してからそれを否定します。ブール値に変換すると、空の文字列 ('')、NaN、0、null、および未定義はすべて true を返します。 => true 否定は false なので、[] == false になります。
[1] == 1; // true `对象先转换为字符串再转换为数字,二者再比较 [1] => '1' => 1 所以结果为true
、信じられますか、そのとき赤ちゃんは怖がりました。 (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]] = sb
7. JS データ型: 数値、ブール値、文字列、未定義、Null、シンボル (es6 で新たに定義)、およびオブジェクト (注: 配列は特別なオブジェクトです)
typeof によって返される 7 つの型: 数値、ブール文字列、オブジェクト、未定義のオブジェクト関数 MDN では、JavaScript を次のように紹介しています。JavaScript は、型付けが弱い、または動的言語です。つまり、変数の型を事前に宣言する必要はなく、プログラムの実行中に型が自動的に決定されます。これは、同じ変数を使用して異なるタイプのデータを保持できることも意味します8. 一般的な暗黙的な変換を見てみましょう:
基本型: 演算子(+,-,*,/,%)操作時の変換種類 ^ ^ ^ 「+」演算子: ^ ^ ^ ^ 概要: プラス記号演算子を使用する場合、String およびその他の型は String に変換され、それ以外の場合は Number 型に変換されます。 注: 未定義は「NaN」として Number に変換され、NaN に加算される数値は変換されます。 be は NaN です。 他の演算子を使用すると、基本型は文字を含む String 型に変換されます ('1a'、'a1' など)。これは、未定義と同じ NaN に変換されます。 ヒント: (1) NaN は、それ自体を含め、どの値とも等しくないため、値が NaN であるかどうかを判断するには、「! ==」を使用します。 ^ ^ ^ ^ (2) ブール型 false への変換には、null、0、''、未定義、NaN、false が含まれます ^ ˜(3)number() 与 parseInt() 都可以将对象转化为Number类型,Number函数要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。
Object类型
当object与基本类型运算时:
var obj = { toString: function(){ return 6; }, valueOf: function(){ return 5; } }; var obj1 = { valueOf: function(){ return 'a'; }, toString: function(){ return 'b'; } };
总结: Number类型会先调用valueOf(), String类型会先调用toString(), 如果结果是原始值,则返回原始值,否则继续用toString 或 valueOf(),继续计算,如果结果还不是原始值,则抛出一个类型错误;
为什么 {} + [] = 0 ? 因为 javascript在运行时, 将 第一次{} 认为是空的代码块,所以就相当于 +[] = 0. 还有 {} +5 = 5, 同理。
总结:
1. 类型错误有可能会被类型转换所隐藏。
2. “+”既可以表示字符串连接,又可以表示算术加,这取决于它的操作数,如果有一个为字符串的,那么,就是字符串连接了。
3. 对象通过valueOf方法,把自己转换成数字,通过toString方法,把自己转换成字符串。
4.具有valueOf方法的对象,应该定义一个相应的toString方法,用来返回相等的数字的字符串形式。
5.检测一些未定义的变量时,应该使用typeOf或者与undefined作比较,而不应该直接用真值运算。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
以上がJS における暗黙的な変換の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。