1、值类型转换
将值从一种类型转换为另一种类型通常称为类型转换(type casting),这是显式的情况;隐 式的情况称为强制类型转换(coercion)。
也可以这样区分:类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时(runtime)。
“隐式强制类型 转换”(implicit coercion)和“显式强制类型转换”的区别:我们能够从代码中看出哪些地方是显式强制类型转换,而隐式强制 类型转换则不那么明显,通常是某些操作产生的副作用。
例如:
var a = 42; // number
var b = a + ""; // 隐式强制类型转换 string
var c = String( a ); // 显式强制类型转换 string
首先变量b强制类型是隐式的," + "运算符的其中一个操作数是字符串,所以在此是字符串拼接,结果是数字42被强制转换为字符串的42;
变量c则是通过String显示的将a强制转换为字符串;
2、抽象值操作
ToString、ToNumber 和 ToBoolean
2.1、ToString
ToString负责处理非字符串到字符串的强制类型转换
数组的默认 toString() 方法经过了重新定义,将所有单元字符串化以后再用 "," 连接起 来:
var a = [1,2,3];
a.toString(); // "1,2,3"
toString() 可以被显式调用,或者在需要字符串化时自动调用。
对大多数简单值来说,JSON 字符串化和 toString() 的效果基本相同,只不过序列化的结 果总是字符串:
JSON.stringify( 42 ); // "42"
JSON.stringify( "42" ); // ""42"" (含有双引号的字符串)
JSON.stringify( null ); // "null"
JSON.stringify( true ); // "true"
JSON.stringify(..) 在对象中遇到 undefined、function 和 symbol 时会自动将其忽略,在 数组中则会返回 null(以保证单元位置不变)。
例如:
JSON.stringify( undefined ); // undefined
JSON.stringify( function(){} ); // undefined
JSON.stringify( [1,undefined,function(){},4] ); // "[1,null,null,4]"
JSON.stringify( { a:2, b:function(){} } ); // "{"a":2}"
对包含循环引用的对象执行 JSON.stringify(..) 会出错。
toJSON() 应该“返回一个能够被字符串化的安全的 JSON 值”,而不是“返回 一个 JSON 字符串”。