关于类型

本文详细解析了ECMA-262规范中定义的JavaScript基本类型,包括未定义、空值、布尔值、字符串和数值等,并介绍了非值类型的特性,如对象、数组、函数等的区别与使用方法。

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

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不是函数,是一组数学函数的对象集合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值