ホームページ > 記事 > ウェブフロントエンド > jsの基本型と参照型
この記事で共有する内容は、js の基本型と参照型に関するもので、必要な友達は参照できます
参照型: オブジェクト、配列、日付、RegExp、関数
参考: http://www.ruanyifeng.com/blog/2014/03/undefine-vs-null.html
1. JavaScript では、変数を未定義または null に代入します。正直言って、ほとんど違いはありません。
var a=null; var b=undefined;
2. if ステートメントでは、unknown と null は自動的に false に変換され、等価演算子はそれらが等しいことを直接報告します。 if (!undefined)
console.log('undefined is false');// undefined is falseif (!null)
console.log('null is false');// null is falseundefined == null// true<span style="font-family:Georgia, serif;color:#111111;"><span style="font-size:16px;letter-spacing:-.12px;word-spacing:2.4px;background-color:rgb(245,245,213);"><strong>
</strong></span></span>
上記のコードは、2 つの動作がいかに似ているかを示しています。
未定義と null の意味と使い方は似ているのに、なぜこのような値を 2 つ同時に設定する必要があるのでしょうか?これは理由もなく JavaScript の複雑さを増し、初心者を悩ませませんか? Google が開発した JavaScript 言語の代替である Dart 言語では、null のみが存在し、未定義は存在しないと明確に規定されています。
2.最近、新しい本「Speaking JavaScript」を読んでいたとき、この質問に対する答えを偶然発見しました。
結局のところ、これは JavaScript の歴史に関係しているようです。 JavaScript が 1995 年に誕生したとき、Java と同様に、当初は「何もない」ことを表す値として null が設定されるだけでした。 C言語の伝統に従って、nullは自動的に0に変換されるように設計されています。
Number(null)// 05 + null// 5
しかし、JavaScript の設計者であるブレンダン・アイヒ氏は、2 つの理由から、これでは十分ではないと感じています。
まず、nullはJavaと同じようにオブジェクトとして扱われます。ただし、JavaScript のデータ型は、プリミティブ型 (プリミティブ) と複合型 (コンプレックス) の 2 つのカテゴリに分類されます。ブレンダン アイヒ氏は、「なし」を表す値はオブジェクトではない方がよいと考えています。
第 2 に、JavaScript の初期バージョンにはエラー処理メカニズムが含まれておらず、データ型の不一致が発生すると、型が自動的に変換されるか、警告なしに失敗することがよくあります。 Brendan Aich は、null が自動的に 0 に変換されると、エラーを見つけるのが難しくなると感じています。
それで、ブレンダン・アイヒは別の未定義のものをデザインしました。
3. 初期設計JavaScript の初期バージョンは次のように区別されます。null は「なし」を表すオブジェクトであり、数値に変換すると 0 になります。未定義は「なし」を表すプリミティブ値であり、数値に変換するとNaNになります。
Number(undefined)// NaN5 + undefined// NaN4. 現在の使用法
しかし、上記の区別は実際には不可能であることがすぐに判明しました。現在、null と unknown は基本的に同義ですが、いくつかの微妙な違いがあります。
null は「オブジェクトがない」ことを意味します。つまり、そこに値があってはなりません。一般的な使用法は次のとおりです:
(1) 関数のパラメーターとして、関数のパラメーターがオブジェクトではないことを示します。 (2) は、オブジェクト プロトタイプ チェーンのエンドポイントとして機能します。
// null
未定義は「値が欠落している」という意味で、ここには値があるはずですが、まだ定義されていないことを意味します。一般的な使用法は次のとおりです:
(1) 変数が宣言されていても値が割り当てられていない場合、その変数は未定義と等しくなります。
(2) 関数呼び出し時に、提供されるべきパラメータが提供されず、パラメータが未定義に等しい。
var i; i // undefinedfunction f(x){console.log(x)} f() // undefinedvar o = new Object(); o.p // undefinedvar x = f(); x // undefined
Object は参照型ですか?
Object是一个基础类型,其他所有类型都从Object继承了基本行为。比如原型链中它的原型为null。参照型と基本型の違いは何ですか?どれがヒープ上にあり、どれがスタック上にあるのでしょうか?
1. 基本型変数はスタック領域に格納されます(スタック領域とはメモリ内のスタックメモリを指します)
その格納構造は次のようになります:スタック領域には変数識別子が含まれますおよび 変数の値。
2.JavaScript は他の言語とは異なり、メモリ内の場所に直接アクセスすることができません。つまり、オブジェクトのメモリ空間を直接操作することはできません。 実際、これは操作オブジェクトへの参照なので、参照型の値は参照によってアクセスされます。正確には、参照型の格納にはメモリのスタック領域とヒープ領域が必要です(ヒープ領域とはメモリ内のヒープメモリのことを指します) スタック領域のメモリには変数識別子とオブジェクトへのポインタが格納されます。
ヒープメモリ内のオブジェクトのアドレスとも言えます。以下のオブジェクトがあるとします: var person1 = {name:'jozo'};var person2 = {name:'xiaom'};var person3 = {name:'xiaoq'};
すると、これら3つのオブジェクトのメモリ上の格納状況は以下のようになります:
jsの基本型と参照型
基本タイプ: 数値、文字列、ブール値、Null、未定義。
参照タイプ: オブジェクト、配列、日付、RegExp、関数
null と未定義の違い。 参考: http://www.ruanyifeng.com/blog/2014/03/unknown-vs-null.html1.在JavaScript中,将一个变量赋值为undefined或null,老实说,几乎没区别。
var a=null; var b=undefined;
2.undefined和null在if语句中,都会被自动转为false,相等运算符甚至直接报告两者相等。
if (!undefined) console.log('undefined is false');// undefined is falseif (!null) console.log('null is false');// null is falseundefined == null// true<span style="font-family:Georgia, serif;color:#111111;"><span style="font-size:16px;letter-spacing:-.12px;word-spacing:2.4px;background-color:rgb(245,245,213);"><strong> </strong></span></span>
上面代码说明,两者的行为是何等相似!
既然undefined和null的含义与用法都差不多,为什么要同时设置两个这样的值,这不是无端增加JavaScript的复杂度,令初学者困扰吗?Google公司开发的JavaScript语言的替代品Dart语言,就明确规定只有null,没有undefined!
二、
最近,我在读新书《Speaking JavaScript》时,意外发现了这个问题的答案!
原来,这与JavaScript的历史有关。1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示”无”的值。
根据C语言的传统,null被设计成可以自动转为0。
Number(null)// 05 + null// 5
但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。
首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示”无”的值最好不是对象。
其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。
因此,Brendan Eich又设计了一个undefined。
三、最初设计
JavaScript的最初版本是这样区分的:null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN。
Number(undefined)// NaN5 + undefined// NaN
四、目前的用法
但是,上面这样的区分,在实践中很快就被证明不可行。目前,null和undefined基本是同义的,只有一些细微的差别。
null表示”没有对象”,即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
Object.getPrototypeOf(Object.prototype)
// null
undefined表示”缺少值”,就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
var i; i // undefinedfunction f(x){console.log(x)} f() // undefinedvar o = new Object(); o.p // undefinedvar x = f(); x // undefined
Object是引用类型嘛?
Object是一个基础类型,其他所有类型都从Object继承了基本行为。比如原型链中它的原型为null。
引用类型和基本类型有什么区别?哪个是存在堆哪一个是存在栈上面的?
1.基本类型的变量是存放在栈区的(栈区指内存里的栈内存)
那么它的存储结构如下图:
栈区包括了 变量的标识符和变量的值。
2.
javascript和其他语言不同,其不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间,那我们操作啥呢? 实际上,是操作对象的引用,
所以引用类型的值是按引用访问的。
准确地说,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,
也可以说是该对象在堆内存的地址。
假如有以下几个对象:
var person1 = {name:'jozo'};var person2 = {name:'xiaom'};var person3 = {name:'xiaoq'};
则这三个对象的在内存中保存的情况如下图:
相关推荐:
以上がjsの基本型と参照型の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。