回味JS(二)运算符及语法

2019-05-27  本文已影响0人  ArmorVon

本篇文章总结自阮一峰的教程 JavaScript教程第二章运算符。

加法的不同类型运算规则?

  1. 两个number类型: 用来求两个数值的和
  2. 非数值的相加,如数值与布尔值 或 两个布尔值相加,会自动转成数值,然后再相加
  3. 两个字符串相加: 加法运算符会变成连接运算符,返回一个新的字符串,将两个原字符串连接在一起
  4. 一个运算子是字符串,另一个运算子是非字符串: 非字符串会转成字符串,再连接在一起
  5. 运算子是对象: 必须先转成原始类型的值,然后再相加。对象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]

数值运算符的作用?

+true // 1
+[] // 0
+{} // NaN

取反运算符(!)的转化规则?

以下六个值转化为布尔值为false,取反后为true,其他值取反后都为false。

&& 和 || 运算符

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的转化规则?

  1. 调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。
  2. 如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。
  3. 如果toString方法返回的是对象,就报错。
var obj = {x: 1};
Number(obj) // NaN

// 等同于
if (typeof obj.valueOf() === 'object') {
  Number(obj.toString());
} else {
  Number(obj.valueOf());
}

String的转化规则?

原始类型值转化为相应的字符串,对象的转化规则与Number方法基本相同,只是互换了valueOf方法和toString方法的执行顺序:

  1. 先调用对象自身的toString方法。如果返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
  2. 如果toString方法返回的是对象,再调用原对象的valueOf方法。如果valueOf方法返回原始类型的值,则对该值使用String函数,不再进行以下步骤。
  3. 如果valueOf方法返回的是对象,就报错。

什么时候会自动转换数据类型?

  1. 不同类型的数据互相运算
  2. 对非布尔值类型的数据求布尔值 , 例如用在if语句中作为判断时
  3. 对非数值类型的值使用一元运算符(即+和-)

原生错误类型?

  1. SyntaxError 对象: 解析代码时发生的语法错误
  2. ReferenceError对象: 引用一个不存在的变量时发生的错误
  3. RangeError对象:一个值超出有效范围时发生的错误
  4. TypeError对象: 变量或参数不是预期类型时发生的错误
  5. URIError对象: URI 相关函数的参数不正确时抛出的错误
  6. EvalError对象: eval函数没有被正确执行时 (该错误类型已经不再使用了)
上一篇 下一篇

猜你喜欢

热点阅读