JavaScript のプリミティブ データ型について議論するとき、ほとんどの人は文字列から数値、ブール値までの基本を知っています。これらのプリミティブ型は非常に単純で、常識のように動作します。ただし、この記事では、ユニークなプリミティブ データ型である Null と Unknown、およびそれらが非常に似ていながらも矛盾している理由に焦点を当てます。
1. null と未定義を理解する
JavaScript では、null は言語のリテラルおよびキーワードであり、認識できないオブジェクト値を表すために使用されます。つまり、これは「値がない」という意味で使用されますが、期待値をいつ取得するかを決めることができます。
似ていますが、未定義は実際には値が存在しないことを表し、何かが欠落していることを意味します。どちらも完全に不変であり、プロパティやメソッドがなく、プロパティに値を割り当てることはできません。実際、null または未定義のプロパティにアクセスまたは定義しようとすると、TypeError が発生します。
値なしで表されるブール値は false です。これは、if ステートメントなどの条件付きコンテキストで false と評価されることを意味します。等価演算子 (==) を使用して、これら 2 つの値を他の false 値と比較します。それらは、それ自体を除いて等しくありません:
null == 0; // false undefined == ""; // false null == false; // false undefined == false; // false null == undefined; // true
ただし、その他の類似点として、null と unknown は同等ではありません。それぞれは独自の型の一意のメンバーであり、unknown は Unknown 型で、null は Object 型です。以下に示すように、型と値の両方が等しい必要がある等価演算子 (===) を使用して、これら 2 つの値を比較します。
null === undefined; //false typeof null; //"object" typeof undefined; //"undefined"
さらに、null が数値演算に関与する場合、その値は自動的に 0 に変換されます。 したがって、次の式は計算後に正しい値を取得します。
123 + null; //123 123 * null; //0
alert('undefined' in window);//输出:true var anObj = {}; alert('undefined' in anObj); //输出:false
注:
未定義の値を含むコードを生成する方法はたくさんあります。通常、存在しない値にアクセスしようとしたときに発生します。この場合、JavaScript のような動的で型付けが弱い言語では、エラーが発生するのではなく、デフォルトで未定義の値が返されます。
1. 初期値なしで宣言された変数はデフォルト値が未定義になります:
var foo; // 默认值为 undefined
2. 存在しないオブジェクト プロパティまたは配列項目にアクセスしようとすると、未定義の値が返されます:
var array = [1, 2, 3]; var foo = array.foo; // foo 属性不存在, 返回 undefined var item = array[5]; // 数组中没有索引为5的项,返回 undefined
3. 関数の return ステートメントが省略されている場合、または return ステートメントがパラメーターを受け取らず、未定義を返す場合:
var value = (function(){ })(); // 返回 undefined var value1 = (function(){ return; })(); // 返回 undefined
4. 関数を呼び出すときに、提供されるべきパラメータが提供されず、パラメータが未定義に等しい
function f(x){ console.log(x) } f(); // undefined
ECMAScript 5中,这个变量是只读的,以前并非如此。
三、null的用例
null的用例是使他与众不同的主要方面,因为不像undefined,null被认为是更有用。这正是为什么typeof操作符作用于null值 时返回“object”。最初的理由是,现在仍然是,通常用作一个空引用一个空对象的预期,就像一个占位符。typeof的这种行为已经被确认为一个错 误,虽然提出了修正,出于后兼容的目的,这一点已经保持不变。
一般来说,如果你需要给一个变量或属性指定一个不变值,将它传递给一个函数,或者从一个函数返回null,null几乎总是最好的选择。简而言之,JavaScript使用undefined并且程序员应该使用null。
null的另一个可行的用例,也被认为是良好的实践是一个显式指定变量为无效(object= null)当一个引用不再是必需的。通过分配null值,有效地清除引用,并假设对象没有引用其他代码,指定垃圾收集,确保回收内存。
四、提高undefined性能
当我们在程序中使用undefined值时,实际上使用的是window对象的undefined属性。 同样,当我们定义一个变量但未赋予其初始值,例如:
var aValue;
这时,JavaScript在所谓的预编译时会将其初始值设置为对window.undefined属性的引用, 于是,当我们将一个变量或值与undefined比较时,实际上是与window对象的undefined属性比较。这个比较过程中,JavaScript会搜索window对象名叫‘undefined'的属性,然后再比较两个操作数的引用指针是否相同。
由于window对象的属性值是非常多的,在每一次与undefined的比较中,搜索window对象的undefined属性都会花费时 间。在需要频繁与undefined进行比较的函数中,这可能会是一个性能问题点。因此,在这种情况下,我们可以自行定义一个局部的undefined变 量,来加快对undefined的比较速度。例如:
function anyFunc() { var undefined; //自定义局部undefined变量 if(x == undefined) //作用域上的引用比较 while(y != undefined) //作用域上的引用比较 };
其中,定义undefined局部变量时,其初始值会是对window.undefined属性值的引用。新定义的局部undefined变 量存在与该函数的作用域上。在随后的比较操作中,JavaScript代码的书写方式没有任何的改变,但比较速度却很快。因为作用域上的变量数量会远远少 于window对象的属性,搜索变量的速度会极大提高。
这就是许多前端JS框架为什么常常要自己定义一个局部undefined变量的原因!
以上就是本文的全部内容,希望对大家的学习有所帮助。