`
javamore
  • 浏览: 61745 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入 JavaScript ‘undefined’

阅读更多

我们知道,javascript是一种弱类型的语言,这意味着我们不必显式定义变量的数据类型。事实上,我们无法在 javascript 上明确地定义数据类型。而只能通过var语句显示声明变量:var myvar;
或这样隐式声明变量:myvar=myvarValue(省略var,在声明的同时初始化)。

javascript有三种基本数据类型(字符串、数值、布尔 ),两种引用数据类型(对象、数组)和两种特殊数据类型(Null 、Undefined )。对于基本数据类型和引用数据类型我们很好理解。对于特殊数据类型Null和Undefined,常常会引起我们的一些疑惑。

在 Javascript 中数据类型 Null 只有一个值:null。如果一个变量的值为null ,那么表示该变量没有保存有效的数、字符串、Boolean、数组或对象,null与vbscript中Empty的概念不相同(Empty指未初始化的变量值)。因此,我们可以通过给一个变量赋 null 值来清除变量的内容。

考查下面的代码:

 

function test1()
{
 var a=null;
 alert("typeof(a):"+typeof(a));
 alert("a==0:"+(a==0));
}

 

结果显示:typeof(null)返回的对象类型为Object,而非类型null。这点潜在的混淆是为了向下兼容。同时,在 Javascript 中,null 与 0 不相等。

如果已声明了一个变量但还没有初始化,那么该变量的值就是 undefined。这与vbscript中Empty的概念是相同的。

如下情况使返回 undefined 值:
1、对象属性不存在;
2、声明了变量但从未赋值。

 

注意:很多人常犯的一个错误是:当他定义一个变量的时候未初始化,想当然地认为该变量的默认值为数字0字符串""。

我们在javascript中如何判断一个变量是否存在,可以使用如下方法:

 

function test2()
{
 var a;
 alert(typeof(a)==undefined);//false
 alert(typeof(a)=="undefined");//true
 alert(a==undefined);//true
}

 


注意:我们可以通过与undefined做比较测试一个变量是否初始化,但不能通过与 undefined 做比较来测试一个变量是否存在,而只能通过typeof(variable)=="undefined"来判断!

下面的例子将证明我的这一提示的正确性:

 

function test3()
{
 var a;
 //alert(b==undefined);//出现错误:'b'未定义
 alert(typeof(b)=="undefined");//true 
}

 

undefined 值与null做比较,考查下面的代码:

 

<script language="javascript">
function myObject(prop1,prop2)
{
 this.prop1=prop1;
 this.prop2=prop2;
}
var myObj=new myObject(null,"test");
alert("myObj.prop1==null:"+(myObj.prop1==null));
alert("myObj.prop1==undefined:"+(myObj.prop1==undefined));
alert("myObj.prop2==undefined:"+(myObj.prop2==undefined));
alert("myObj.prop3==undefined:"+(myObj.prop3==undefined));

var myobjProps="";
for(prop in myObj)
 myobjProps+=prop+",";
alert("myObject的属性有:"+myobjProps);

alert("myObject.prop3 exists?:"+(("prop3" in myObj)?"YES":"NO"));
//要检查一个对象属性是否存在,可以in 运算符。
</script>

 

总结:undefined 值与null做比较,如下情况时,比较的结果为 true:
 1、属性 myObj.prop1 包含null 值;
 2、属性 myObj.prop3 不存在。

 

2
1
分享到:
评论

相关推荐

    深入学习JavaScript对象

    JavaScript中,除了五种原始类型(即数字,字符串,布尔值,null,undefined)之外的都是对象了,所以,不把对象学明白怎么继续往下学习呢? 一.概述 对象是一种复合值,它将很多值(原始值或其他对象)聚合在一起...

    深入理解javascript作用域和闭包

    作用域是一个变量和函数的作用范围,javascript中函数内声明的所有变量在函数体内始终是可见的,在javascript中有全局作用域和局部作用域,但是没有块级作用域,局部变量的优先级高于全局变量,通过几个示例来了解下...

    深入解读JavaScript中的Hoisting机制

    javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面。 先看一段代码 var v = "hello"; (function(){ console.log(v); var v = "world"; })(); ...

    JavaScript 对象深入学习总结(经典)

    JavaScript中,除了五种原始类型(即数字,字符串,布尔值,null,undefined)之外的都是对象了,所以,不把对象学明白怎么继续往下学习呢?本篇文章给大家分享javascript对象深入学习总结,小伙伴们跟着小编一起...

    深入认识javascript中的eval函数

    1)介绍javascript中的eval函数的用法 (2)如何在函数内执行全局代码 ►先来说eval的用法,内容比较简单,熟悉的可以跳过。 eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行...

    JavaScript对象的特性与实践应用深入详解

    JavaScript 的简单数据类型是数字、字符串、布尔值(true/false)、null 以及 undefined,其它所有的值都是对象。这些对象是可变的键值对集合。 对象是属性的容器,每个属性都有名字和值。属性的名字可以是包含空...

    JavaScript prototype属性深入介绍

    每个函数创建时默认带有一个prototype属性,其中包含一个constructor属性,和一个指向Object对象的隐藏属性__proto__。constructor属性的值为该函数的对象。在一个函数前面加上new来... [javascript] 代码如下: funct

    深入理解JavaScript的值传递和引用传递

    JavaScript有5种基本的数据类型,分别是:布尔、null、undefined、String和Number。这篇文章主要介绍了JavaScript的值传递和引用传递,需要的朋友可以参考下

    深入理解 JavaScript 中的 JSON

    我们先来看一个JS中常见的JS对象序列化成JSON字符串的问题,请问,以下JS对象通过JSON.stringify后的字符... 'address': undefined, 'phone': [1234567,undefined], 'fullName': function(){ return this.firstName

    JavaScript数组特性与实践应用深入详解

    本文实例讲述了JavaScript数组特性与实践应用。分享给大家供大家参考,具体如下: JavaScript 提供了一种类似数组特性的对象,它把数组的下标变为字符串,作为...//undefined console.log(numbers[1]);//one console.lo

    javascript eval函数深入认识

    (1)介绍javascript中的eval函数的用法 (2)如何在函数内执行全局代码 ►先来说eval的用法,内容比较简单,熟悉的可以跳过。 eval函数接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行...

    深入了解JavaScript中的Symbol的使用方法

    JavaScript 在 1997 年被标准化时,就有 6 种数据类型,直到 ES6 出现之前,程序中的变量一定是以下 6 种数据类型之一:  Undefined  Null  Boolean  Number  String  Object 每种数据类型都是一系列值的组合...

    深入理解JavaScript中为什么string可以拥有方法

    我们都知道,JavaScript数据类型分两大类,基本类型(或者称原始类型)和引用类型。 基本类型的值是保存在栈内存中的简单数据段,它们是按值访问的。JS中有五种基本类型:Undefined、Null、Boolean、Number和String...

    谈谈我对JavaScript中typeof和instanceof的深入理解

    这次主要说说javascript的类型判断函数typeof和判断构造函数原型instanceof的用法和注意的地方。 typeof 先来说说typeof吧。首先需要注意的是,typeof方法返回一个字符串,来表示数据的类型。 typeof 是一个一元...

    理解Javascript

    理解javascript系列博文是通过带领大家分析javascript执行时的内存分配情况,来解释javascript原理,具体会涵盖javascript预加载,闭包原理,面象对象,执行模型,对象模型...,文章的视角很特别,也非常深入,希望...

    深入浅析javascript中的作用域(推荐)

    但实际上是undefined; 说到这里,我们首先说一下js逐行解析代码之前做的一些准备工作, js在逐行读代码之前,会做一些“预解析”工作,会先提前找到一些”小东西”,当然”js解析器“不会随便找一些数据的,它会...

    深入理解JS中的变量及作用域、undefined与null

    1、Javascript变量作用域 javascript中,变量主要分为局部变量和全局变量两种,对应的作用域也是局部作用域和全局作用域。 1 局部变量和作用域 局部变量一般在函数体内部声明使用: function func(){ var i=12;//...

    javascript深拷贝、浅拷贝和循环引用深入理解

    包含Number,String,Boolean,Null,Undefined ,Symbol。 引用类型值指的是那些保存在堆内存中的对象,所以引用类型的值保存的是一个指针,这个指针指向存储在堆中的一个对象。除了上面的 6 种基本数据类型外,...

Global site tag (gtag.js) - Google Analytics