js
jsには7つのタイプがあります。
- Undefined
- Null
- Boolean
- String
- Number
- Symbol
- Object
最初の6つは基本的なデータ型で、Objectは参照型です。
基本型と参照型の違い
基本型はスタック・メモリーに格納され、参照型はヒープ・メモリーに存在します。
基本的な型の割り当て
var num1 = 5
var num2 = num1
num1とnum2は互いに独立しており、2つの値がどのような操作においても互いに影響し合うことはありません。
参照型による代入
参照型の値をある変数から別の変数にコピーする場合、その変数のオブジェクトに格納されている値のコピーも、新しい変数に割り当てられたスペースに置かれます。違いは、値のコピーが実際にはヒープに格納されたオブジェクトへのポインタであることです。コピー操作の終わりには、両方の変数が実際には同じオブジェクトを参照していることになります。したがって、一方の変数を変更すると、もう一方の変数にも影響します。
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"
obj1とojb2は同じオブジェクトを指しています。
null としてカプセル化することもできます。
undefined
var を使って宣言された変数が初期化されていない場合、変数の値は未定義です。
判定
var message;
console.log(message == undefined); //true
普通はそうするのですが、メッセージが定義されていないと問題があります。
console.log(message == undefined); //エラー生成
この時点で、別の方法で、何で判断する時が来たのでしょうか?
console.log(typeof message == undefined); //エラー生成
typeofを使って変数が未初期化か未定義かを判断すると、undefinedを返しますが、変数が定義されているかどうかがわからないという問題があります。typeof演算子がundefinedを返したときに変数が宣言されていないことがわかるように、定義された変数は初期化されなければならないという独自のルールを定義する必要があります。
では、undefinedは変数なのでしょうか?答えはイエス。
mdn の説明:undefined はグローバル・オブジェクトのプロパティです。undefinedの初期値はプリミティブなデータ型undefinedです。
console.log(window.undefined) // undefined
console.log(typeof window.undefined) // undefined
見たところ、undefined は変数なので、undefined の値を変更することができます。
var undefined = 'a'
console.log(undefined) // undefined
console.log(typeof undefined) // undefined
なぜかというと、mdnが 「最近のブラウザでは、ECMAscript5標準以降、undefinedは設定できず、オーバーライドもできないプロパティです。そうでない場合でも、書き換えは避けてください。"
このプロパティは書き換え不可に設定されていますが、モダンブラウザではモダンブラウザでundefinedを使用しても安全ですか?いいえ、undefined はローカルスコープで変更可能です。
(function() {
var undefined = 'foo';
console.log(undefined, typeof undefined) //foo string
let data
<!--今回の判定で問題になるのは>
if(data==undefined){
}
})()
では、どうすればこの問題を解決できるのでしょうか?未定義かどうかを判断するには何を使えばいいのでしょうか?答えは、void 0
これは、voidを使って次の式を評価し、その結果がどうであれ、元の値undefinedを返すというものです。
console.log(void 0)
console.log(typeof data== void 0)
冬さんの言っていたことがやっとわかりました。
null
nullはシンプルですが、1つ注意しなければならないのは、彼の型はオブジェクトであり、nullは一般的に空のオブジェクトを指します。
null undefinedとの違い
console.log(null == undefined); //true としてカプセル化することもできる。
console.log(null === undefined); //false 異なる型
型を決定する方法
タイプオブ
未計算のオペランドの型を示す文字列を返します。
typeof Object型を除くすべての型が認識されます。
例えばlet a let b = 2 let c = '2' let d = null let e = true let f = Symbol() let g = {name:'xxx'} let h = function(){} console.log(typeof a) //undefined console.log(typeof b) //number console.log(typeof c) //string console.log(typeof d) //object console.log(typeof e) //boolean console.log(typeof f) //symbol console.log(typeof g) //object console.log(typeof h) //functionインスタンスオブ
コンストラクタのprototype属性がインスタンス・オブジェクトのprototypeチェーンに現れるかどうかを検出するために使用します。
console.log([1, 2] instanceof Array) true function Foo(name) { this.name = name } var foo = new Foo('bar') console.log(foo instanceof Foo) // trueObject.prototype.toString.call()
toString メソッドはオブジェクトの文字列形式を返すもので、デフォルトでは string 型を返します。
var a = new Object()
a.toString() // "[object Object]"
//他のオブジェクトは、カスタムのtoStringメソッドを個別に展開しているが
[1,2].toString() // "1,2,3"
そこで、オブジェクトのtoStringを使ってデータ型を決定します。
Object.prototype.toString.call(2) //[object Number]
Object.prototype.toString.call(true) //[object String]
メソッドとしてカプセル化することもできます。
var type = function (o){
var s = Object.prototype.toString.call(o);
return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};
type(a) //[object Number] //number





