• 《JavaScript高级程序设计》读书笔记(三)基本概念第四小节 操作符


    内容
    ---语法 上一小节
    ---数据类型 本小节 操作符
    ---流程控制语句
    ---理解函数


    操作符
    --操作数据值的操作符
    --算术(如加减)、位操作符、关系、相等
    --ECMAScript操作符可以适用于很多类型的值
    --在用于对象时,会先调用对象的valueOf()和(或)toString()方法,以便取得可操作的值


    一元操作符
    --只能操作一个值

    --递增操作符 ++
    --递减操作符 --
    --都有前置和后置

    var age = 11;
    ++age; //12
    age++; //12
    age; //13
    --age; //12
    age--; //12
    age; //11


    一元加减操作符(+-)
    --(-)不变,(-)取负
    --不仅仅适用于整数,字符串,布尔值,浮点数,对象都适用于
    --(+)等同于Number()方法的效果,(-)再取负数
    --对于对象先调用valueOf()和(或)toString方法,再转换值

    1 +"0.1"; //0.1
    2 -"0.1"; //-0.1
    3 +"z"; //NaN
    4 var o = {
    5     valueOf:function() {
    6         return 2;
    7     }
    8 }
    9 +o; //2    

    位操作符
    --按照内存中表示数值的位来操作值
    --ECMAScript中数值都是以IEEE754 64位格式存储
    --不直接操作64位的值,而是先转换成32位整数,操作完转回64

    --有符号整数,前31位 表示值,第32位表示符号,0为正,1为负
    --二进制存储
    --负数使用二进制补码存储

    --正数的原码=反码=补码


    --负数
    --反码,符号位不变,其余各位取反
    --补码,符号位不变,其余各位取反,再加一
    --补码,符号位不变,从前面按位取反,最后一个1即后面的0不变

    --ECMAScript会尽力向我们隐藏这些信息,
    --当我们想要二进制表示负数时
    --我们看到的只是这个负数决定之的二进制码前面加了负号

    var num = -18;
    num.toString(); //-10010,而不是-01110

    --ECMAScript所有整数默认有符号位

    --对NaN,Infinity值位操作,会被当成0处理
    --对非数值位操作,会使用Number()方法


    按位非(NOT)(~)
    --(~)波浪线表示
    --按位取反,包括符号位
    --浮点数,小数点后会被忽略

    var num1 = 25; //0 0*26 11001 二进制
    var num2 = ~num1; //1 1*26 00110 二进制负数的补码(负数的存储形式)
    mun2; //-26 转化为负数可见形式
    ~1; //-2
    ~1.9; //-2

    --本质 操作数的负值减1


    按位与(AND)
    -- num & num
    --两个操作数每一位对其,进行与操作
    25 & 25 //25
    25 & ~25 //0
    25 & -26 //0


    按位或(OR)
    -- num | num
    --两个操作数每一位对其,进行或操作

    25 | 25 //25
    25 | -26 //-1 每一位全是-1
    25 | ~25 //-1 每一位全是-1


    按位异或(XOR)
    -- num ^ num
    -- 不同为真1,相同为假0

     

    左移
    -- num << index
    -- 左移不影响符号位
    -- 除符号位其余位向左移动index个位数,用0填补空位

    4 << 1 //8 100 -> 1000
    2 << 5 //64 10 -> 1000000


    有符号右移
    -- num >> index
    -- 右移不影响符号位
    -- 除符号位其余位向右移动index个位数,用符号位填补空位

    8 >> 1 //4 1000 -> 100
    64 >> 5 //2 1000000 -> 10
    -5 >> 1 //-3


    无符号右移
    -- num >>> index
    -- 影响符号位
    -- 所有位向右移动index个位数,用0填补空位

    64 >>> 5; //2
    -64 >>> 5; //134217726



    布尔操作符
    --非(NOT)、与(AND)、或(OR)

    逻辑非
    -- !x
    -- 可用于所有类型,都会返回一个布尔值,逻辑非对其求反

    规则
    --对象 false
    --空字符串 true
    --非空字符串 false
    -- 0 true
    -- 非0(包括Infinity)false
    -- null true
    -- NaN true
    -- undefined true

    --两个非操作等同于Boolean()函数


    逻辑与
    -- && 正常的布尔与操作

    当有一个操作数不是布尔值时
    --如果第一个是对象,则返回第二个操作数
    --如果第二个是对象,当第一个是true时,返回
    --如果都是对象,则返回第二个
    --有一个null 返回null
    --有一个NaN 返回NaN
    --有一个undefined 返回undefined

    --短路操作,如果第一个能决定结果,就不再对第二个操作符求值
    --即如果第一个为false,则无论第二个取任何值都是false


    逻辑或
    -- || 正常的布尔与操作

    如果有一个不是布尔值时,
    --如果第一个是对象 返回之
    --如果第一个为false 返回第二个
    --两个都是对象,返回第一个
    --两个都是null 返回null
    --都是NaN 返回NaN
    --都是undefined 返回之

    --也是短路操作 如果第一个为true 则不会对第二个求值

    var res = a1 || a2 || a2;

    --返回一个有值的结果,经常使用


    乘性操作符
    --乘法,除法,求模
    --非数值会自动Number()

    乘法
    -- *
    -- 超过范围返回 Infinity或者-Infinity
    -- 有一个为NaN 返回NaN
    -- Infinity * 0 = NaN
    -- Infinity * 非0 = Infinity或者-Infinity 取决于有符号数
    -- Infinity * Infinity = Infinity


    除法
    -- /
    -- 超过范围返回 Infinity或者-Infinity
    -- 有一个为NaN 返回NaN
    -- Infinity / Infinity = NaN
    -- 0 / 0 = NaN
    -- 非零 / 0 = Infinity或者-Infinity 取决于有符号数
    -- Infinity / 非0 = Infinity或者-Infinity 取决于有符号数


    求模
    -- %
    -- Infinity % num = NaN
    -- num % 0 = NaN
    -- Infinity % Infinity = NaN
    -- num % Infinity = num
    -- 0 % Infinity = 0


    加性操作符
    --也会转换不同的数据类型,但是比乘性要复杂

    加法
    -- +

    当为数值类型时
    -- 有一个是NaN 返回NaN
    -- Infinity + Infinity = Infinity
    -- -Infinity + -Infinity = -Infinity
    -- Infinity + -Infinity = NaN
    -- +0 + -0 = +0
    -- -0 + +0 = +0
    -- +0 + +0 = +0
    -- -0 + -0 = -0

    如果有一个是字符串
    --都是字符串 则拼接
    --只有一个是字符串,则把另一个转化为字符串再拼接
    --转型按照String() 转型函数(所以有:把某个值 + "" ,等同于String())


    减法
    -- (-)
    -- 有一个NaN 返回NaN
    -- Infinity - Infinity = NaN
    -- -Infinity - -Infinity = NaN
    -- Infinity - -Infinity = Infinity
    -- -Infinity - Infinity = -Infinity
    -- +0 - +0 = +0
    -- -0 - -0 = +0
    -- +0 - -0 = +0
    -- -0 - +0 = -0
    --如果不是数值,会调用Number()转换


    关系操作符
    -- 小于(<)、大于(>)、小于等于(<=)、大于等于(>=)
    --返回布尔值
    --都是数值则数值比较
    --都是字符串则比较字符串对应的字符编码
    --如果一个是数值,则将另一个转换为数值参照Number()方法
    --如果是布尔值,也转换

    --字符串比较时,比较对应位置的每个字符串字符编码
    --大写字母(65~90[A-Z])小于小写字母(97~122[a-z])

    奇怪的情况

    "23" < "3" //true
    "23" < 3 //false
    "a" < 3 //false
    NaN < 3 //false
    NaN >= 3 //false

    --有一个NaN,则不管怎么比较结果都是false
    -- +(null) = 0, +(undefined) = NaN


    相等操作符
    --相等不相等(==、!=)、全等不全等(===、!==)

    相等不相等(==、!=)
    -- 会被强制转换,再比较相等性

    --如果有一个是布尔值,则先转换为数值 true-1,false-0
    --有一个字符串,另一个数值,则字符串转换为数值
    --一个对象,另一个不是则调用对象的valueOf()方法 用得到的基本类型比较

    --null == undefined true(undefined派生自null)
    --在比较相等性之前不能将null,undefined转化为其他值
    --有一个为NaN,==false , != true,两个都为NaN也是
    --对象比较,判断是不是同一对象


    全等和不全等(===、!==)(推荐使用)
    --不提前转化类型
    --类型不同返回false
    --null===undefined false
    --对象比较,同相等不相等


    条件操作符(三目运算)
    variable = boolean_expression ? true_value : false_value;


    赋值操作符(=)
    --右边赋值给左边

    复合赋值操作
    --简化赋值操作,但是不会带来性能提升
    -- +=
    -- -=
    -- *=
    -- /=
    -- <<=
    -- >>=
    -- >>>=

    var num = 10;
    num = num + 5;
    //同
    num += 5;


    逗号操作符
    --在一条语句中执行多个操作

    vat num1=1, num2=2,num3, num4=4;
    --通常用于声明多个变量,可赋值

    var num = (3, 2, 3, 5, 6); //num=6
    --在赋值中,逗号操作符总会返回表达式中最后一项的值

  • 相关阅读:
    Vue 项目运行 npm run dev 命令时会报错:“'webpack-dev-server' 不是内部或外部命令,也不是可运行的程序” 的解决办法
    百度地图 操作步骤
    返回数据-----数组处理
    Echarts折线图,适配可移动
    jq checkbox的操作——全选、反选
    jquery 时间戳与日期转换
    Flex 布局
    iphone遇到INPUT标签BUG
    点击复制粘贴
    Python数据类型的可变与不可变
  • 原文地址:https://www.cnblogs.com/loveluking/p/9430839.html
Copyright © 2020-2023  润新知