blog

js型について

としてカプセル化することもできます。違いは、値のコピーが実際にはヒープに格納されたオブジェクトへのポインタであるということです。コピー操作の後、両方の変数は実際には同じオブジェクトを参照することになり...

Oct 26, 2020 · 5 min. read
シェア

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) // true
  • Object.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
Read next

webpackベースのReactパッケージングツールを書く (2)

webpackの設定は、webpackのパッケージであり、2つのコマンドは、いくつかの公開設定があり、公開設定は、ファイルに書かれています。

Oct 26, 2020 · 8 min read

Linuxの基本

Oct 26, 2020 · 6 min read

数独生成アルゴリズム

Oct 26, 2020 · 3 min read

V8エンジン学習 - 関数式

Oct 26, 2020 · 3 min read