javascriptデータタイプの詳細


一、六種類のデータタイプ(弱タイプデータ)
1.基本データタイプ(5種類):Unidefined、Null、Boolean、Number、Stering
2.参照データタイプ(1種):Object  例えば、Function Date Aray…
jsで変数を定義する場合は、タイプを指定する必要はありません。例えば変数var num=16を定義しますが、この変数num=「this is a string」に文字列を割り当てることも合法です。ある友達はjsが簡単だと思っていますが、変数を定義する時はタイプは何も気にしなくてもいいですか?じゃ、見に来ます。
  (1)  16+16の演算結果は何ですか?これは簡単です。32です。
  (2)最初の16を二重引用符で引き起こし、文字列として理解します。16"+16の演算結果は何ですか?それとも32ですか?違います。ここでは文字列のつづり合わせとして解釈します。答えは「1616」という文字列です。
  (3)私たちは同じ文字列または数字を見続けます。私たちは+を−に変えます。16はこの時の演算結果は何ですか?答えは0です。ここでは数字の演算と解釈していますので、答えは0です。
結節:jsは変数を定義する際、変数のデータタイプを指定する必要はないが、オペレータなどの演算に関わる場合、陰には多くの暗黙的な変換ロジックがあります。
二、暗黙的な変換(+と-、==と===)
1.上記の例を借りて挙げます。

  "16" + 6  // "166" (     )
  "16" - 6  // 10 (    )
私たちはしばしば(+/−)規則を利用してタイプを変換することができる。
例えば、変数numを数字のタイプに変えたいです。非常に簡単な方法でnum-0ができます。また、私たちはnumをStringタイプに変えたいです。どうすればいいですか?つまり、空の文字列num+"を追加します。
2.==と==
(一)、等しい演算子(=)
  1、一つの値がnullで、もう一つがundefinedであれば、それらは同じです。
  2、値が数値なら、もう一つは文字列で、まず文字列を数値に変換し、変換した値を使って比較します。
  3、いずれかの値がtrueであれば、1に変換して比較します。一つの値がfalseであれば、基を0に変換して比較します。
  4、一つの値がオブジェクトで、もう一つの値が数字または文字列である場合、オブジェクトを元の値に変換して比較します。オブジェクトは、toString()方法またはvalueOf()法により元の値に変換される。JavaScriptコアの内蔵クラスはまずvalueOf()を使ってみて、toStering()を使ってみます。日付類以外はtoStering()のみを使います。これらはJavaScript言語の中核ではないオブジェクトは、それぞれの実装によって定義された方法で元の値に変換されます。
  5、他の異なるタイプの間の比較は等しくない。
たとえば:

  null == undefined, //true
 “16” == 16, //true
   0 == false, //true
   [1,2] == [1,2], //false
   new Object() == new Object(), //false
   new Object().toString() == new Object().toString(),  //true
   new String("aaa") == "aaa", //true
   new String("11") == 11, //true
(二)、厳格イコール(==)
  1、まず彼らのタイプを判断します。二つの値のタイプが違ったら、それらは同じではなく、直接falseに戻ります。  
  // “16” === 16,  //false  2、両方の値がnullかundefinedなら、それらは同じです。
  //   null === null, //true,   undefined=== undefined, //true    undefined === null  //false  3、両方の値がブール値trueまたはfalseであれば、それらは同じです。
  4、いずれかの値がNaNである場合、または二つの値がNaNである場合、それらは等しくない。NaNと他のいかなる値も同じではありません。それ自体も含まれています。xを通して!==xは、xがNaNであるかどうかを判断し、xがNaNである場合にのみ、この表式の値はtrueである。
  5、2つの値が数字であり、数値が等しい場合、それらは等しい。一つが0で、もう一つが-0なら、それらは同じです。
  6、2つの値が文字列であり、対応するビットの16桁が完全に等しい場合、それらは等しい。それらの長さや内容が異なるなら、それらは違っています。2つの文字列は完全に同じ意味であり、表示されている文字も同じであるが、異なる符号化された16ビット値を有する。JavaScriptはUnicodeを標準化した変換ではないので、このような文字列は「==」と「=」の演算子の比較結果も等しくない。
  7、2つの参照値が同じオブジェクト、配列または関数である場合、それらは同じです。異なるオブジェクトを指すなら、それらは違っています。二つのオブジェクトは完全に同じ属性を持っていますが。
三、包装対象
定義:JavaScriptでは、「すべてのオブジェクト」、配列と関数は本質的には対象であり、3つのオリジナルタイプの値――数値、文字列、ブール値――一定の条件の下では、自動的にオブジェクトに変換されます。つまり、元のタイプの「包装対象」です。
通俗的に言いますと、文字列、数値、文字列、これらの独身犬は他の人を見ても対象があります。
1.一般的には、オブジェクトだけが属性を読み書きすることができます。しかし、聡明な騒々しい年に、普段私たちが使っている多くの文字列の方法と属性は直接的に通過しているということが分かりましたか?たとえば:

  console.log("hello world".length);
  console.log("this a string".indexOf("a"));
2.実は、これらの方法と属性を呼び出した時、JS内部はすでに暗黙的に包装対象を作成してくれました。以上の実際の状況はこのようになるべきです。

  console.log(new String("hello world").length);
  console.log(new String("this a string").indexOf("a"));
3.しかし、両者には違いがあります。
違い1:
ブラウザが自分で隠して作成した包装対象とあなたが明示的に作成した包装対象は厳密には同じではありません。簡単に言えば、表面JSは実生のものと養子縁組のものと同じであるが、実際には実生のものは養子縁組のものとは等しくない。

    var a1 = "test",
     a2=new String("test");
    console.log(a1 == a2);//true
    console.log(a1 === a2);//false
違い2:
暗黙的に作成された包装対象は、使用後に破棄されます。簡単に言えば、大きな負けん気漢が、私のところに行ったら、捨てて、また他の相手を探します。
私たちの最初の問題で言ってください。test.a = "hello";ここでは暗黙的に包装対象を作成していますので、ここでの割当は間違いありません。console.log(test.a);これまでの包装対象は捨てられましたが、「.」演算子を使って新たな包装対象を作成しましたが、このオブジェクトの属性aは割り当てられていませんので、属性aの値はundefinedです。
実際の運用では、低いバージョンのIEなど、性能があまり良くないブラウザもあります。文字列を頻繁に処理すると、効率が低いです。したがって、多くの場合、直接的に明示的にパッケージオブジェクトを作成するよりも、ブラウザがあまりにも多くの隠しパッケージオブジェクトを作成し、パフォーマンスを向上させます。

    //        
    var example = "this is a example"; 
    //        ,    。
    var example2 = new String("this is a example");
四、型式検査
jsで検出するタイプの方法は、typeof、instance of、Object.prototype.tostring、construct、duck typeなどたくさんあります。
1.typeof演算子には、基本データタイプと関数の検出(nullが失効した場合)に適用される2つの方法があります。返した結果は文字列です。
typeof 100    “number」
typeof true   “ブックマン
typeof(「hello」)  "String"
typeof Function   “Function
typeof undefined  “undefined」
typeof null  “Object」  歴史的に残された問題は,互換性のために
  typeof NaN  “number」   NaNを判断する方法はisNaN(NaN)で判断できます。trueに戻るとNaNです。
typeof new Object()   “Object」
typeof[1,2]   "Object"
typeofは対象のタイプを測定する時に区別できないということに気づいたかもしれません。この時は第二の方法でinstance ofを使います。
2.instance of演算子(カスタムオブジェクトまたは元のオブジェクトのデータタイプの検出に適用)は、プロトタイプの検出に基づいています。
例えば、オブジェクトが配列であるかどうかを判断します。[1,2]instance of Arayはtrueに戻ります。
obj instance of Object   :左の操作数objは対象として期待されています。数字1、2、3またはtrueであれば、falseは直接falseに戻ります。
             右の操作数は関数オブジェクトまたは関数コンストラクタを期待しています。そうでないとTyperrorの異常を投げます。
instance of作業の大体の原理は左操作数という対象のプロトタイプチェーンに右側のこのコンストラクタのプロトタイプ属性があるかどうかを判断することです。
例を挙げます。

      function Person(){}
      function Student(){}
      Student.prototype = new Person();
      Student.protype.constructor = Student
      var a = new Person();
      var b = new Student();
      -----------------------------------------
      a instanceof Person // true
      b instanceof Student //true
      a instanceof Student //false
      b instanceof Person //true
注意:違うwindowとframeの間はinstance ofを使ってはいけません。同じオブジェクトを見ていますが、違うwindowの間とframeの間には異なるオブジェクトがあります。各iframeの下には自分のプロトタイプチェーンがあります。frame実例化の対象は互いにプロトタイプチェーンを共有しないので、falseに戻ります。
3.Object.prototype.toString関数方法
Object.prototype.toString.call()またはObject.prototype.toString.appy()
たとえば:

Object.prototype.toString.call([])   //"[object Array]"
Object.prototype.toString.call(function(){})  //"[object Function]"
Object.prototype.toString.call(undefined)  //"[object Undefined]"
Object.prototype.toString.call(null)   //"[object Null]"
注意:1.iframeをまたいで失効する問題を解決しました。
        2.IE 6,7,8の下  Object.prototype.toString.call(nullまたはundefined)      //"[object Object]“
4.constructorの方法

function A(){}; 
function B(){}; 
A.prototype = new B(); 
var aObj = new A(); 
-------------------------------- 
aObj.constructor === B; //true; 
aObj.constructor === A; //false;
注意:クラス継承時に問題が発生します。
5.duck type(アヒルタイプ)
たとえば、配列を測定する時、彼がPush()の方法があるかどうかを測定できます。
以上が本文の全部です。本文の内容は皆さんの学習や仕事に一定の助けをもたらしてくれると同時に、私達を応援してください。