导航

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

Posted on 2009-04-05 17:20  LucasYang  阅读(886)  评论(0编辑  收藏  举报

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

 

  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