数据类型的转换
强制转换
强制转换主要指使用Number() 、String() 和Boolean() 三个函数,手动将各种类型的值,分别转换成数字、字符串或者布尔值。
Number()
(1)原始类型值
原始类型值的转换规则如下。
Number(324)
Number('324')
Number('324abc')
Number('')
Number(true)
Number(false)
Number(undefined)
Number(null)
Number 函数将字符串转为数值,要比parseInt 函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN 。
(2)对象
简单的规则是,Number 方法的参数是对象时,将返回NaN ,除非是包含单个数值的数组。
Number({a: 1}) // NaN
Number([1, 2, 3]) // NaN
Number([5]) // 5
String()
String 函数可以将任意类型的值转化成字符串,转换规则如下。
(1)原始类型值
- 数值:转为相应的字符串。
- 字符串:转换后还是原来的值。
- 布尔值:
true 转为字符串"true" ,false 转为字符串"false" 。 - undefined:转为字符串
"undefined" 。 - null:转为字符串
"null" 。
String(123)
String('abc')
String(true)
String(undefined)
String(null)
(2)对象
String 方法的参数如果是对象,返回一个类型字符串;如果是数组,返回该数组的字符串形式。
String({a: 1}) // "[object Object]"
String([1, 2, 3]) // "1,2,3"
Boolean()
Boolean() 函数可以将任意类型的值转为布尔值。
它的转换规则相对简单:除了以下五个值的转换结果为false ,其他的值全部为true 。
undefined null 0 (包含-0 和+0 )NaN '' (空字符串)
Boolean(undefined)
Boolean(null)
Boolean(0)
Boolean(NaN)
Boolean('')
当然,true 和false 这两个布尔值不会发生变化。
Boolean(true)
Boolean(false)
注意,所有对象(包括空对象)的转换结果都是true ,甚至连false 对应的布尔对象new Boolean(false) 也是true (详见《原始类型值的包装对象》一章)。
Boolean({})
Boolean([])
Boolean(new Boolean(false))
所有对象的布尔值都是true ,这是因为 JavaScript 语言设计的时候,出于性能的考虑,如果对象需要计算才能得到布尔值,对于obj1 && obj2 这样的场景,可能会需要较多的计算。为了保证性能,就统一规定,对象的布尔值为true 。
自动转换
遇到以下三种情况时,JavaScript 会自动转换数据类型,即转换是自动完成的,用户不可见。
第一种情况,不同类型的数据互相运算。
123 + 'abc' // "123abc"
第二种情况,对非布尔值类型的数据求布尔值。
if ('abc') {
console.log('hello')
} // "hello"
第三种情况,对非数值类型的值使用一元运算符(即+ 和- )。
+ {foo: 'bar'} // NaN
- [1, 2, 3] // NaN
错误处理机制
try…catch 结构
一旦发生错误,程序就中止执行了。JavaScript 提供了try...catch 结构,允许对错误进行处理,选择是否往下执行。
try {
throw new Error('出错了!');
} catch (e) {
console.log(e.name + ": " + e.message);
console.log(e.stack);
}
上面代码中,try 代码块抛出错误(上例用的是throw 语句),JavaScript 引擎就立即把代码的执行,转到catch 代码块,或者说错误被catch 代码块捕获了。catch 接受一个参数,表示try 代码块抛出的值。
如果你不确定某些代码是否会报错,就可以把它们放在try...catch 代码块之中,便于进一步对错误进行处理。
try {
f();
} catch(e) {
}
上面代码中,如果函数f 执行报错,就会进行catch 代码块,接着对错误进行处理。
catch 代码块捕获错误之后,程序不会中断,会按照正常流程继续执行下去。
try {
throw "出错了";
} catch (e) {
console.log(111);
}
console.log(222);
上面代码中,try 代码块抛出的错误,被catch 代码块捕获后,程序会继续向下执行。
catch 代码块之中,还可以再抛出错误,甚至使用嵌套的try...catch 结构。
有待完善…
编程风格
区块起首的大括号的位置,有许多不同的写法。最流行的有两种,一种是起首的大括号另起一行。
block
{
// ...
}
另一种是起首的大括号跟在关键字的后面。
block {
// ...
}
一般来说,这两种写法都可以接受。但是,JavaScript 要使用后一种,因为 JavaScript 会自动添加句末的分号,导致一些难以察觉的错误。
return
{
key: value
};
// 相当于
return;
{
key: value
};
上面的代码的原意,是要返回一个对象,但实际上返回的是undefined ,因为 JavaScript 自动在return 语句后面添加了分号。为了避免这一类错误,需要写成下面这样。
return {
key : value
};
因此,表示区块起首的大括号,不要另起一行。
console 对象与控制台
1.console 对象
console 的常见用途有两个。
- 调试程序,显示网页代码运行时的错误信息。
- 提供了一个命令行接口,用来与网页代码互动。
2.console 对象的静态方法
2.1 console.log(),console,info(), console.debug(),
如果第一个参数是格式字符串(使用了格式占位符),console.log 方法将依次用后面的参数替换占位符,然后再进行输出。
console.log(' %s + %s = %s', 1, 1, 2)
// 1 + 1 = 2
上面代码中,console.log 方法的第一个参数有三个占位符(%s ),第二、三、四个参数会在显示时,依次替换掉这个三个占位符。
console.log 方法支持以下占位符,不同类型的数据必须使用对应的占位符。
%s 字符串%d 整数%i 整数%f 浮点数%o 对象的链接%c CSS 格式字符串
如果参数是一个对象,console.log 会显示该对象的值。
console.log({foo: 'bar'})
// Object {foo: "bar"}
**console.info **是console.log 方法的别名,用法完全一样。只不过console.info 方法会在输出信息的前面,加上一个蓝色图标。
console.debug 方法与console.log 方法类似,会在控制台输出调试信息。但是,默认情况下,console.debug 输出的信息不会显示,只有在打开显示级别在verbose 的情况下,才会显示。
2.2 console.warn(), console.error()
warn 方法和error 方法也是在控制台输出信息,它们与log 方法的不同之处在于,warn 方法输出信息时,在最前面加一个黄色三角,表示警告;error 方法输出信息时,在最前面加一个红色的叉,表示出错。同时,还会高亮显示输出文字和错误发生的堆栈。其他方面都一样。
2.3 console,table
对于某些复合类型的数据,console.table 方法可以将其转为表格显示。
var languages = [
{ name: "JavaScript", fileExtension: ".js" },
{ name: "TypeScript", fileExtension: ".ts" },
{ name: "CoffeeScript", fileExtension: ".coffee" }
];
console.table(languages);
上面代码的language 变量,转为表格显示如下。
(index) | name | fileExtension |
---|
0 | “JavaScript” | “.js” | 1 | “TypeScript” | “.ts” | 2 | “CoffeeScript” | “.coffee” |
下面是显示表格内容的例子。
var languages = {
csharp: { name: "C#", paradigm: "object-oriented" },
fsharp: { name: "F#", paradigm: "functional" }
};
console.table(languages);
上面代码的language ,转为表格显示如下。
(index) | name | paradigm |
---|
csharp | “C#” | “object-oriented” | fsharp | “F#” | “functional” |
2.4 console.count()
count 方法用于计数,输出它被调用了多少次。
function greet(user) {
console.count();
return 'hi ' + user;
}
greet('bob')
greet('alice')
greet('bob')
上面代码每次调用greet 函数,内部的console.count 方法就输出执行次数。
该方法可以接受一个字符串作为参数,作为标签,对执行次数进行分类。
function greet(user) {
console.count(user);
return "hi " + user;
}
greet('bob')
greet('alice')
greet('bob')
上面代码根据参数的不同,显示bob 执行了两次,alice 执行了一次。
2.5 console,dir(),console.dirxml()
dir 方法用来对一个对象进行检查(inspect),并以易于阅读和打印的格式显示。
console.log({f1: 'foo', f2: 'bar'})
console.dir({f1: 'foo', f2: 'bar'})
上面代码显示dir 方法的输出结果,比log 方法更易读,信息也更丰富。
2.6 console.time(),console,timeEnd()
这两个方法用于计时,可以算出一个操作所花费的准确时间。
console.time('Array initialize');
var array= new Array(1000000);
for (var i = array.length - 1; i >= 0; i--) {
array[i] = new Object();
};
console.timeEnd('Array initialize');
time 方法表示计时开始,timeEnd 方法表示计时结束。它们的参数是计时器的名称。调用timeEnd 方法之后,控制台会显示“计时器名称: 所耗费的时间”。
有待完善
|