强制类型转换

6/5/2018 javascript

值类型转换

强制类型转换一般可分为两种形式:

  • 一种是通过运算符强制类型转换。
  • 另一种是通过类型转换方法来进行转换。

例如

var a = '11';
var b = a - 0; // 通过运算符转换类型
var c = Number(a); // 通过方法转换类型
1
2
3

抽象值操作

  1. ToString
  • JSON字符串化(JSON.stringify())它并不是强制类型转化。

作用:可以用一句话描述就是将一个json对象解析成json字符串。

语法:

JSON.stringify(value[, replacer [, space]])

value: 将要序列化成一个JSON字符串的值

replacer(可选):如果该参数是一个数组,则只有包含这个数组中属性名才会被序列化到最终的JSON字符在传中;如果该参数是一个函数,则在该序列化中,被序列化的每个值都会经过该函数的处和转换。

space(可选):指定缩进用的空白字符串。如果参数是个数字,代表了多少个空格,上限是10.该值没有提供或者小于1,则是没有空格。如果是字符串,字符串将代替空格,上线也为10.

注意:

  • [x] 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
  • [x] 对于所有安全JSON值都可以使用JSON.stringify()字符串化。
  • [x] 不安全的JSON值:undefined、function、symbol和包含循环引用的对象都不符合JSON结构标准。
  • [x] JSON.stringify()在对象遇到undefined、function以及symbol时会自动将其忽略,在数组中将会返回null(保证单元位置不变)
  • [x] 如果传递给JSON.stringify()的对象中定义toJSON()方法,那么该方法会在字符串化前调用,以便将对象转换为安全的JSON值

不安全JSON示例:

JSON.stringify(undefined); // undefined
JSON.stringify(function(){}); // undefined
JSON.stringify([1,undefined,function(){},4]); // "[1,null,null,4]" 数组中返回null
JSON.stringify({ a:2, b:function(){}); // "{"a": 2}"  在对象中遇到会自动忽略
1
2
3
4

replcer参数示例:

var a = {
 b: 42,
 c: "42",
 d: [1,2,3]
};
JSON.stringify( a, ["b","c"] ); // "{"b":42,"c":"42"}"
JSON.stringify( a, function(k,v){
 if (k !== "c") return v;
} );
// "{"b":42,"d":[1,2,3]}"
1
2
3
4
5
6
7
8
9
10

space参数示例

JSON.stringify( a, null, 3 );
// "{
// "b": 42,
// "c": "42",
// "d": [
// 1,
// 2,
// 3
// ]
// }"
JSON.stringify( a, null, "-----" );
// "{
// -----"b": 42,
// -----"c": "42",
// -----"d": [
// ----------1,
// ----------2,
// ----------3
// -----]
// }"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

2.ToNumber(Number方法)

语法 Number(object)

作用: 把对象的值转换为数字

注意: 对象(包括数组)会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型 值,则再遵循以上规则将其强制转换为数字。如果 valueOf() 和 toString() 均不返回基本类型值,会产生 TypeError 错误。

变量 转化之后的值
true 1
false 0
undefined NAN
null 0
字符串 NAN

3.toBoolean

  • 假值列表:undefined、null、false、""、NAN、+0、-0
  • 真值列表:不在假值列表的都是true

例如

var a = [];
var b = {}; 
var c = function(){}; 
var d = Boolean( a && b && c );
d; // true []、{}、function(){}都为true
1
2
3
4
5

4.显示强制类型转换

  • 一元运算符

日期显示转换为数字:

var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" );
+d; // 1408369986000
1
2

获取时间戳方法

var timestamp = new Date().getTime();
var timestamp = Date.now();
var timestamp = +new Date(); // 缺点就是代码可读性不高。不建议对日期类型使用强制类型转换

1
2
3
4
  • 字位截除

~~来截除数字值的小数部分。但是他与和 Math.floor(..)是有区别的

Math.floor( -49.6 ); // -50 它是向下取整
~~-49.6; // -49 // 这个是直接截取.后面的
1
2

显示解析数字字符串

parseInt的坑:

var hour = parseInt( selectedHour.value );
var minute = parseInt( selectedMinute.value );
console.log(
 "The time you selected was: " + hour + ":" + minute
);
1
2
3
4
5

上面的代码看似没有问题,但是当小时为 08、分钟为 09 时,结果是 0:0,因为 8 和 9 都不 是有效的八进制数。

将第二个参数设置为 10,即可避免这个问题:

var hour = parseInt( selectedHour.value, 10 );
var minute = parseInt( selectedMiniute.value, 10 );

1
2
3

此外还有一些看起来奇怪但实际上解释得通的例子:

parseInt( 0.000008 ); // 0 ("0" 来自于 "0.000008")
parseInt( 0.0000008 ); // 8 ("8" 来自于 "8e-7")
parseInt( false, 16 ); // 250 ("fa" 来自于 "false")
parseInt( parseInt, 16 ); // 15 ("f" 来自于 "function..")
parseInt( "0x10" ); // 16
parseInt( "103", 2 ); // 2
1
2
3
4
5
6