• JS 杂七杂八细节——运算符


      平常看书中看到太多的细节,干脆把它们都记下来,偶尔自己看看也好。。。

      1、对 Object 采用 '+' 运算符,Object 对象首先调用 valueOf() 返回简单值,之后如果两个操作数都是 number 对象,

        则采取算术相加,否则再调用toString()方法,采用字符串连接。

      2、在JS中,所有 Number 对象都以浮点数格式存储。-(一元)、-(二元)、+(一元)、*、/、% 运用于非数字类型操作数时,

        都将尝试将其转化为数字。非0数除以0返回 +(-)infinity0/0 返回 NaN

      3、求余符号(%)的运算结果的符号(正负号)与第一个操作数相同。它不仅适用于整型,而且适用于浮点型。如:-4.3 % 2.1 = -0.1

      4、==(Equality) 和 ===(Identity)

       4.1 number 、 string 和 boolean 是通过值比较的,只要值相同就返回 true

       4.2 Object 、 Array 和 function 是通过引用比较的,只有指向同一对象的两个变量才相等,各自的两个Array,即使包含相同的元素,

          对 == 和 ===来说都不可能相等。

      5、===(Identity)

       5.1 NaN 不与任何值唯一相等,即使是它本身,可以用全局方法 isNaN() 判断变量是否为 NaN

       5.2 两个 null 或两个 undefined 都是唯一相等的

      6、==(Equality)

       6.1 如果两个操作数类型相同,比较规则和 === 是一样的

       6.2 如果两个操作数类型不同,将按以下规则转换后进行比较

          6.2.1 null == undefined 返回 true

          6.2.2 一个number 和一个 string ,先将 string 转换成 number 后再比较

          6.2.3 如果其中一个是true,则将其转换为 1 再比较;如果其中一个是false,则将其转换为 0 再比较。

          6.2.4 一个 object 和一个 number 或 string 比较时,先将 object 转换为简单类型再比较。除了 Date 的其他内置类对象,

              都先调用valueOf() ,必要时再调用 toString()方法,而 Date 只调用 toString()

       e.g.

              '1' == true  //返回 true

              
    //1.  true 先转换为1,比较 '1' == 1
              //2.  '1' 再转换为 1,比较 1 == 1

       7、<、<=、>、>=

        7.1 以上关系运算符只能应用于数字和字符串

        7.2 当一个数字和一个字符串比较时,尝试将字符串转化为数字

        7.3 与 NaN 的比较都返回 false

        7.4 字符串的比较是逐字符比较的,而且大小写敏感

      8、 in

        in 左边必须是一个字符串或可以转化为字符串的变量,右边必须是一个 object ,当左边字符串是右边对象的一个属性名时返回 true

        比如:var cat = { age: 3 }; var isHasAge = 'age' in cat; // return true

      9、 instanceof

        instanceof 左边必须是一个对象,右边必须是一个类名。当左边对象是右边类的一个实例时返回 true

        注意:所有对象都是 Object 的实例.

        比如:var d = new Date(); var isInstance = d instanceof Date; // return true

       10、 &&

        如果将逻辑与运算符用在判断真假,与其他强类型语言是没什么不同的。JS的&&运算符在返回值上值得注意。

        第一个操作数为假或可以转换为假时,表达式返回第一个操作数的值,而不是返回false。

        第一个操作数为真或可以转换为真时,返回第二个操作数的值。

            var i = 0;
            
    var x = (i++ && false);
            alert(x);
            alert(
    typeof x);
            
    // 0
            // 'number'

      11、 ||

        同样,逻辑或在返回值上也与其他强类型语言不同。

        第一个操作数为真或可以转换为真时,表达式返回第一个操作数的值,而不是返回 true。

        第一个操作数为假或可以转换为假时,表达式返回第二个操作数的值,而不论第二个操作数经过转换后是不是为假。

      12、 typeof

        typeof 其实是一个运算符(operator),它返回变量、属性或数组元素的内置类型。它有两种语法:

        1、 typeof x

        2、 typeof(x), 看起来更像一个函数

        注意: typeof null 的结果是: 'object'

        在用 for/in 迭代对象属性时,JS认为属性和方法都是对象的属性,这时你可以用 typeof 访问属性,如果是方法会返回 'function'

      13、delete

        delete 用于删除对象属性、数组元素或变量。删除成功时返回 true,否则返回 false 。

        有些属性或变量是不允许被删除的,比如内置对象。用 var 显式声明的变量不可以被删除,但没用 var 声明的变量可以被删除。

        当操作数不存在时(比如要删除的属性或变量不存在),delete 返回true。

        注意:当对象属性也是对象类型时,delete删除的只是属性,而不会删除属性所引用的对象,换句话说,只是删除属性名。

             JS中的内存管理是由垃圾回收作统一管理的,类似于C#。

            var obj =
            {
                x: 
    new Date(),
                y: 
    function() { }
            };
            
    var result = delete obj.y;
            alert(result);      
    // true, 删除成功时返回 true
            alert(typeof obj.y); // undefined, 已被删除的对象属性

            result 
    = delete undefined; // undefined 其实是一个全局属性
            alert(result);             // false, 内置的属性不允许被删除

            
    var x = 0;
            alert(
    delete x);           // false, 用var显式声明的变量不允许被删除
            alert(x);                  // 0, 变量依然存在,没被删除

            alert(
    delete obj.z);       // true, 删除不存在的属性时返回 true
            alert(delete a);           // true, 删除不存在的变量时返回 true

            obj.date 
    = obj.x;
            alert(
    delete obj.x);       // true
            alert(obj.date.getFullYear()); // 2009
  • 相关阅读:
    Winfrom 动画实现
    Android-SD卡相关操作
    Android-动态权限获取
    Java 常用知识点
    无锁队列的实现
    稳定的快排
    设计模式
    map的线程安全
    win 消息
    memecpy源码
  • 原文地址:https://www.cnblogs.com/lucas/p/1429890.html
Copyright © 2020-2023  润新知