数据类型的转换
类型转换在开发中是非常常见的一种操作,特别是对于js这种动态类型预言,变量没有类型限制,编译时是无法百分百通过静态分析出一个变量的类型,有些数据类型只有在运行是才能。
强制转换
1、 Number()
:将值转成数字
- 空字符串转为0;
-
null
这种转为0
-
123abc
这种转为NaN
-
undefined
这种转为NaN
- 相较于
parseInt
,Number
会更加严格,只要有一个字符串不是数字,整个字符串都会被转成NaN
,而parseInt
会根据规则转换一部分可以转换的 - 对于对象,除了包含单个数值的数组,其他对象一律转换为
NaN
。对象的转换步骤如下:- 调用对象自身的
valueOf
方法。如果返回原始类型的值,则直接对该值使用Number
函数,不再进行后续步骤。 - 如果
valueOf
方法返回的还是对象,则改为调用对象自身的toString
方法。如果toString
方法返回原始类型的值,则对该值使用Number
函数,不再进行后续步骤。 - 如果
toString
方法返回的是对象,就报错
- 调用对象自身的
2、 String()
:将值转成字符串
- 数值转成相应的字符串
- 字符串还是原来的字符串
- 布尔值:
true => "true"
、false => "false"
- 特殊值:
undefined => "undefined"
、null => "null"
- 对象:与
Number
方法基本相同,只是互换了valueOf
方法和toString
方法的执行顺序- 先调用对象自身的
toString
方法。如果返回原始类型的值,则对该值使用String
函数,不再进行以下步骤。 - 如果
toString
方法返回的是对象,再调用原对象的valueOf
方法。如果valueOf
方法返回原始类型的值,则对该值使用String
函数,不再进行以下步骤。 - 如果
valueOf
方法返回的是对象,就报错。
- 先调用对象自身的
3、Boolean()
:将值转为布尔值
除了以下的五个值转化为 false
,其他的全部是 true
- undefined
- null
- 0
- NaN
- ''(空字符串)
4、自动转换
这里的自动转换都是以强制转换为基础,只是不需要手动去强转,js会帮你完成转换。
-
String()
不同类型的数据运算。123 + 'abc'
,自动转为字符串123abc
-
Boolean()
对非布尔值进行布尔求值。if ('abc')
,自动转为true
-
Number()
非数值类型使用数值运算符。+ {foo:'bar'} 、- [1,2,3]
,自动转为NaN
其他的一些类型的转换都是比较常见的转换,没什么特别之处,这里就不做记录了。
错误处理机制
程序员写出来的程序都是有bug,如何记录、分析这些bug呢,程序员建立了错误处理机制,在不同的语言上有不同的实现,但都大同小异,js中的错误对象是:Error
,Error
有以下几个属性:
- message:错误提示信息、错误描述
- name:错误名称(非标准属性)
- stack:错误堆栈(非标准信息)
但在实际开发中,程序员总会遇到各种各样的错误,一种错误类型往往满足不了这些描述,所以又派生出以下六种错误对象:
- SyntaxError:语法错误,解析代码时发生。编译时错误;
- ReferenceError:引用一个不存在的变量时发生的错误。运行时错误;
- RangeError:数组越界、Number方法超出范围、函数堆栈超过最大值。运行时错误;
- TypeError:对象是变量后参数不是预期类型时发生的错误。运行时错误;
- URIError:对象是 URI 相关函数的参数不正确时抛出的错误;
- EvalError:eval 函数没有被正确执行时,抛出的错误。该错误类型已废弃。
如果连上面的几种错误都满足不了你,你可以自定义错误:
// 定义
function UserError(message) {
this.message = message || '默认信息';
this.name = 'UserError';
}
UserError.prototype = new Error();
UserError.prototype.constructor = UserError;
// 使用
new UserError('这是自定义的错误!');
在使用错误对象时,都会用到 throw
和 try...catch...finally
,这个都是比较常规的用法,这里就不展开介绍了。看两个例子就行了
if (x <= 0) {
throw new Error('x 必须为正数');
}
// Uncaught ReferenceError: x is not defined
function cleansUp() {
try {
throw new Error('出错了……');
console.log('此行不会执行');
} finally {
console.log('完成清理工作');
}
}
编程风格
与其说是编程风格,不如上升点,说成是编程规范,譬如我们常挂在嘴边的谷歌编程规范,规范都是约定俗成的东西,没有什么必然性,所以你按照这么来就行。
- js中 tab 缩进为 2 个字符;
- 不要省略区块大括号;
- 圆括号使用规范。如果是函数,函数名与左括号之间没有空格;其他情况,语法元素与左括号都有一个空格;
- 行尾的分号,js是允许不写分号的,但作为一句话,最好是加上
- for、while、if、switch、try、函数声明可以没分号;
- do...while、函数表达式等需要加分号
- js的缺点就是全局变量对任何模块都是可读可写,所以一般全局变量使用大写字母表示。例如:UPPER_CASE;
- 因为有变量提升的特性,最好是将变量的声明放在最前面;
其他的都是一个开发者的习惯了,一切看个人。
console 对象与控制台
console的使用就没啥好讲的,用多了,就属性了。看https://wangdoc.com/javascript/features/console.html这篇文章就行了。
网友评论