JavaScriptの型強制は何ですか?
28878 ワード
JavaScriptが他のプログラミング言語のように偽に見えると言うのは正しくありません.C +のような言語とは異なります/Java/C経線、JavaScriptはそれらの言語のようなものです.それは別の概念、別の考え方、別のパラダイムです.JavaScriptを学んだり、JavaScriptを使用している多くのプログラマがその要素のいくつかを見つける間、彼らはより高度な機能に奇妙なまたは奇妙な学習や奇妙に掘る.あなたは本当にそれを理解するとき、JavaScriptがどのように動作し、どのようにそれがJavaScriptは、一見強力で美しいプログラミング言語であることを発見する方法を動作するかを見つけることになるでしょう.これはまた、最も人気のあるプログラミング言語の一つである理由です.
JavaScriptコードを正しく書くことができるように、JavaScriptがフードの下でどのように機能しているかを理解する必要があります深い高度なJavaScriptコード.我々は、ちょうど基礎を越えています.だから、このポストの間に瞬間に見えるかもしれませんが、「ああ、あなたは本当にそれを知っている必要はありません!」あなたは、我々は、基本的な基礎知識は、あなたのためのパスを明るくする予定ですので、非常に迅速に、彼らは本当にどのように実際に表示されます.
JavaScriptの学習にDEVSを与えるのは奇妙な部分を理解している.私たちが今日話しているような概念の一つはJavaScriptの型強制です.JavaScript言語を使用した開発中には、以下のようなことに遭遇しているはずです.
強制型:
Type強制は、あるデータ型から別のデータ型への値の自動または暗黙の変換です.
簡単に言えば、我々は開発者として明示的に実行しない
型強制の原因は何ですか?
まず、私は間違っていない場合は、任意の(コンパイルされた)言語で別の型の2つのオペランドに対して数学的操作を行うことはできません.コンパイルされた言語では、コンパイラ自身がコンパイル中にエラーをスローします.
上の例を考える.
JavaScriptは弱いタイプの言語であるため、値は異なる型の間で自動的に、またはむしろ暗黙のうちに変換されます.演算子を異なる型の値に適用すると、通常発生します.JavaScriptタイプは、2つのカテゴリーに広く分類されることができます Primitive Types :
( number , string , boolean , null , undefined , symbol ) 複合/構造型:
(オブジェクト、配列、マップ、セット、日付など).基本的にほとんどすべて
変換の種類
任意の型にかかわらず、基本的な構造体であれば型強制を実行すると、オペランド型をこれらの型のいずれかに変換します. 結ぶ 数える boolean プリミティブとオブジェクトの変換ロジックは異なりますが、両方のプリミティブとオブジェクトはこれらの3つの方法でのみ変換できます.
Primitive to String coercion:
2つのオペランドを
整数型強制数:
原始的な値が強制される複数のシナリオがあります 比較演算子 単項演算子 算術演算子
ビット演算子( 緩やかな等値演算子
比較演算子
単項演算子
3算数演算子
ビット演算子
ゆるい等級演算子
boolean型の強制的強制
プリミティブは使用時にbooleanに強制される
特別なケース ナンは何にも匹敵しない
側注:
今までナンはなぜそれ自体を含む何かに匹敵しないのだろうか?
さて、NaNの2種類があります.
V 8エンジン内部関数JequalTyperを見てみましょう.2番目のif文は、==のどちらかの側がNaNの場合、まっすぐにfalseを返します.
適用時
ヒント:
オペランドを特定の型に変換するという決定はJavaScriptエンジンで完全に行われるので、型強制は時々混乱することがあります.現実世界のアプリケーションでは、これは怖いことができます.暗黙型型強制をトリガーしない演算子は
JavaScriptコードを正しく書くことができるように、JavaScriptがフードの下でどのように機能しているかを理解する必要があります深い高度なJavaScriptコード.我々は、ちょうど基礎を越えています.だから、このポストの間に瞬間に見えるかもしれませんが、「ああ、あなたは本当にそれを知っている必要はありません!」あなたは、我々は、基本的な基礎知識は、あなたのためのパスを明るくする予定ですので、非常に迅速に、彼らは本当にどのように実際に表示されます.
JavaScriptの学習にDEVSを与えるのは奇妙な部分を理解している.私たちが今日話しているような概念の一つはJavaScriptの型強制です.JavaScript言語を使用した開発中には、以下のようなことに遭遇しているはずです.
console.log(5 + '5'); // '55'
console.log(5 - '5'); // 0
console.log('2' * 2); // 4
console.log('2' / 2); // 1
console.log('2' - 2); // 0
console.log('2' + 2); // '22' 😳huh??..
console.log('' + 2); // '2'
強制型:
Type強制は、あるデータ型から別のデータ型への値の自動または暗黙の変換です.
Type conversion
のいずれかのデータ型から別のキー差で値を変換するので、型強制型に似ています.型強制は暗黙のうちに明示的であるか明示的であるかもしれません.簡単に言えば、我々は開発者として明示的に実行しない
type coercion
. これは、JavaScriptエンジン内部で行われます.型強制の原因は何ですか?
まず、私は間違っていない場合は、任意の(コンパイルされた)言語で別の型の2つのオペランドに対して数学的操作を行うことはできません.コンパイルされた言語では、コンパイラ自身がコンパイル中にエラーをスローします.
// In any compiled language like C#, this is not possible
var operand1 = 2; // int
var operand2 = '5'; // char
var result = operand1 + operand2; // compilation error
でも、これはJavaScriptです.それはダイナミックで、すべてがここで可能です😛. JavaScriptでは、同じ型の2つの変数に対していくつかの数学演算を実行するとき、結果は他のどの言語にも似ています.しかし、オペランドが異なったタイプのとき、JavaScriptは内部的に同じタイプのオペランドを作ることによってさえ物事をしようとします.これはオペランドのどちらかを第2オペランドの型にマッチさせることによって行われる.上の例を考える.
// number 5 is coerced to string '5'
console.log(5 + '5'); //'55'
// string 5 is coerced to number 5
console.log(5 - '5'); //0
上の例では、JavaScriptはnumber
to string
両方のオペランド文字列型を作成し、結果として'5' + '5' => '55'
. 同様に、2番目の例では、JavaScriptはオペランドのいずれかを強制し、もう一方の型にマッチします.でも今回は'5'
が強制される5
評価5 - 5 => 0
.JavaScriptは弱いタイプの言語であるため、値は異なる型の間で自動的に、またはむしろ暗黙のうちに変換されます.演算子を異なる型の値に適用すると、通常発生します.JavaScriptタイプは、2つのカテゴリーに広く分類されることができます
( number , string , boolean , null , undefined , symbol )
(オブジェクト、配列、マップ、セット、日付など).基本的にほとんどすべて
new
キーワード変換の種類
任意の型にかかわらず、基本的な構造体であれば型強制を実行すると、オペランド型をこれらの型のいずれかに変換します.
Primitive to String coercion:
2つのオペランドを
binary(+)
演算子の場合、JavaScriptエンジンはnumber
種類console.log(3 + 2); // 5
console.log(20 + 10); // 30
しかし、オペランドのどちらかがAであるときstring
「JavaScript」と入力し、その両方を文字列に変換します.したがって、結果は2文字列の連結です.オペランドの順序は重要ではない.// number,string
console.log(5 + 'hi'); // '5hi'
console.log('5' + 5); // '55'
// boolean, string
console.log('hi' + false); // 'hifalse'
console.log('12' + true); // '12true';
// number, boolean, string
console.log(1 + 'two' + false); // '1twofalse'
console.log(2 + true + '3'); // '2true3'
console.log('Three' + 4 + false); // 'Three4false'
// null, string
console.log(null + '123'); // 'null123'
// undefined, string
console.log('123' + undefined); // '123undefined'
オペランドが数値でない場合、あるいはその両方が文字列でなくても、binary(+)
演算子console.log(null + undefined); //NaN
我々が加える試みnull
and undefined
, JavaScriptエンジンは値を整数に変換し、NaNを返します.整数型強制数:
原始的な値が強制される複数のシナリオがあります
number
種類どんな原始もnumber
次の演算子が含まれている型'>','<','>=','<='
) '+','-'
) '+','-','*','/','%'
)つのオペランドが文字列であるときに'|','&','^','~'
) '=='
)両方の引数が既に同じプリミティブである場合を除きます比較演算子
7 <= '3' // false
'5' > 4 // true
// true becomes 1
true > '1'
1 > 1 // false
// false becomes 0
false < 1 // true
// string 'true' becomes NaN
'true' > 1
NaN > 1 // false
// null becomes 0
null < 5 // true
// undefined becomes NaN
undefined > 10
NaN > 10 // false
単項演算子
+2
// 2
+"123"
// 123
+true
// 1
+null
// 0
+undefined
// NaN
3算数演算子
'33' - 10
33 - 10
=> 23
'9' / 3
9 / 3
=> 3
// false becomes 0
5 / false
5 / 0
=> Infinity
5 % '3'
5 % 3
=> 2
// true becomes 1
'true' * 10
1 * 10
=> 10
// undefined becomes NaN
1 - undefined
1 - NaN
=> NaN
ビット演算子
true & 0 => 0
true & 1 => 1
true | 0 => 1
true | 1 => 1
true ^ 0 => 1
true ^ 1 => 0
ゆるい等級演算子
/*In JS, == operator is very common to compare values. It compares the values based on their values ignoring their types*/
54 == '54'
54 == 54
//true
true == '1'
1 == 1
//true
false == '0'
0 == 0
//true
/* complex cases*/
//null can only be coerced to null and undefined
null == 0
=> false
// 'true' becomes NaN
true == 'true'
=> false
boolean型の強制的強制
プリミティブは使用時にbooleanに強制される
logical
演算子'&&', '||', '!'
. ここで覚えておくべき最も重要な点は、論理演算子が内部的にブール値変換を行うにもかかわらず、実際にはbooleanでない場合でも、元のオペランドの値を返すことです.最後の評価オペランドは各式から返されます.!(NOT)
!0 => ! (false) // true
!1 => ! (true) // false
&&(AND)
true && '20'
true && true
=> '20'
0 && false
false && false
=> 0
45 && 'hi'
true && true
=> 'hi'
||(OR)
null || 'hello'
false || true
=> 'hello'
null || undefined
false || false
=> undefined
ここでのもう一つの興味深いことは、プリミティブ型強制型Booleanが周囲のコンテクストによって引き起こされることもあります.そこでは、型/値はif(value)
文.Truthy & Falsy値はBoolean型強制の最良の例です.あなたが彼らが何であるかについて、わからないならば、あなたは彼らについてここで速い読むことができます// undefined evaluates to false
if(undefined){
console.log('truthy');
}
else{
console.log('falsy'); // falsy
}
特別なケース
console.log(NaN == NaN); // false
側注:
今までナンはなぜそれ自体を含む何かに匹敵しないのだろうか?
さて、NaNの2種類があります.
Quiet NaN
とはSignalling NaN
(例外をスローします).しかし、どちらもNaN値であり、それらのビットは内部表現において異なるので、SANE NaNとシグナルナンとを比較することができます.したがって、JavaScriptは、それ自体を含む何かとNaNを比較することを拒否します.V 8エンジン内部関数JequalTyperを見てみましょう.2番目のif文は、==のどちらかの側がNaNの場合、まっすぐにfalseを返します.
Type Typer::Visitor::JSEqualTyper(Type lhs, Type rhs, Typer* t) {
if (lhs.IsNone() || rhs.IsNone()) return Type::None();
if (lhs.Is(Type::NaN()) || rhs.Is(Type::NaN())) return t->singleton_false_;
if (lhs.Is(Type::NullOrUndefined()) && rhs.Is(Type::NullOrUndefined())) {
return t->singleton_true_;
}
if (lhs.Is(Type::Number()) && rhs.Is(Type::Number()) &&
(lhs.Max() < rhs.Min() || lhs.Min() > rhs.Max())) {
return t->singleton_false_;
}
if (lhs.IsSingleton() && rhs.Is(lhs)) {
// Types are equal and are inhabited only by a single semantic value,
// which is not NaN due to the earlier check.
DCHECK(lhs.Is(rhs));
return t->singleton_true_;
}
return Type::Boolean();
}
==
to null
or undefined
, 数値変換は起こりません.null
に等しいnull
or undefined
, そして、他の何にも匹敵しません.null == 0 // false, null is not converted to 0
null == null // true
undefined == undefined // true
null == undefined // true
これはNULLと未定義の両方がJavaScriptのBooleanでfalseとして評価されるためです.したがって、値を暗黙のうちにboolean値に変換します.Boolean(null) // false
Boolean(undefined) // false
ヒント:
オペランドを特定の型に変換するという決定はJavaScriptエンジンで完全に行われるので、型強制は時々混乱することがあります.現実世界のアプリケーションでは、これは怖いことができます.暗黙型型強制をトリガーしない演算子は
===
, これは' strict quality operator 'と呼ばれます.したがって、常に'==演算子を使用します.この記事が役に立ちましたように.あなたが人々に質問があるならば知らせてください.ハッピーラーニング😊😊...Reference
この問題について(JavaScriptの型強制は何ですか?), 我々は、より多くの情報をここで見つけました https://dev.to/ahmedtahir/what-is-type-coercion-in-javascript-4l96テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol