JavaScript の 7 つの値の型と typeof 演算子

黄舟
リリース: 2017-02-28 14:34:11
オリジナル
2267 人が閲覧しました

JavaScriptを基礎から復習する予定です

ちなみに、私が学んだことをシェアしてまとめておきます


組み込み型

JavaScriptには7つの組み込み型があり、そのうち6つの基本型と1 つの参照型

  • 基本型

    • number (数値)

    • string (文字列)

    • boolean (ブール値)

    • unknown (未定義)

    • null (ヌル)

    • シンボル (シンボル) [ES6 新しい仕様]

  • 参照型

    • オブジェクト (オブジェクト)

注: 配列 array と function function は特別なオブジェクトであり、オブジェクトであることを意味します「サブタイプ」も参照値です

基本型は、メモリ内に固定領域を持つスタックメモリに保存された単純なデータセグメントです
参照型は、ヒープメモリに保存され、参照によってアクセスされ、保存されるオブジェクトですスタックメモリ内 オブジェクトへのポインタ(オブジェクトのアクセスアドレスを格納)
スタックがメモリに分割される理由は、実行時に占有されるメモリを最小限に抑えるためのブラウザのガベージコレクションメカニズムに関連しているためです
基本型がスタックデータで、参照型がヒープデータであることを知っていれば、上記の言葉が理解できなくても問題ありません。

typeof演算子

はtypeof演算子とも呼ばれます。演算子は同じものを指します
この typeof we を通じて値の type を確認できます
type の文字列 (英語の小文字) を返しますが、すべての型を識別できるわけではありません

console.log(typeof 123);
// "number"console.log(typeof '123');
// "string"console.log(typeof true);
// "boolean"console.log(typeof undefined);
// "undefined"console.log(typeof Symbol());
// "symbol"console.log(typeof null);
// "object"  <-注意看这里console.log(typeof {demo: 123});
// "object"
ログイン後にコピー

これら 7 つの型をコンソールに出力しましたそして問題が見つかりました
typeof null は実際には "object" を返しました
まあ、それは私たちが期待していたものではありません
"null" を返すことが約束されていました
実際、これは歴史的な問題であり、このバグは 20 年以上存在しています (古いものです)。私より)
おそらく修正されることはありません。あまりにも多くの Web システムが関係しており、「修正」のコストは想像を絶するからです


しかし、この方法で null 値の型を判断できます

var foo = null;if(!foo && typeof foo === &#39;object&#39;){    console.log(&#39;这是一个空值...&#39;);
}
ログイン後にコピー

なぜなら、オブジェクトが何であっても、空のオブジェクトの場合、ブール値 true に変換されます (後で型変換を書くときに説明します)
このようにして null を判定することができますが、私はそれを使用していないようです


元に戻るtypeof の問題に加えて、問題も見つかりました

console.log(typeof function(){});// "function"
ログイン後にコピー

typeof には JavaScript のファーストクラスに問題があります。 Citizens - 実行可能オブジェクト - 関数は特別な扱いを受けています
そのため、関数はオブジェクトですが、typeof 演算子は区別して「関数」を返すことができます
なぜ関数が呼び出せるのかというと、内部属性 [[call]] があるからで、「呼び出し可能なオブジェクト」なので、それについては後ほどお話します
ところで、配列も特殊なオブジェクトですが、 typeof はそれらを認識しません
配列を区別したい場合は、配列の識別方法について私が書いたものを読むことができます
したがって、typeof の戻り値は次の String
数値、文字列、ブール値、未定義、オブジェクト、関数になります, 記号


typeofについて話しているところで、もう一つ豆知識があります

console.log(typeof NaN)// "number"
ログイン後にコピー

また間違いやすいです、面接で質問される可能性もあります
でもこれはバグではありません
NaNは英語です数字ではありません「数値ではありません」
つまり、数値ではない数値は数値です
それを知らなくても問題ありません
ここで、NaN は数値型であることを覚えておいてください


ああ、そうです
typeof は次のように使用できますtypeof(a + b)
しかし、それは関数ではありません、関数ではありません、関数ではありません (重要なことを 3 回言います)
しかし単項演算子です、覚えておいてください
上記の使用法は次の場合にのみ使用されます式のオペランド 演算結果の型チェック

値と型

ここではそんな問題について解説します
JavaScriptでは変数に型はなく、値のみが型を持ちます
typeof演算子は次の文字列も返します変数が保持する値の型
私たちは弱い型付け言語
なので、変数が保持する値の型を変更できます

var foo = 123;console.log(typeof foo);
// "number"foo = true;console.log(typeof foo);
// "boolean"foo = &#39;abc&#39;;console.log(typeof foo);
// "string"
ログイン後にコピー

変数の値の型は変更できますが、記述するときにこれを行ってはなりませんプロジェクト
変数にプレフィックスや特殊記号を追加して、宣言している変数のタイプを覚えておくことができます
たとえば、retArr、bFlag、strLen などです。

typeof undeclared

もちろん、undeclared は宣言されていないキーワードです。存在します
でも、なぜこのように書かなければならないのでしょうか
質問を見てみましょう

console.log(foo);
ログイン後にコピー

我没定义foo就打印,于是
JavaScript の 7 つの値の型と typeof 演算子
果不其然,浏览器蒙圈了
给大家翻译成中文:未捕获引用错误: foo没有定义
可能大家都不会去注意,其实这是很容易让人误会的
在这了 is not defined != is undefind
因为我连声明都没声明,怎么谈定义
所以如果浏览器报出is not declared或许更准确
我们暂且把这种连定义都没定义的变量看作“undeclared”变量
但是对于这种“undeclared”未定义的变量,typeof有特殊的安全防范机制

console.log(typeof foo);// "undefined"
ログイン後にコピー

出乎意料的,它对于undeclared变量并没有报错,而是返回了“undefined”
虽然我们觉得它返回“undeclared”更容易理解一些(我们的要求太高了)
其实它没有报错就相当不错了
这种容错对于我们来说还是很有帮助的
比如说我们想知道全局空间有没有变量foo

if(foo){  //若不存在会报错
    //...}if(typeof foo !== &#39;undefined&#39;){  //不存在也不会报错
    //...}if(window.foo){  //不存在同样不会报错
    //...}
ログイン後にコピー

最后一种通过window对象调用与undeclared变量不同
访问不存在的对象属性是不会报错的,而是返回undefined(是类型而不是字符串)
不过如果我们全局对象不是window的话,就不能使用这种方法了(比如,node.js)

总结

JavaScript内置类型:

  • 基本类型(栈数据):number、string、boolean、undefined、null、object、symbol(ES6规范新增)

  • 引用类型(堆数据):object

typeof操作符返回值:

  • “number”

  • “string”

  • “boolean”

  • “undefined”

  • “object”

  • “function”【sp】

  • “symbol”

typeof null -> “object” 历史遗留bug

typeof NaN -> ‘number’ 注意

变量没有类型,其持有值有类型

typeof的容错机制可以用来检查undeclared(未声明)变量

 以上就是JavaScript中的七种值类型与typeof运算符的内容,更多相关内容请关注PHP中文网(www.php.cn)!


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート