JavaScript语言中的对象

本文详细介绍了JavaScript中的数据类型,包括基本数据类型和复合数据类型,并深入探讨了typeof操作符的使用及其在不同浏览器环境下的表现。此外,还提供了一种判断函数类型的实用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

众所周知,对象是一种复合数据类型,是一个无序的属性集合,每个属性都有自己的名字和值。它可以有new来创建,但new运算符之后必须有用于初始化对象的构造函数(constructor),还可以使用大括号包含一系列的属性名加上冒号加上属性值构成。

ECMAScript 辨认两种类型的对象:本地对象(native Object)和宿主对象(host Object),以及一个本地对象的子分类-内置对象(ECMA 262 3rd Ed Section 4.3)。本地对象属于JS语言,宿主对象由环境提供,例如,document对象和DOM节点。

其中,JavaScript的本地对象里有共六中基本数据类型,其中有五种原始类型(primitive type):Number, String, Boolean, Null, Undefined. 其它的都是复合数据类型Object。

古老的typeof
ECMAScript中,typeof是一元表达式之一,跟+,-,++,--,void,delete等并列。

typeof的步骤是:
  1. 计算一元表达式的值;
  2. 如果步骤一结果的类型不是引用类型,跳到步骤4
  3. 如果步骤一结果的组成对象是null,返回“undefined”
  4. 调用getValue方法
  5. 根据下表返回(ECMAScript 262 V3,浏览器类型为):


最新的V5中,对后两项做了调整:


typeof的兼容性问题

HTML code
   
   
< script type ="text/javascript" > window.onload = function () { document.getElementById( " info " ).innerHTML = " typeof undefined == " + ( typeof undefined) + // "undefined" " <br/>typeof null === " + ( typeof null ) + // "object" " <br/>typeof true === " + ( typeof true ) + // "boolean" " <br/>typeof 1 === " + ( typeof 1 ) + // "number" " <br/> typeof /"hello/" === " + ( typeof " hello " ) + // "string" " <br/> typeof new Date() === " + ( typeof new Date()) + // "object" " <br/> typeof (new Date()).getDate === " + ( typeof ( new Date()).getDate) + // "function" " <br/> typeof document.getElementById === " + ( typeof document.getElementById) + // "function" " <br/> typeof document === " + ( typeof document); // "object" } </ script > < div id ="info" ></ div >

以上测试用例,测试的是各种数据类型的typeof表达式结果。
只有IE中,对document.getElementById方法返回“object”。

可见,typeof只适合检测基本的数据类型,对于复合型的数据类型都是返回“object”,如以上的Date对象。再比如:

JScript code
   
   
function A(){ } var a = new A(); alert(type of a); // object



如何判断一个JS对象的类型是否是function?

HTML code
   
   
< script type ="text/javascript" > function isFunction( fn ) { return !! fn && // 不为空,存在 ! fn.nodeName && // 不是节点对象 fn.constructor != String && // 不是字符串类型 fn.constructor != RegExp && // 不是正则表达式 fn.constructor != Array && // 不是数组 / function / i.test( fn + "" ); // toString()中包含"function" } alert(isFunction(document.getElementById)); // true </ script >

以上是大师John Resig判断是否Function的方法。很经典。利用的是排除法,聪明……佩服……

备注
【1】. GetValue (V):

  1. 如果V不是引用类型,返回V;
  2. 调用getBase(V)方法,返回V的基本对象类型;
  3. 如果步骤二返回null,抛出ReferenceError异常;
  4. 调用步骤二返回值的[[Get]]方法,通过GetPropertyName(V)求原型名称;
  5. 返回第四步的值。

  * GetBase(V). Returns the base object component of the reference V.
  * GetPropertyName(V). Returns the property name component of the reference V.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值