本篇文章总结自阮一峰的教程 JavaScript教程第二章运算符。
加法的不同类型运算规则?
- 两个number类型: 用来求两个数值的和
- 非数值的相加,如数值与布尔值 或 两个布尔值相加,会自动转成数值,然后再相加
- 两个字符串相加: 加法运算符会变成连接运算符,返回一个新的字符串,将两个原字符串连接在一起
- 一个运算子是字符串,另一个运算子是非字符串: 非字符串会转成字符串,再连接在一起
- 运算子是对象: 必须先转成原始类型的值,然后再相加。对象obj转成原始类型的值是[object Object]
注意:法运算符是在运行时决定,到底是执行相加,还是执行连接。
如,
'3' + 4 + 5 // "345"
3 + 4 + '5' // "75"
对象转成原始类型值的规则:
1、 自动调用对象的valueOf方法。
var obj = { p: 1 };
obj.valueOf() // { p: 1 }
2、 再调用对象的toString方法
obj.valueOf().toString() // "[object Object]"
对象的toString方法默认返回[object Object]
数值运算符的作用?
- 可以将任何值转为数值(与Number函数的作用相同)
+true // 1
+[] // 0
+{} // NaN
取反运算符(!)的转化规则?
以下六个值转化为布尔值为false,取反后为true,其他值取反后都为false。
- undefined
- null
- false
- 0
- NaN
- 空字符串('')
&& 和 || 运算符
- && 运算符的运算规则是:如果第一个运算子的布尔值为true,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为false,则直接返回第一个运算子的值,且不再对第二个运算子求值
- || 的运算规则是:如果第一个运算子的布尔值为true,则返回第一个运算子的值,且不再对第二个运算子求值;如果第一个运算子的布尔值为false,则返回第二个运算子的值
- 因为会跳过第二个运算子,也被称为“短路”运算,
- && 可以取代if结构
- || 常用于为一个变量设置默认值
if(x>1) {
doSomething();
}
// 等价于
x > 1 && doSomething();
var a = false || 6;
console.log(a); //返回的结果为 6
使用异或的小技巧
1、实现两个值的互换
a^=b; b^=a; a^=b;
连续对两个数a和b进行三次异或运算,可以对他们进行值的互换。
如:
var a = 10;
var b = 99;
a ^= b, b ^= a, a ^= b;
a // 99
b // 10
取整
12.9 ^ 0 // 12 向下取整
JS里有哪几种强制类型转换
- Number , Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN
- String
- Boolean
Number的转化规则?
- 调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。
- 如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。
- 如果toString方法返回的是对象,就报错。
var obj = {x: 1};
Number(obj) // NaN
// 等同于
if (typeof obj.valueOf() === 'object') {
Number(obj.toString());
} else {
Number(obj.valueOf());
}
String的转化规则?
原始类型值转化为相应的字符串,对象的转化规则与Number方法基本相同,只是互换了valueOf方法和toString方法的执行顺序:
- 先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
- 如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
- 如果valueOf方法返回的是对象,就报错。
什么时候会自动转换数据类型?
- 不同类型的数据互相运算
- 对非布尔值类型的数据求布尔值 , 例如用在if语句中作为判断时
- 对非数值类型的值使用一元运算符(即+和-)
原生错误类型?
- SyntaxError 对象: 解析代码时发生的语法错误
- ReferenceError对象: 引用一个不存在的变量时发生的错误
- RangeError对象:一个值超出有效范围时发生的错误
- TypeError对象: 变量或参数不是预期类型时发生的错误
- URIError对象: URI 相关函数的参数不正确时抛出的错误
- EvalError对象: eval函数没有被正确执行时 (该错误类型已经不再使用了)
网友评论