值类型转换
强制类型转换一般可分为两种形式:
- 一种是通过运算符强制类型转换。
- 另一种是通过类型转换方法来进行转换。
例如
var a = '11';
var b = a - 0; // 通过运算符转换类型
var c = Number(a); // 通过方法转换类型
1
2
3
2
3
抽象值操作
- 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
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
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
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
2
3
4
5
4.显示强制类型转换
- 一元运算符
日期显示转换为数字:
var d = new Date( "Mon, 18 Aug 2014 08:53:06 CDT" );
+d; // 1408369986000
1
2
2
获取时间戳方法
var timestamp = new Date().getTime();
var timestamp = Date.now();
var timestamp = +new Date(); // 缺点就是代码可读性不高。不建议对日期类型使用强制类型转换
1
2
3
4
2
3
4
- 字位截除
~~来截除数字值的小数部分。但是他与和 Math.floor(..)是有区别的
Math.floor( -49.6 ); // -50 它是向下取整
~~-49.6; // -49 // 这个是直接截取.后面的
1
2
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
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
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
2
3
4
5
6