ecma-262规范对JavaScript的类型描述:
- 未定义 一个顶级属性,保存了未定义的值;仅有一个值
undefined
(关键字) 也是一个原始值 - 空值 一个特殊的关键字,代表空值;仅有一个值
null
也是一个原始值 - 布尔值 有两个值,称为 true 和 false
- 字符串 字符串类型是所有有限的零个或多个16位无符号整数值(“元素”)的有序序列.空字符串长度为零.用非负数值索引这些位置.第一个元素在位置0,下一个元素在位置1,依此类推。
- 数值 数值类型采用的是IEEE-754 的64位双精度数值格式,其中特殊的值
NaN :表示算术表达式返回非数字值的特殊值,NaN 不与任何值相等,包括其本身.
+Infinity :正无穷
-Infinity :负无穷
+0 :正零,这是由于双精度数值格式造成的
-0 :负零,这是由于双精度数值格式造成的 - 对象 对象是未排序是属性容器。每个属性由名字、值和一个特征 的集合组成.
- 引用 内部 引用类型不是语言的数据类型. 引用 的值仅被用于表达式求值的中间值,且不能被对象的属性存储
引用 是到对象的属性的引用, - 列表 内部 列表类型不是语言的数据类型. 列表 的值仅被用于表达式求值的中间值,且不能被对象的属性存储
列表类型被用于解释参数列表的求值,列表类的值是简单的已排序值的序列 - 完结 内部 完结类型不是语言的数据类型. 完结 的值仅被用于表达式求值的中间值,且不能被对象的属性存储
完结类型被用于解释非本地控制调度的语句的行为
用mozilla.org网站对JavaScript类型的描述,看上去会更容易理解些.
值类型: 包括未定义 空值 布尔值 字符串 数值
非值型: 当然除了值类型就都是非值类型了,不过对于ecma-262规范的定义方法,6-9的定义看上去有些陌生,让我们用不陌生的方式来做个明确的非值型列表:
- 通用对象 Object
- 数组 Array
- 函数 Function
- 日期和时间 Date
- 数学库 Math
- 正则表达式 RegExp
如果对应ecma-262规范的定义方法,这些都属于,对象(6,Object这个词被用了两次,会不会造成认识上的混乱呀),而我们要明白 Date,Math,RegExp 更像是库 ,也就是说是让我们直接使用的 库 对象 ,
值类型 和非值型 的典型区别就是:
- 定义一个变量 ,它的右侧(值)是一个
值类型 那么你将得到一份拷贝 ,JavaScript 引擎为变量分配了一个新的内存空间,并且复制右侧的值.
非值型 那么你将得到一份引用 ,JavaScript 引擎为变量分配了一个引用,指向右侧的值.
非值型都是引用 要明白变量赋值后,就变成对象 了.那么下面的描述就要针对对象 了,
也就是说所谓的定义变量 就是定义对象 然后指向这个对象.
至于值类型 JavaScript 内部实现是否是"引用",我们已经不关心了.在我们使用的立场上不是引用. - 改变一个对象 ,如果这个对象是一个
值类型 那么这个对象的值会被改变,其他的对象值不受影响
非值型 那么这个对象的值会被改变,其他的对象值不受影响 - 无法对 值类型赋予新的可变 对象(成员) 例如 :注意我说的是可变
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测试过
- 改变一个对象的 对象(成员) ,如果这个对象是一个:
值类型 不生效,原因见前面的第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 有多个含义(其实没有必要这么抠概念)
- 在我们描述一个对象时用于说明此对象的类型是函数
- 是一个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不是函数,是一组数学函数的对象集合