一、元类型系统与对象类型系统。
1、元类型系统:undefined、boolean、number、string、function、object
2、对象类型系统: 元类型的 object 中的一个分支
3、 在元数据经过“包装类”包 装后得到的对象,与原来的元数据并不再是同一数据,只是二者的值相等而已。
4、 Boolean、Number、String分别是boolean、number、string的包装类。
二、显式包装:
var v1 = 100, v2 = 'hello, world!', v3 = true;// 使用构造器的显式包装alert( Number(v1) );alert( String (v2) );alert( Boolean(v3) );等价形式:// 使用Object() 的显式包装alert( Object (v1) );alert( Object (v2) );alert( Object (v3) );
三、隐式包装:"包装"行为发生在存取行为过程中。
var data = 100;alert(data instanceof Number); //false,instanceof 运算不对原数据进行"包装"//alert('constructor' in data); // 异常, 不能对元数据做 in 运算//"包装"行为发生在存取行为过程中data.constructor = Number; //成员存取运算时alert(data['constructor']); //function Number() { [native code] }//data.toString = function () { } data.toString(); //方法调用, 其实是成员存储后的函数调用运算alert(data.toString); //function toString() { [native code] }//做delete 运算时alert(delete data.toString); //true
四、值类型之间的转换。
1、 undefined 能转换为特殊数字值 NaN、 字符串 'undefined' 与布尔值 false 。
// 示例: undefined 的转换var value = undefined;// 显示NaNalert(10 + value);if (!value) { alert('' + value); //undefined}
2、number的转换:
1) 任何值都可以被转换到 number 类型的值。如果转换得不到一个有效的数 值,那么结果会是一个 NaN 。而 NaN 其实是一个可以参与数值运算的值,这 样处理的目的,是使得表达式可以尽量求值,而不是弹出一个异常。
2)N umber 值转换到布尔值时,非零值都转为 true ,零与 NaN 都转为 false 。
Number. NEGATIVE_INFINITY :比 (-Number.MAX_VALUE) 更小的值
Number. POSITIVE_INFINITY :比 (Number.MAX_VALUE) 更大的值
Number. MIN_VALUE :最接近零的正数值
Number. MAX_VALUE :最大的正数值
Global.Infinity : Number. POSITIVE_INFINITY 的初始值
3) Number 值在转换到字符串时有极其复杂的内部规则。因此除非使用显式 转换 ,否则很难保证 Number 到 字符串这一转换的输出格式。
Number. NEGATIVE_INFINITY :转换为 '-Infinity'
Number. POSITIVE_INFINITY :转换为 'Infinity'
Global.Infinity :转换为 'Infinity'
Global.NaN :转换为 'NaN'
除此之外,其它数值都能被转换为一个有数值含义的字符串,例如 '5e-324 ' 。
3、 boolean 值的转换:
1) true 和 false 总是被转换为数值 1 和 0 。
2) boolean 值的 true 和 false 总是被转换为字符串的 "true" 和 "false" 。
var checked = true;var i = false; if (checked) { i++;}alert(i); //1var i = false;i += checked;//或者是i += !!checked;alert(i); //1alert(true + false); //1
4、string的转换:
1)在字符串中,有且仅有空字符串 能被转换为布尔值 false ,其它的(任何有值的)字符串在转换后都会得到 true。
2)示例:
alert('0022' - 1); // 显示21alert('00.22' * 10); // 显示2.2 alert('.22' * '100.'); // 显示2.2/*** 例1* 前缀0 可以用在直接量中,以表示8进制* 结果值输出: 12*/alert(033 - 15);/*** 例2* 前缀0 用在字符串中,在(隐式)转换将被忽略* 结果值输出:18*/alert('033' - 15);
五、parseInt( ) 与 parseFloat( )
1) parseInt() 支持传入一个值在 2~36 (0-9,A-Z|a-z) 之间的“ radix ”参数来指定所使用的进 制。语法如下:
parseInt(aString,[radix])
2) 调用 parseInt() 时,如果转换不能成功,则返回 NaN 。如果 radix 为 16 ,无论 aString 是否有前缀“ 0x ”,该字符串都将按 16 进制处理;如果 radix 为 8 ,无论 aString 是否有前缀“ 0 ”,则该字符串都将按8 进制处理。
如果不指定 radix ,那么将采用数值直接量声明中使用的规则:将有前缀 “ 0x ”的处理成 16 进制字符串,有前缀“ 0 ”的处理为 8 进制字符串。
//前缀“0”在隐式转换中不被识别为 8 进制字符串alert( parseInt('033' - 15) ); //18 alert( parseInt('033') - 15 ); //12alert( parseInt(033 - 15) ); //12alert( 033 - 15); //123) parseInt() 和 parseFloa t() 另一项特性在于总是尽可能地得到转换结果。即使 字符串中只有 ( 前缀的 ) 部分能被转换,那么该转换也将成功进行。有些时候这 项特性很好用,例如在 WEB 开发中我们遇到 CSS 的属性值带单位 (pt/px 等 ) 时,我们可以简单地用 parseFloa t() 去清除它,以方便参与其它的运算。
示例1:
示例2:
var v = '4F';//忘了传入 radix 参数(或增加“ 0x”前缀)alert(parseInt(v)); //4
六、valueOf( )
1、 当一个引 用类型(例如对象)参与值运算时,会先调用它的 valueOf( ) 方法取值。
2、 如果数据是值类型,则直接参与值运算;否则, 如果 valueOf ( ) 返回一个值类型数据,则以该数据参与值运算;否则, 使用 toString( ) 返回的字符串参与运算。
/*** 示例: 重写String 对象的valueOf()和toString() 对隐式转换的影响*/String.prototype.valueOf = function() { return this; // this 对象是一个引用}String.prototype.toString = function() { return 'hi, ';}// 显示结果值为 hi, world.'var str = new String('hello, ');alert(str + 'world.');