一、js运算
    (1)一元运算
    Number()接受null、[]、’’、false,返回0
    接受true,返回 1
    1、+
    转换为number值
    原始值用Number(a)
    对象调用valueOf或者toString后,如果能返回原始值,再调用Number()
    如果两个方法都不能返回原始值,则会报错
    Cannot convert object to primitive value
    2、-
    转换为nunber值,取负值 -Number(a)
    对象调用valueOf或者toString后,如果能返回原始值,再调用Number(),再取负值
    如果两个方法都不能返回原始值,则会报错
    Cannot convert object to primitive value
    3、!、!!、逻辑与、逻辑非
    (1)!转化为boolean值
    转化为boolean值, 取反 !Boolean(a)
    (2)!!、逻辑与、逻辑非
    转化为boolean值
    falsy有 0 , -0, ‘’, false,null, undefined,-infinity
    4、递增、递减操作符
    前置、后置操作符
    (1)前置,特点是变量的值会在语句求值之前改变。

    1. let age = 30;
    2. ++age
    3. //过程等于
    4. age = age + 1;
    5. let sum = ++age + --age;
    6. console.log(sum) // => 31

    (2)后置,变量的值在语句求值后改变。

    1. let age = 30,
    2. sum = age++ + age--;
    3. console.log(sum) // => 61
    4. //到age--时,age的值已经改变了

    5、关系操作符( > 、<等等)
    (1)如果两个值都是字符串,则会进行对位比较。

    1. let str1 = '123456',
    2. str2 = '13';
    3. console.log(str1 < str2) // => true

    (2)其他情况,会将两个值转化为number再进行转化,具体步骤见上面内容。

    6、相等操作符
    由于对比较前要不要强制类型转化有争议,所以ECMA提供了两种比较操作符。
    (1)==
    比较前需要进行类型转化。
    (1)null和undefined不能进行转化
    null == undefined
    这两个之间相当,和其他值都不相等
    (2)NaN参与的比较结果都是false
    (3)其余情况,先将两个值转化话number再进行比较
    二、ASCII码和unicode码
    ASCII码用来规定如何用二进制数据储存英文字母和符号。
    大体规则: 0~9 < A~Z < a~z
    unicode码扩大了范围,包含了更多字符
    应用: 求字符串总字节数

    1. let str = '123asdfawerafbfey哈哈哈u好玩',
    2. sum = str.length;
    3. let strArr = [...str];
    4. strArr.forEach((item)=>{
    5. if(item.charCodeAt() > 255){
    6. sum++
    7. }
    8. })
    9. console.log(sum)

    三、NaN
    在js中,如果在本来要返回数值的计算,得到了非数字结果,并不会报错,返回NaN。
    NaN参与的计算,结果都是NaN。
    所以有isNaN专门判断NaN。
    isNaN( param ),会先将param转化为number,如果转化结果为数字,则返回false,反之,返回true。