Object和Function有着异曲同工之妙,它们都可以有属性和方法。不过却有着极大的差别,请看表3-1。
表3-1 Object和function的一些比较
区
别
|
Object
|
Function
|
定义后
|
不能再使用
new
创建对象实例,可以赋值给其他变量,多个变量同时引用一个对象,或者克隆对象
|
可以使用
new
创建多个对象实例,使用时互不影响,但是使用内存也会更多
|
多态性
|
具备
|
具备
|
继承
|
无法继承,除非用复制的方式来实现
|
可以实现
|
toString
和
valueOf
|
如果你不实现它的代码,别人无法通过
toString
、
valueOf
查看到你的代码
|
默认情况下,
toString
、
valueOf
是可以看到
function
的代码的
|
prototype
原型问题
|
给
Object
原型增加方法或属性,
new function
出来的对象也同样有这样的方法——因此这是扩展通用对象功能的好地方
|
给
Function
原型增加方法或属性,
Object
实例对象不会有这些方法和属性
|
引用传递
|
支持
|
支持
|
数组下标运算符号的支持
|
通过设计可以支持
|
通过设计可以支持
|
prototype
原型上扩展的属性和方法
|
Mozilla Firefox
中等于给
body
【包含】内容的所有
HTML DOM
对象扩展属性和方法
|
Function
原型上扩展,则不会
|
String、Number、Boolean对象不支持引用传递。
其他区别则是本章主要讲解的内容,这里就先不讲。
其实,无论是Object也好,function也好,我们的目的都是一样的,就是定义和创建一个可用对象实例,如果不是必需的,笔者特别推荐采用Object的形式,因为定义和实例化一次就完成了。
许多读者在想,本章的内容讲的是不断地在Object对象
上进行扩展,以便在各种对象的应用时,随时都能拿来就用,那么内存消耗上会不会无形中增加许多,从而导致性能下降呢?其实你大可不必担心,关于这个问题,
笔者做了测试,创建100
000个对象,内存只是比一般的方式多了176K左右,平均下来是每个对象创建时多了1.8字节,牺牲这点内存是值得的,再说,你的设计中如果真要创建
10万以上对象却又不delete,那你可真的要好好设计一下。这一测试下来,就很明白了,扩展Object,在各对象里存在的只是对这个原始的
Object的一个引用罢了。测试方式如下所示。
<html>
<head><meta
http-equiv=content-type content="text/html; charset=utf-8">
<title>测试”
“
对Object扩展后内存的使用情况”</title>
</head>
<body>
<!--
第一次观察内参情况后在把这里的注释打开
<script
type="text/javascript" language="JavaScript"
src="/jcore/resource/javascript/Jcore.js"></script>
-->
<script
type="text/javascript" language="JavaScript">
<!--
var arrTmp =
[];for(var i = 0; i < 100000; i++) arrTmp.push(new Date);
-->
</script>
</body>
</html>
3.1
typeof和constructor总结
下面都对变量test的值进行说明。有一点可以先说明的是,typeof的值始终只有这样几个:“number”、“string”、“Boolean”、“object”、“function”和“undefined”、“unknown”。
注意,typeof为“unknown”的情况特别罕见,在微软的文档中几乎没有提到,笔者也是在“typeof
TdcObj.recordset.recordcount”的时候才发现这个特例的。
而对象的constructor属性值则视情况而论,详细请见表3-2。
表3-2
typeof和constructor的比较
变
量
|
typeof
返回的都是
String
串
|
constructor
返回的是对象
|
其他说明
|
//
这里省略了
( )
var test
= new Object;
//
上面等同于
var test
= {};
|
object
|
Object
|
任何自定义对象
(Object)
的
typeof
都是
object
|
var test
= new Array(123,456);
//
上面等同于
var test
= [123,456];
|
object
|
Array
|
|
var test
= function(){};
//
上面等同于
var test
= new Function();
|
Function
|
Function
|
但是请注意,如果是
var oT = new test();
则
typeof oT
等于
object
|
function
fnMyTest(){}
//
这里省略了
()
var test
= new fnMyTest;
|
object
|
fnMyTest
|
要特别注意的是,自定义函数的
constructor
等于这个定义的函数对象,又,例如:
(new Date).constructor
等于
Date
,它的
typeof
等于
object
|
var test
= null;
|
object
|
发生错误,无法获取
constructor
,虽然它的
tyepof
是“
object
”,这就是它的特殊性
|
这种情况是非常特殊的,读者朋友要特别小心。在程序运行过程中常常会发生这样的情况的,在你并不知道已经为
null
的情况下却还在求
test.constructor
的内容
|
var test
= undefined;
|
undefined
|
同
null
一样,会发生错误,因为它不是一个有效的变量或对象
|
|
var test
= 9897;
|
number
|
Number
|
|
var test
= “My Test String”;
|
string
|
String
|
|
分享到:
相关推荐
本文将深入探讨四种常用的方法来识别和判断JavaScript中的数据类型:`typeof`、`instanceof`、`constructor`以及`prototype`。 ### 1. `typeof` `typeof`操作符是最常见的类型检测方式之一,它返回一个表示未经计算...
首先,让我们来了解一下 typeof 函数和 constructor 属性的区别。typeof 函数可以告诉我们变量的类型,但是它有其局限性。例如,对于数组和对象,typeof 函数都会返回 "object",无法告诉我们变量的具体类型。这时 ...
避免使用`for in`循环遍历数组,采用经典`for`循环并缓存`length`,明确理解`Array`构造函数的行为,以及正确使用`typeof`和`instanceOf`进行类型检查,这些都是编写高质量JavaScript代码的关键。
`typeof`、`instanceof`和`constructor`是JavaScript中三种常见的用于判断对象类型的工具。下面将详细阐述它们的联系、区别以及应用场景。 `typeof`操作符: `typeof`主要用于检测一个值的数据类型,返回的是一个...
在JavaScript中,typeof操作符和constructor属性是两种检测数据类型的方法。它们各自有不同的使用场景和特点。下面详细介绍这两者的知识内容。 首先,typeof操作符用于检测变量的数据类型。它对不同类型的变量会...
在前端开发中, typeof 和 instanceof 是两种常用的判断数据类型的方法,下面我们将详细介绍这两种方法的使用方法、区别和实现原理。 一、typeof 操作符 typeof 操作符返回一个字符串,表示未经计算的操作数的类型...
在JavaScript中,`typeof`和`instanceof`是两种常用的类型检查操作符,它们各自有着不同的用法和特点。理解这两者之间的差异对于编写健壮的JavaScript代码至关重要。 `typeof`操作符主要用于检测变量的数据类型。它...
在JavaScript编程语言中,`instanceof` 和 `typeof` 是两个非常重要的操作符,用于判断变量的类型。它们各自有着不同的用途和用法,对于理解和调试代码至关重要。 首先,我们来详细了解一下`instanceof`操作符。`...
`typeof`能够区分JavaScript中的原始类型,包括`Undefined`、`Null`、`Boolean`、`Number`和`String`。然而,当遇到引用类型时,`typeof`会统一返回`object`,因此无法直接判断对象具体是什么类型,比如数组、日期等...
通过学习和应用这些代码,开发者可以提高他们代码的健壮性和类型检查的准确性,避免因类型错误导致的程序问题。 总的来说,JavaScript中的类型检查是一个关键的实践领域,尤其是在大型复杂项目中。通过更明确的类型...
2. **布尔值(boolean)**:布尔值`true`和`false`使用`typeof`也会返回`"boolean"`。同样,`Boolean()`构造函数的结果也是如此。 3. **数字(number)**:包括普通数字、`NaN`和`Infinity`,`typeof`返回`"number...
`typeof`对于数组和空对象引用都返回"object",这可能会导致误解。如果你需要判断一个值是否为数组,应使用`Array.isArray()`: ```javascript Array.isArray([]); // true typeof []; // "object" ``` 6. ...
`typeof`的使用不仅有助于防止类型错误,还能帮助我们在编写动态类型的JavaScript代码时更好地理解和控制数据。以下是关于`typeof`用法的详细说明: 1. **基本类型检查** - `typeof`对于原始类型(如`undefined`、...
对于数据类型的判断,JavaScript提供了typeof和instanceof两个操作符。这两个操作符是检测数据类型的常用方法,但它们各自存在一定的局限性。本文将通过分析这两个操作符的使用场景与局限性,探讨如何进行优化,以...
在JavaScript中,`typeof`和`instanceof`是两种常用的类型检查操作符,它们在处理数据类型时扮演着重要角色。然而,它们各有其特点和局限性,理解这些差异对于编写健壮的代码至关重要。 首先,`typeof`操作符是一个...
接下来,我们将深入探讨`class`和`typeof`在JavaScript中的具体表现和背后的原理。 首先,让我们了解`class`关键字。在JavaScript中,`class`主要用于定义类,它本质上还是基于函数的构造器。类定义了一个对象的...
当我们使用`typeof`操作符检查`Object`时,返回的结果是`"function"`,这是因为`Object`是一个构造函数。类似的,像`Array`这样的其他内置类型也是构造函数。 6. **学习资源** 深入理解JavaScript的构造函数和...