美文网首页
回味JS(二)运算符及语法

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

作者: ArmorVon | 来源:发表于2019-05-27 14:10 被阅读0次

    本篇文章总结自阮一峰的教程 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]

    数值运算符的作用?

    • 可以将任何值转为数值(与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的转化规则?

    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函数没有被正确执行时 (该错误类型已经不再使用了)

    相关文章

      网友评论

          本文标题:回味JS(二)运算符及语法

          本文链接:https://www.haomeiwen.com/subject/muhhtctx.html