JavaScriptを深く理解する


jsは万物が対象かどうか:
国内の各大網駅のブログでよく見られますが、JSの万物の対象というのは本当ですか?
じゃ、まず私達がJSの中のデータのタイプをしごきにきます.JSの中のデータのタイプは次の種類があります.
Unidefined Null ボロアNumber String Symbol(ES 6に追加)Object だから本質的には本当にObjectですか?NO.
1.データタイプ
JSでは前の6種類を基本データタイプと呼びます.最後は複雑なデータタイプ、つまり対象タイプです.ここから見ると、対象と他のものが区別されているようです.
2.対象の種類と他のタイプの違い
オブジェクトは属性と方法を動的に追加できますが、基本タイプはだめです.以下のとおりです
//      Number
var num1 = 1000;
num1.length = 10;
console.log(num1.length); //undefinded 

//      Array
var arr1 = [];
arr1.length = 10;
console.log(arr1.length); //10
3.値の種類と参照の種類
さらに、JSのデータタイプは、値タイプ(基本タイプ)と参照タイプ(対象タイプ)との区別があり(他の多くの言語でもこのような違いがあります)、いわゆる値タイプと参照タイプは、インスタンスオブジェクトに値が保存されているだけでなく、対象の参照が保存されています.
  • 値タイプ:1つの値タイプのインスタンスを初期化すると、実際にはこの値にメモリ空間を割り当てて保存します.値付け操作を行うと、新しいインスタンスは新しいメモリ空間を開いて、元の値copyを返します. この新しいメモリ空間に入りました.
  • 参照タイプ:参照タイプの一例を初期化すると、この例の値があるメモリ空間の参照だけがこの例に割り当てられ、copy 新しいインスタンスオブジェクトを与えたが、実際にはcopyです. このメモリ空間に対する参照を行い、二つのインスタンスオブジェクトは本質的にメモリ空間を共有する.
  • 当面の結論
    実は上から見れば、JSの中では万物の対象ではないことが明らかですが、なぜこんなに多くの人がこの観点が正しいと信じていますか?(最初は無知だった私を含めて)
    なぜですか
    1.typeof null
    console.log(typeof null); // object
    多くの人が(多くないかもしれないが、私は当てずっぽう)言っています.nullまでです. 全部対象のタイプです.他は対象ではないですか?私も前は戸惑っていました.本を読む時までnullを見ます. 空のオブジェクトの参照にすぎません.このタイプはobjectです. そんなにおかしくないです.
    これはJSのbugという人もいます. ,異なるオブジェクトは下の層ではバイナリとして表示されます.  JavaScript 中二進数の前三桁は全部0と判断されます.  object タイプ,null のバイナリ表示は全0で、自然上位3桁も0ですので、実行します.  typeof "object"に戻ります. .本当であろうと、うそであろうと.これはbugです. 必要はないです.下の階はどうやって実現されるかは分かりませんが、nullだけです. 下の階は全部0です.objectに戻ります. ,このbug あまりにも下品すぎます.JSの設計者はnullを信じたいです. 空のオブジェクト参照として表示
    2.基本的なデータタイプのインスタンスオブジェクトがあります.  __proto__以下の通りです
    var str = "oujm";
    console.log(str.__proto__);
    
    /* String {
    anchor:ƒ anchor()
    at: ƒ at()
    big: ƒ big()
    blink: ƒ blink()
    bold: ƒ bold()
    charAt: ƒ charAt()
    charCodeAt: ƒ charCodeAt()
    codePointAt: ƒ codePointAt()
    concat: ƒ concat()
    constructor: ƒ String()
    ... 
    } */
    
    // Boolean Number               
    私たちの前の勉強からstrが分かります. 基本タイプですが、基本タイプはどうして属性がありますか?しかし、ここでは、この基本タイプの例示的なオブジェクトには、属性__proto__があるだけでなく、その構造関数がString()であることが明らかになっている. ,この時、属性がある以上、構造関数があると感じる人がいます. 本質的には対象です.これは表面的には大丈夫そうです.
    もっと分かりやすいのを見に来ましょう.
    var str1 = "oujm";
    var str2 = str1.substring(2);
    上からはstrが見えます. 方法があります
    OK、宗上所得:基本タイプも対象タイプです.つまり万物は対象です.
    ほとんどの人がこの結論を出すことができるのはこれに基づいていると思います.しかし、彼らは無視しました.JSの世界には包装対象というタイプがあります.
    包装対象(String,Number,Boolean)
    えっと、str1 , String , Number ,この三つは基本タイプではないですか?実際には、ECMAScriptは、この3つの特殊な引用タイプ(すなわち、String、Number、Boolean)を提供しています.この3つの引用タイプは他の参照タイプと似ていますが、それぞれの基本タイプに応じた特殊な行動を持っています.実際には、本タイプを読むたびに、バックグラウンドは対応する基本パッケージタイプのオブジェクトを作成します.Boolean 明らかに1つの基本的なタイプの実例で、問題は  str1 文字列に方法がありますか?実際には、基本的なタイプのオブジェクトをよりよく動作させるために、バックグラウンドで一連の動作が行われています.
  • Stringを作成する例
  • は、例示的に指定された方法を呼び出す
  • .
  • はこの実例を廃棄します.
    // var str2 = str1.substring(2)     :
    
    var tempStr = new String("oujm");
    var str2 = tempStr.substring(2);
    tempStr = null;
    ここから見ると、一般的な引用タイプと包装タイプの唯一の違いは対象のライフサイクルにある.包装タイプの対象ライフサイクルは短く、コードだけが実行された瞬間に破壊されてしまうので、これはつまり運行時には基本タイプの値に属性と方法を加えることができないのです.
    var str1 = "oujm";
    var str1.bf = "ethan";
    console.log(str1.bf); // undefined
    これも私のかつての疑問に答えました.
    var str1 = "oujm";
    var str2 = new String("ethan");
    
    console.log(str1.__proto__ === str2.__proto__); // true
    console.log(str1 instanceof String); // false 
    console.log(str2 instanceof String); // true 
    同じ理由で、str1.substring(2)を呼び出します. 属性の瞬間も、__proto__を使用します. まず対象を具体化します.その瞬間の彼らの構造関数と原型のオブジェクトは同じですが、その瞬間だけです.
    転載元:https://segmentfault.com/a/1190000012037062