ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript の暗黙的な Cast_JavaScript スキルを学ぶためにフォローしてください

JavaScript の暗黙的な Cast_JavaScript スキルを学ぶためにフォローしてください

WBOY
リリース: 2016-05-16 15:32:17
オリジナル
1103 人が閲覧しました

JavaScript のデータ型は、null、unknown、boolean、string、number、object の 6 つの型に分類されます。

オブジェクトは参照型で、他の 5 つは基本型またはプリミティブ型です。 typeof メソッドを使用して、何かがどのタイプに属しているかを出力できます。異なる型の変数を比較するには、まず型を変換する必要があります。これを型変換といいます。型変換は暗黙的な変換とも呼ばれます。暗黙的な変換は通常、加算、減算、乗算、除算、等しい、より小さい、より大きいなどの演算子を使用して発生します。 。

typeof '11' //string 
typeof(11)  //number
'11' < 4 //false
ログイン後にコピー

1. 基本的な型変換

まず足し算、引き算、掛け算、割り算について話しましょう:

1. 文字列に数値を加算すると、数値が文字列に変換されます。

2. 数値から文字列を減算し、その文字列を数値 に変換します。 文字列が純粋な数値でない場合は、NaN に変換されます。文字列から数値を除いた場合も同様です。 2 つの文字列を減算すると、最初にそれらの文字列が数値に変換されます。

3. 乗算、除算、大なり、小なり、減算の変換も同様です。

//隐式转换 + - * == / 
// + 
10 + '20' //'2010'
// -
10 - '20' //-10
10 - 'one' //NaN
10 - '100a' //NaN
// *
10*'20' //200
'10'*'20' //200
// /
20/'10' //2
'20'/'10' //2
'20'/'one'  //NaN

ログイン後にコピー

4. 加算演算の順序は重要です

JavaScript は操作の順序に敏感であるため、このような混合式は混乱を招くことがあります。たとえば、式: 1 2 "3"

;

加算演算は左結合であるため (つまり、左結合法則)、次の式と同等です: (1 2) "3"

対照的に、式 1 "2" 3; //"123" は文字列 "123" として評価されます。左結合則は、式の左側の加算演算を括弧で囲むことと同じです。

5. 別のグループを見てみましょう ==

1).未定義は null と等しい

2) 文字列と数値を比較する場合、文字列を数値に変換します

3) 数値がブール比較の場合、ブール値は数値に変換されます

4) 文字列とブール値を比較する場合、2 つを数値に変換します

// ==
undefined == null; //true
'0' == 0;    //true,字符串转数字
0 == false; //true,布尔转数字
'0' == false;    //true,两者转数字
null == false;   //false
undefined == false;  //false

ログイン後にコピー

7 つの false 値: false、0、-0、""、NaN、null、未定義、他のすべての値は真実です

6. NaN、数値ではありません

NaN は、特定の算術演算 (負の数の平方根を求めるなど) の結果が数値ではないことを示す特別な値です。 parseInt() メソッドと parseFloat() メソッドは、指定された文字列を解析できない場合にこの値を返します。通常は有効な数値を返す一部の関数では、このメソッドを使用し、Number.NaN を使用してエラー状態を示すこともできます。

Math.sqrt(-2)
Math.log(-1)
0/0
parseFloat('foo')

ログイン後にコピー

多くの JavaScript 初心者にとって、最初の落とし穴は、typeof を呼び出したときに返される結果が通常は予期しないものであることです。

console.log(typeof NaN); // 'Number'
ログイン後にコピー

この場合、NaN は数値を意味するのではなく、その型は数値です。分かりますか?
typeofは文字列を返すので、「数値」、「文字列」、「ブール値」、「オブジェクト」、「関数」、「未定義

」の6種類があります。

そこは大混乱なので落ち着いてください。 2 つの NaN を比較してみましょう:

var x = Math.sqrt(-2);
var y = Math.log(-1);
console.log(x == y); // false
ログイン後にコピー

おそらくこれは、厳密な等価性 (===) 演算を使用していないためでしょうか?どうやらそうではないらしい。

var x = Math.sqrt(-2);
var y = Math.log(-1);
console.log(x === y); // false
ログイン後にコピー

2 つの NaN を直接比較してみるとどうでしょうか?

console.log(NaN === NaN); // false
ログイン後にコピー

非数値を表す方法はたくさんあるため、非数値が NaN である別の非数値と等しくないことは理にかなっています。

しかし、もちろん、解決策は現在利用可能です。グローバル関数 isNaN について理解しましょう:

console.log(isNaN(NaN)); // true

ログイン後にコピー

残念ながら、isNaN() にはそれ自体にも多くの欠陥があります。

console.log(isNaN('hello')); // true
console.log(isNaN(['x'])); // true
console.log(isNaN({})); // true
ログイン後にコピー

これはさまざまな解決策につながります。 NaN の非反射性の性質を利用します (例: Kit Cambridge のメモを参照)

var My = {
 isNaN: function (x) { return x !== x; }
}
ログイン後にコピー

幸いなことに、次期 ECMAScript 6 には、信頼性の高い NaN 値検出を提供する Number.isNaN() メソッドが含まれています。
つまり、引数が true NaN

の場合にのみ true が返されます。
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(Math.sqrt(-2))); // true
console.log(Number.isNaN('hello')); // false
console.log(Number.isNaN(['x'])); // false
console.log(Number.isNaN({})); // false

ログイン後にコピー

二、引用类型的转换

基本类型间的比较相对简单。引用类型和基本类型的比较就相对复杂一些,先要把引用类型转成基本类型,再按上述的方法比较。

1.引用类型转布尔全是true。

比如空数组,只要是对象就是引用类型,所以[]为true。引用类型转数字或者字符串就要用valueOf()或者toString();对象本身就继承了valuOf()和toString(),还可以自定义valueOf()和toString()。根据不同的对象用继承的valueOf()转成字符串,数字或本身,而对象用toString就一定转为字符串。一般对象默认调用valueOf()。

1).对象转数字时,调用valueOf();

2).对象转字符串时,调用toString();

先看看下面的例子:

0 == []; // true, 0 == [].valueOf(); ---> 0 == 0;
'0' == []; // false, '0' == [].toString(); ---> '0' == '';
2 == ['2']; // true, 2 == ['2'].valueOf(); ---> 2 == '2' ---> 2 == 2;
'2' == [2]; // true, '2' == [2].toString(); ---> '2' =='2';

[] == ![]; //true, [].valueOf() == !Boolean([]) -> 0 == false ---> 0 == 0;
ログイン後にコピー

对象转成数字时,调用valueOf(),在这之前先调用的是toString();所以我猜valueOf方法是这样的。So上面的例子 0 == []要改成下面更合理。无论如何,[]最后是转成0的。

var valueOf = function (){
 var str = this.toString(); //先调用toString(),转成字符串
 //...
}
0 == []; // true, 0 == [].valueOf(); -> 0 == '0' -> 0 == 0;
ログイン後にコピー

自定义的valueOf()和toString();

  • 自定义的valueOf()和toString()都存在,会默认调用valueOf();
  • 如果只有toString(),则调用toString();

var a = [1];

a.valueOf = function (){ return 1;}
a.toString = function (){ return '1';}

a + 1; // 2, valueOf()先调用
ログイン後にコピー

去掉valueOf()就会调用toString()。

var a = [1];

a.valueOf = function (){ return 1;}
a.toString = function (){ return '1';}

a + 1; // 2, 先调用valueOf()
//去掉valueOf
delete a.valueOf;
a + 1; // '11', 调用toString()

ログイン後にコピー

如果返回其它会怎么样呢?

var a = [1];

a.valueOf = function (){return ;}
a.toString = function (){return 1 ;};

1 - a; //NaN

ログイン後にコピー

其它对象 调用valueOf()转成不同的类型:

var a = {};
a.valueOf(); //Object {}
var a = [];
a.valueOf(); //[] 自己本身
var a = new Date();
a.valueOf(); //1423812036234 数字
var a = new RegExp();
a.valueOf(); // /(&#63;:)/ 正则对象

ログイン後にコピー

引用类型之间的比较是内存地址的比较,不需要进行隐式转换,这里不多说。

[] == [] //false 地址不一样

var a = [];
b = a;
b == a //true

2.显式转换

显式转换比较简单,可以直接用类当作方法直接转换。

Number([]); //0
String([]); //”
Boolean([]); //true

还有更简单的转换方法。

3 + ” // 字符串'3'
+'3' // 数字3
!!'3' // true

以上就是本文的全部内容,详细介绍了javascript的隐式强制转换,希望对大家的学习有所帮助。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート