`
achun
  • 浏览: 313782 次
  • 性别: Icon_minigender_1
  • 来自: 河南郑州
社区版块
存档分类
最新评论
阅读更多

ecma-262规范对JavaScript的类型描述:

  1. 未定义 一个顶级属性,保存了未定义的值;仅有一个值undefined (关键字) 也是一个原始值
  2. 空值 一个特殊的关键字,代表空值;仅有一个值null 也是一个原始值
  3. 布尔值 有两个值,称为 truefalse
  4. 字符串 字符串类型是所有有限的零个或多个16位无符号整数值(“元素”)的有序序列.空字符串长度为零.用非负数值索引这些位置.第一个元素在位置0,下一个元素在位置1,依此类推。
  5. 数值 数值类型采用的是IEEE-754 的64位双精度数值格式,其中特殊的值
    NaN :表示算术表达式返回非数字值的特殊值,NaN 不与任何值相等,包括其本身.
    +Infinity :正无穷
    -Infinity :负无穷
    +0 :正零,这是由于双精度数值格式造成的
    -0 :负零,这是由于双精度数值格式造成的
  6. 对象 对象是未排序是属性容器。每个属性由名字、值和一个特征 的集合组成.
  7. 引用 内部 引用类型不是语言的数据类型. 引用 的值仅被用于表达式求值的中间值,且不能被对象的属性存储
    引用 是到对象的属性的引用,
  8. 列表 内部 列表类型不是语言的数据类型. 列表 的值仅被用于表达式求值的中间值,且不能被对象的属性存储
    列表类型被用于解释参数列表的求值,列表类的值是简单的已排序值的序列
  9. 完结 内部 完结类型不是语言的数据类型. 完结 的值仅被用于表达式求值的中间值,且不能被对象的属性存储
    完结类型被用于解释非本地控制调度的语句的行为

用mozilla.org网站对JavaScript类型的描述,看上去会更容易理解些.

值类型: 包括未定义 空值 布尔值 字符串 数值

非值型: 当然除了值类型就都是非值类型了,不过对于ecma-262规范的定义方法,6-9的定义看上去有些陌生,让我们用不陌生的方式来做个明确的非值型列表:

  1. 通用对象 Object
  2. 数组 Array
  3. 函数 Function
  4. 日期和时间 Date
  5. 数学库 Math
  6. 正则表达式 RegExp

如果对应ecma-262规范的定义方法,这些都属于,对象(6,Object这个词被用了两次,会不会造成认识上的混乱呀),而我们要明白 Date,Math,RegExp 更像是 ,也就是说是让我们直接使用的 对象 ,

值类型非值型 的典型区别就是:

  1. 定义一个变量 ,它的右侧(值)是一个
    值类型 那么你将得到一份拷贝 ,JavaScript 引擎为变量分配了一个新的内存空间,并且复制右侧的值.
    非值型
    那么你将得到一份引用 ,JavaScript 引擎为变量分配了一个引用,指向右侧的值.
    非值型都是引用
    要明白变量赋值后,就变成对象 了.那么下面的描述就要针对对象 了,
    也就是说所谓的定义变量 就是定义对象 然后指向这个对象.
    至于值类型 JavaScript 内部实现是否是"引用",我们已经不关心了.在我们使用的立场上不是引用.
  2. 改变一个对象 ,如果这个对象是一个
    值类型
    那么这个对象的值会被改变,其他的对象值不受影响
    非值型
    那么这个对象的值会被改变,其他的对象值不受影响
  3. 无法对 值类型赋予新的可变 对象(成员) 例如 :注意我说的是可变
    var str='string';
    str.foo='new string';//这一句是不能生效的
     就算这样也不行:
    String.prototype.foo='newstring';
    var str='string';
    alert(str.foo);//提示newstring
    str.foo='foo';
    alert(str.foo);//仍然提示newstring,IE,FireFox测试过
    
    String.prototype.foo=function(){return 'newstring';};
    var str='string';
    alert(str.foo());//提示newstring
    str.foo=function(){return 'newfoo';};
    alert(str.foo());//仍然提示newstring,IE,FireFox测试过
    
     
  4. 改变一个对象的 对象(成员) ,如果这个对象是一个:
    值类型 不生效,原因见前面的第3点
    非值型
    那么所有和这个对象同样引用的对象的此成员值会被改变(这一句有问题,不适用于固有对象,我想找到一个正确的一句话描述 )
    var o1={m1:3,m2:{m22:4}};
    var o2=o1;
    o2.m1=4;
    o2.m2=4;
    alert(o1.m1);//4
    alert(o1.m2);//4
    var o1={m1:3,m2:{m22:4}};
    var o2=o1;
    o1.m1=4;
    o1.m2=4;
    alert(o2.m1);//4
    alert(o2.m2);//4
     

function :一等公民(first-class),注意function !=Function

这些概念描述起来就是那么的绕嘴,前面已经说了Function 是一种类型,那function 呢?function 是个关键字,可以定义Function 这种类型的对象,Function 是类型当然不能定义一个对象了.

function func(){}//创建一个Function类型的对象func
Function func(){}//当然错误了
func=new Function;//创建一个对象func,它的是由Function构造的

由Function构造?对:

alert(typeof Function);//function

Function是一个JavaScript内建函数,这个函数可以构造函数类型的对象 ,

这里的词汇 Function 有多个含义(其实没有必要这么抠概念)

  1. 在我们描述一个对象时用于说明此对象的类型是函数
  2. 是一个JavaScript内建对象,它可以构造函数类型的对象,它的类型是函数

大家不都是说new关键字是来构造一个新的对象的么?前面不是有个new么?

//不用new也可以
var func=Function();
var func=Function('return 1;');
alert(func());//1

 原来只有函数能构建对象 ,当然 为了书写的方便 JavaScript也提供了其他的便捷定义方式

var obj={};//便捷方式
var obj=Object();
var obj={foo:3};//便捷方式
var obj=Object({foo:3});

 同理,Array,Date,RegExp,都是JavaScript内建函数,Math不是函数,是一组数学函数的对象集合

分享到:
评论

相关推荐

    运行时类型信息RTTI及类型转换

    `type_info`类包含了关于类型的元数据,如类型名称。当`typeid`应用于非空指针或引用且对象属于多态类时,它会返回实际对象的动态类型,这是通过查询对象的虚函数表实现的。如果操作数是空指针,`typeid`会抛出`bad_...

    C++运行时类型信息揭密

    当开发者使用`typeid`运算符时,它会返回一个`typeinfo`对象,该对象包含了关于类型的信息,包括类型的名称和一个唯一标识符。这些信息在运行时可用,这对于实现多态性和类型安全的转换至关重要。 - **`typeid`...

    python 学习中关于动态类型静态类型强类型弱类型的问题.docx

    ### Python学习中关于动态类型、静态类型、强类型与弱类型的问题 #### 动态类型与静态类型 在计算机编程领域,动态类型和静态类型是两种重要的类型系统分类方式。 **动态类型**(Dynamic Typing)指的是在程序...

    惯有类型推导的幻灯片

    在更复杂的类型系统中,类型可以包括布尔类型(bool)、整数类型(int)、浮点数类型(float)等。 6. 文档还可能包含λ-演算的实例化(instantiation)和连接(connection)的概念。在类型推导中,实例化是将泛型类型...

    C++ 函数重载 运算符重载 类型转化

    以下是一些关于类型转化的例子: ```cpp int i = 5; double d = i; // 隐式类型转化 int j = static_cast(d + 0.5); // 显式类型转化,避免丢失小数部分 ``` 总的来说,C++的函数重载、运算符重载和类型转化是...

    关于值类型与列类型不匹配,所需类型是 DataRow的解决方案

    ### 关于值类型与列类型不匹配,所需类型是 DataRow 的解决方案 在处理数据库查询结果时,经常需要将 `SqlDataReader` 对象转换为 `DataTable` 对象以便于进一步的数据处理或展示。然而,在实现这一过程时可能会...

    浅析JavaScript中的类型和对象

    JavaScript是基于对象的,任何元素都可以看成对象。...以下是一些关于类型和对象的例子,大家看完例子后可能更容易理解类型和对象之间的联系:   例子代码 说明 1 Object.prototype.Property =

    编程语言java类型转换.pdf

    文档中提供了一些关于类型转换的示例代码: ```java int i = 121; Vector<Integer> v = new Vector(); v.add(new Integer(i)); ``` 这段代码演示了如何将基本数据类型int转换为包装类Integer,并添加到Vector集合中...

    19第19章 类型继承.pdf

    通过上述内容,我们可以了解到文档是关于类型继承的介绍,其中涵盖了面向对象编程和数据库设计中类型继承的具体应用,以及在具体编程语言实现中的技术细节。这些内容对于理解继承关系、设计有效的数据库结构和编写...

    类型声明翻译成自然语言源程序

    在提供的文档"Cdecl——C类型声明翻译成自然语言.docx"中,你可以找到更多关于类型声明翻译的具体例子和练习,进一步提升这方面的能力。这个文档将详细解释各种复杂的类型声明情况,帮助你更好地应对实际工作和面试...

    Python-EnforcePython35强制运行时类型检查

    此外,理解PEP 484中关于类型注解的规则也是必不可少的,这将帮助你更好地利用Enforce进行类型检查。 总之,"Python-EnforcePython35强制运行时类型检查"是一个旨在提高Python代码质量的工具,通过在运行时检查类型...

    强制类型转换说明_LabVIEW中关于强制类型转换的使用_labview中tcp_

    在LabVIEW编程环境中,强制类型转换是至关重要的一个环节,特别是在涉及到数据通信,如TCP/IP通信时。本文将深入探讨LabVIEW中强制类型转换的概念、使用场景以及具体操作方法。 LabVIEW是一种图形化编程语言,它的...

    java8集合源码-type-classes-example:一个关于类型班的小型学习项目,入门级别是“初学者”

    一个关于类型类的小型学习项目,入门级别是“初学者”。 使用示例 只需克隆项目: git clone git@github.com:dnvriend/type-classes-example.git 进入目录并启动sbt。 启动测试 要启动测试: sbt test 启动 REPL 要...

    轻松学C之运行时类型标识反射PPT学习教案.pptx

    3. **typeof运算符**:`typeof`运算符用于获取类型对象,即`System.Type`实例,提供了关于类型的各种信息。例如,`typeof(MyType)`将返回一个表示`MyType`类型的`Type`对象,你可以通过这个对象访问到类型的全名、...

    Python类型和对象(20210930180213).pdf

    总结来说,文档覆盖了Python编程语言中关于类型、对象、元类、属性和方法的深刻知识。强调了新式类和内置类型的继承关系,对象的属性、方法及其内存表示。它还涵盖了Python类型系统的演变,并为对Python内部工作感...

    轻松学C之运行时类型标识反射学习资料PPT学习教案.pptx

    - `typeof`运算符用于获取给定类型对应的`System.Type`对象,它包含了关于类型的所有元数据信息。`System.Type`对象可以用来获取类型名、检查是否为类等: ```csharp Type t = typeof(MyClass); Console....

    JAVA数据类型与Hibernate的类型映射

    关于工具的使用,Hibernate提供了hibernate.cfg.xml配置文件或基于Java的配置方式来设置数据库连接参数、实体类扫描路径等。同时,它还提供了SessionFactory、Session、Transaction等接口,供开发者进行数据库操作。...

    Java中数据类型和MYSQL中数据类型的对比

    Java 和 MySQL 数据类型之间的对比是理解数据库操作和应用程序开发中数据处理的关键。这两种语言的数据类型在功能和使用上都有所不同,尽管它们都用于存储和处理数据,但各自有着特定的适用场景和特点。 首先,Java...

    SAP移动类型详细说明

    **移动类型121** 用于处理分包订单的后续调整,特别是关于组件消耗的修正。这是一种自动触发的过程,无法手动输入。 1. **用途**:用于纠正分包订单中组件的消耗情况,确保库存记录准确无误。 2. **操作**:通过...

    SAP的标准移动类型说明

    以下是关于标题和描述中提及的一些标准移动类型的详细说明: 101 - 货物收据针对采购订单或订单 这个移动类型用于当物料到达仓库时记录入库。如果采购订单或订单尚未与会计科目关联,可以在收货时指定库存类型,如...

Global site tag (gtag.js) - Google Analytics