`
zhangyingjie@neusoft.com
  • 浏览: 1345 次
  • 性别: Icon_minigender_1
  • 来自: 大连
最近访客 更多访客>>
社区版块
存档分类
最新评论

typeof 和constructor

阅读更多

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

 

分享到:
评论

相关推荐

    JS:typeof instanceof constructor prototype区别

    本文将深入探讨四种常用的方法来识别和判断JavaScript中的数据类型:`typeof`、`instanceof`、`constructor`以及`prototype`。 ### 1. `typeof` `typeof`操作符是最常见的类型检测方式之一,它返回一个表示未经计算...

    JavaScript的constructor属性[文].pdf

    首先,让我们来了解一下 typeof 函数和 constructor 属性的区别。typeof 函数可以告诉我们变量的类型,但是它有其局限性。例如,对于数组和对象,typeof 函数都会返回 "object",无法告诉我们变量的具体类型。这时 ...

    Array, Array Constructor, for in loop, typeof, instanceOf

    避免使用`for in`循环遍历数组,采用经典`for`循环并缓存`length`,明确理解`Array`构造函数的行为,以及正确使用`typeof`和`instanceOf`进行类型检查,这些都是编写高质量JavaScript代码的关键。

    typeof、instanceof、constructor 的联系、区别、应用场景(js 类型判断)

    `typeof`、`instanceof`和`constructor`是JavaScript中三种常见的用于判断对象类型的工具。下面将详细阐述它们的联系、区别以及应用场景。 `typeof`操作符: `typeof`主要用于检测一个值的数据类型,返回的是一个...

    javascript中typeof操作符和constucor属性检测

    在JavaScript中,typeof操作符和constructor属性是两种检测数据类型的方法。它们各自有不同的使用场景和特点。下面详细介绍这两者的知识内容。 首先,typeof操作符用于检测变量的数据类型。它对不同类型的变量会...

    前端大厂最新面试题-typeof_instanceof.docx

    在前端开发中, typeof 和 instanceof 是两种常用的判断数据类型的方法,下面我们将详细介绍这两种方法的使用方法、区别和实现原理。 一、typeof 操作符 typeof 操作符返回一个字符串,表示未经计算的操作数的类型...

    JS中typeof与instanceof之间的区别总结.docx

    在JavaScript中,`typeof`和`instanceof`是两种常用的类型检查操作符,它们各自有着不同的用法和特点。理解这两者之间的差异对于编写健壮的JavaScript代码至关重要。 `typeof`操作符主要用于检测变量的数据类型。它...

    instanceof 判断引用类型,typeof判断基本类型。

    在JavaScript编程语言中,`instanceof` 和 `typeof` 是两个非常重要的操作符,用于判断变量的类型。它们各自有着不同的用途和用法,对于理解和调试代码至关重要。 首先,我们来详细了解一下`instanceof`操作符。`...

    基于javascript中的typeof和类型判断(详解)

    `typeof`能够区分JavaScript中的原始类型,包括`Undefined`、`Null`、`Boolean`、`Number`和`String`。然而,当遇到引用类型时,`typeof`会统一返回`object`,因此无法直接判断对象具体是什么类型,比如数组、日期等...

    一个更明确的typeof改善

    通过学习和应用这些代码,开发者可以提高他们代码的健壮性和类型检查的准确性,避免因类型错误导致的程序问题。 总的来说,JavaScript中的类型检查是一个关键的实践领域,尤其是在大型复杂项目中。通过更明确的类型...

    【JavaScript源代码】一篇文章弄懂js中的typeof用法.docx

    2. **布尔值(boolean)**:布尔值`true`和`false`使用`typeof`也会返回`"boolean"`。同样,`Boolean()`构造函数的结果也是如此。 3. **数字(number)**:包括普通数字、`NaN`和`Infinity`,`typeof`返回`"number...

    js中typeof的用法汇总

    `typeof`对于数组和空对象引用都返回"object",这可能会导致误解。如果你需要判断一个值是否为数组,应使用`Array.isArray()`: ```javascript Array.isArray([]); // true typeof []; // "object" ``` 6. ...

    js代码-typeof的用法

    `typeof`的使用不仅有助于防止类型错误,还能帮助我们在编写动态类型的JavaScript代码时更好地理解和控制数据。以下是关于`typeof`用法的详细说明: 1. **基本类型检查** - `typeof`对于原始类型(如`undefined`、...

    JavaScript类型检测之typeof 和 instanceof 的缺陷与优化

    对于数据类型的判断,JavaScript提供了typeof和instanceof两个操作符。这两个操作符是检测数据类型的常用方法,但它们各自存在一定的局限性。本文将通过分析这两个操作符的使用场景与局限性,探讨如何进行优化,以...

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

    在JavaScript中,`typeof`和`instanceof`是两种常用的类型检查操作符,它们在处理数据类型时扮演着重要角色。然而,它们各有其特点和局限性,理解这些差异对于编写健壮的代码至关重要。 首先,`typeof`操作符是一个...

    js代码-class A, typeof() 输出 function

    接下来,我们将深入探讨`class`和`typeof`在JavaScript中的具体表现和背后的原理。 首先,让我们了解`class`关键字。在JavaScript中,`class`主要用于定义类,它本质上还是基于函数的构造器。类定义了一个对象的...

    js核心基础之构造函数constructor用法实例分析

    当我们使用`typeof`操作符检查`Object`时,返回的结果是`"function"`,这是因为`Object`是一个构造函数。类似的,像`Array`这样的其他内置类型也是构造函数。 6. **学习资源** 深入理解JavaScript的构造函数和...

Global site tag (gtag.js) - Google Analytics