JavaScript基本タイプと引用タイプを簡単に分析する

6239 ワード

JavaScriptタイプについては、簡単に要約することができます.強いタイプの言語に対して、弱い(緩い)タイプの言語です.基本的なタイプと参照タイプがありますが、彼らは固定空間がスタックメモリに存在しています.固定空間がないため、スタックメモリに保存されています.スタックメモリには実現位置を指すポインタが保存されています.
市場では多くの本が小さな紙面で書かれています.この文章はいくつかの方面を話しますが、これらの方面はJavaScriptに対して簡単な理解が必要かもしれません.特にJavaScriptのタイプです.もしまだ解けないなら、ついでにJavaScriptに関する本を取ってひっくり返してから本文を見に来てもいいです.
一、基本タイプと引用タイプ
1.基本タイプ:Udefined/Null/Boolean/Number/String 2.引用タイプ:Object/Aray/Funct/Date/RegExp/Error/Map/Set…
なぜ引用の種類が列挙されていないのですか?この中であなたがこんなに多く知っていれば十分です.少なくとも私が話したこの中でこれらは十分です.他にはあまり使われないかもしれません.MapやSetのようなブラウザはすべてサポートされていません.
二、JavaScriptタイプの判断
JavaScriptには二つのoperatorがあります.タイプを判断するために使えます.彼らはtypeofとinstance ofですが、サークルが小さいので、あまり良くないです.少数の場合も正しいです.多くの場合は頼りないです.見れば分かります.
 
  
// :
typeof 'sofish' // string
new String('sofish') instanceof String // true

// :
typeof [] // object
typeof null // object
'sofish' instanceof String // false

えっと、初心者が多いかもしれません.JavaScriptプログラマーがそれで暴言します.まだ大部分の人はJSを使う時すでにjQueryなどの倉庫があって、彼らはすべてカプセル化をして、あなたに便利にタイプを検査することができます.もちろん、実際には検出するのも面倒ではありません.「JavaScriptの中では、すべてが対象です」という文があるからです.もちろん、多くの文書のようにundefinedは実はNaNとInfinityはグローバル属性だけです.大体知っていればいいです.しかし、「対象」は私たちを助けることができます.
 
  
/*
 * @param: obj {JavaScript Object}
 * @param: type {String} JS
 * @return: {Boolean}
 */
function is(obj, type)  {
  return Object.prototype.toString.call(obj).slice(8, -1) === type;
}
このようにすれば、私たちはisという関数を使ってタイプの判断をしてくれます.そして、この簡単な関数はとてもいい互換性があります.あなたのプロジェクトの中で利用できます.状況は次のようです
 
  
is('sofish', 'String') // true
is(null, 'Null') // true
is(new Set(), 'Set') // true
三、JavaScriptタイプの転換
JavaScriptでは、変数(属性)の種類は変更できます.一番よく見られるのはStringとNumberの切り替えです.どのように1+'2'を12に変えますか?この中には+号のオプラクターを理解する必要があります.数学演算子であり、JavaScriptの文字列のハイフンでもあります.だから初心者はよく面白い現象を見ます.プラスの番号を使う時は必要ではなくて、マイナスの番号を使うと必ず「正しい」という答えが出ます.
 
  
1 + '2' // '12'
1 + (+'2') // 3
1 - '2' // -1
この中は+の二重キャラが原因です.上のコードでは、第二の表現はStringの前に+号を用いて、強制的にそのクラスをNumberに変換することができます.JavaScriptのタイプの変換については、ほとんどの場合、理解+二重の役割があれば大丈夫です.他の理解できるクラスは、同様のものはすべて、Errを含む、賦値/重み付けによって修正され得る.
 
  
var err = new Error();
console.log(err instanceof Error); // true

err = 'sofish';
console.log(err); // 'sofish'

四、JavaScript引用タイプという点は本稿の難点である.基本タイプに対しては、参照は属性と方法を追加することができます.同様の値を参照すると、参照タイプの値を変数に割り当てます.彼らは同じメモリに記憶されている値を指します.変数(属性)は再ロードできますが、コピーすると面白いことになります.後で詳しく説明します.
1.属性と方法を追加する
以下のコードは私達が見ます.基本的に似たような賦課に対しては、エラーを報告しませんが、取得時には無効になります.
 
  
var arr = [1,2,3];
arr.hello = 'world';
console.log(arr.hello); // 'world'

var str = 'sofish';
str.hello = 'world';
console.log(str.hello); // undefined

2.参照タイプの値の操作
参照タイプがスタックメモリに格納されているのは参照であるため、同じ元の値を指している場合、値の操作はすべての参照に影響を及ぼします.ここには、値の再割り当て(直接操作ではない)がオブジェクトを再作成し、元の値を変更しない例があります.たとえば:
 
  
var arr = [1,2,3], sofish = arr;
sofish.push('hello world');
console.log(arr); // [1, 2, 3, 'hello world']

//
sofish = ['not a fish']; // sofish ,
console.log(arr);// [1, 2, 3, 'hello world']

3.参照タイプ値のコピー
元の値の操作はすべての参照に影響します.これは必ずしも私達が欲しいものではなく、新しいオブジェクトをコピーする必要があります.操作する時は他の参照に影響しません.一般的には、Date/Function/RegExp...のように具体的な操作はほとんどなく、主にArayやObjectのように追加項目、属性などがあります.だから、私たちは主にArayとObjectオブジェクトをどうやって複製するかを理解する必要があります.
3.1配列のコピー
Arayオブジェクトには、slice方式で切り取り行列を返し、ES 5でfilterなども新たな配列を返します.この方法を利用してコピーすることができます.
 
  
var arr = [1, 2, 3];
var sofish = arr.slice();

//
sofish.push('hello world');
console.log(arr); // [1, 2, 3]

3.2オブジェクトのコピー
Arayの複製では、私たちはslice方法を使用していますが、実際にはArayとObjectの両方に対してfor…inサイクルを利用してエルゴードし、値を割り当てて複製することができます.
 
  
var obj = { name: 'sofish' }, sofish = {}, p;
for (p in obj) sofish[p] = obj[p];

//
sofish.say = function() {};
console.log(obj); // { name: 'sofish' }

3.3 Shadow/Deep Copy
上のような操作は、私たちがよく言っている浅いコピーです.しかし、ArayやObjectには多層があり、このようなコピーは一番上の層の値だけを考慮して、存在可能な値の中のArayやObjectは元のオブジェクトを指しています.たとえば:
 
  
var arr = [1, { bio: 'not a fish' } ], sofish = [], p;
for(p in arr) {
  sofish[p] = arr[p];
}

// `sofish` `cat`
sofish[1].bio = 'hackable';
console.log(arr);//  [1, cat: { bio: 'hackable' } ]

どうすればいいですか?copy()関数を使ってこの問題を解決します.
 
  
/*
 * @param: obj {JavaScript Object}
 * @param: isDeep {Boolean}
 * @return: {JavaScript Object}
 */
function copy(obj, isDeep) {
  var ret = obj.slice ? [] : {}, p, prop;
  // is
  if(!isDeep && is(obj, 'Array')) return obj.slice();
  for(p in obj) {
    if(!obj.hasOwnProperty(p)) continue;
    prop = obj[p];
    ret[p] = (is(prop, 'Object') || is(prop, 'Array')) ?
      copy(prop, isDeep) : prop;
  }
  return ret;
}
このように、私たちは、一つのArayまたはObjectをcopy(obj、isDeep)関数によってコピーすることができます.テストしてもいいです.
 
  
var arr = [1, {bio: 'not a fish'}];
var sofish = copy(arr);

// ,
sofish.push('cat');
console.log(arr); //  [1, {bio: 'not a fish'}]
sofish[1].bio = 'hello world';
console.log(arr) //  [1, {bio: 'hello world'}]

//
sofish = copy(arr, 1);
sofish[1].bio = 'foo or bar';
console.log(arr); // [1, {bio: 'hello world'}]

これで.あなたが基本的に知るべきのタイプについての難しい点は、ほぼ全部分かりました.もちろん、コピーは最も面倒な点です.常に操作が必要なArayやObjectの他に、Date/Funct/RegExpのコピーもあります.