zoukankan      html  css  js  c++  java
  • JavaScript中五种常见运算符

    一. in运算符

      in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象。如果右侧的对象拥有一个名为左操作数值的属性名,那么表达式返回true。例如:

    var point = {x:1, y:1};
    'x' in point    //=>true:对象有一个名为'x'的属性
    'z' in point    //=>false:对象中不存在名为'z'的属性
    'toString' in point    //=>true:对象继承了toString()方法
    
    var data = [7, 8, 9];
    '0' in data    //=>true:数组包含元素'0'
    1 in data      //=>true:数字转换为字符串
    3 in data      //=>false:没有索引为3的元素
    

      注意:①当通过in判断一个字符串是否是一个对象的属性名时,这个判断也会包含对该对象继承属性的检测;

    二. instanceof运算符  

      instanceof运算符希望左操作数是一个对象,右操作数标识对象的类。如果左侧对象是右侧类的实例,则表达式返回true,否则返回false。因为JavaScript中对象的类是通过初始化它们的构造函数来定义的,所以instanceof的右操作数应当是一个函数。例如:

    var d = new Date();    //通过Date()构造函数来创建一个新对象
    d instanceof Date;    //=>true:d是由Date()创建的
    d instanceof Object;    //=>true:所有对象都是Object的实例
    d instanceof Number;    //=>false:计算结果为false,d不是一个Number对象
    
    var a = [1, 2, 3];
    a instanceof Array;    //=>true:a是一个数组
    a instanceof Object;    //=>true:所有数组都是对象
    a instanceof RegExp;    //=>false:数组不是正则表达式
    
    var b = 3;
    b instanceof Number;    //=>false:右操作数不是一个对象,只是一个原始值(切记这里不做类型转换:当右操作数是合法的函数时,只要右操作数是任何原始类型都会返回false)

      注意:①所有对象都是Object的实例;②通过instanceof判断一个对象是否是一个类的实例的时候,这个判断也会包含对“父类”的检测;③如果instanceof的左操作数不是对象的话,instanceof返回false,如果右操作数不是函数,则抛出一个类型错误异常(先检测右操作数是否合法,再检测左操作数,最后判断表达式)。

    三. typeof运算符

      typeof是一元运算符,放在其单个操作数的前面,操作数可以是任意类型。返回值为表示操作数类型的一个字符串。下面是任意值在typeof运算后的返回值: 

    x typeof x
    undefined "undefined"
    null "object"
    true或false "boolean"
    任意数字或NaN "number"
    任意字符串 "string"
    任意函数 "function"
    任意内置对象(非函数) "object"
    任意宿主对象 有编译器各自实现的字符串,但不是"undefined"、"boolean"、"number"或"string"

      typeof运算符可以带上圆括号,这让typeof看起来像一个函数名,而不是一个运算符:typeof(i)

      新增:关于instanceof和typeof,下面记述一个例子:

    四. delete运算符

      delete是一元操作符,它用来删除对象属性或者数组元素,当然它也有返回值。例如:

    var o = {x:1, y:2};
    delete o.x;      //=>true:成功删除一个属性
    'x' in o;    //=>false:这个属性在对象中不再存在了
    'y' in o;    //=>true
    o.x;    //=>undefined:读取不存在的属性将返回undefined  
    delete o.x;    //=>true:删除不存在的属性,返回true
    delete o.z;    //=>true:删除不存在的属性,返回true
    
    var a = [1, 2, 3];
    2 in a;    //=>true:元素2在数组中
    delete a[2];    //=>true:成功删除一个数组元素
    2 in a;    //=>false:元素2已经不在数组中了
    a.length;    //=>3:注意,数组长度并没有改变
    delete a[3];    //=>true:删除不存在的元素,返回true
    a[2];    //=>undefined:读取不存在的元素将返回undefined
    
    var b = [1, 2, undefined];
    2 in b;    //=>true:元素2在数组b中
    b[2];    //=>undefined:读取元素2的值,返回其值undefined
    delete b[2];    //=>true:成功删除一个数组元素
    2 in b;    //=>false:元素2已经不再数组中了
    b.length;    //=>3:数组长度未变
    b[2];    //=>undefined:读取不存在的元素返回undefined 

    可以看到:delete如果删除成功或者删除不存在的属性或元素时都会返回true,那么什么时候返回false呢?其实,并不是所有属性都可删除,一些内置核心和客户端属性是不能删除,用户通过var语句声明的变量不能删除(当用var声明全局变量时,这个变量也是全局对象window的一个属性),同样,通过function语句定义的函数和函数参数也不能删除。例如:

    var o = {x:1, y:2};
    var aa = 22;
    delete o.x;    //=>true
    typeof o.x;    //=>undefined
    delete o;    //=>false:不能删除通过var声明的变量,返回false
    delete aa;    //=>false:不能删除通过var声明的变量,返回false
    delete window.aa;    //=>false:无法删除
    delete this.aa;    //=>false:无法删除
    function myTest(con){
        console.log(delete con);    //=>false:不能删除函数参数
        console.log('myTest:' + con);
    }
    delete myTest;//=>false:不能删除通过function语句定义的函数

    注意:在ECMAScript 5严格模式中,如果delete的操作数是非法的,比如变量、函数或函数参数,delete操作将抛出一个语法错误(Syntax Error)异常,只有操作数是一个属性访问表达式的时候它才会正常工作。在严格模式下,delete删除不可配置的属性时会抛出一个类型错误异常。在非严格模式下,这些delete操作都不会报错,只会简单地返回false,以表明操作数不能执行删除操作。当使用var声明一个变量时,创建的这个属性就是不可配置的,所以上面各种删除变量aa都返回false,表示无法删除,当然我们这里讨论的就是非严格模式嘛。在非严格模式中,如果给一个没有使用var声明的变量赋值的话,JavaScript会自动创建一个隐式的全局变量,以这种方式创建的变量是全局对象的正常的可配置属性,所以可以删除它们,Chrome运行结果也正是这样:

    更要注意的一点是:在使用任务链进行部分var声明时,也会创建隐式全局变量,例如:

    下面的例子更是验证了这个:

    要想避免这种隐式全局变量,就要这样写:

    var aa=0,bb=0;
    delete aa;//=>false
    delete bb;//=>false

    还有一点就是:delete希望它的操作数是一个左值,如果它不是左值,那么delete将不进行任何操作同时返回true。例如:

    delete 1;    //数字1不是一个左值,返回true

    五. void运算符

      void是一元运算符,它出现在操作数之前,操作数可以是任意类型,操作数会照常计算,但永远返回undefined。例如:

    var aa = 33;
    var bb = 44;
    var cc = 0;
    var dd = void(aa+bb);    //dd=undefined
    var ee = void(cc = aa+bb);    //ee=undefined,cc=77
    //注意:最后一句不能写成var ee = void(cc = aa + bb;);,因为void一元运算符,后面是操作数,不能是完整的语句    
  • 相关阅读:
    RabbitMQ 入门
    Spring boot 2.x 中使用redis
    spring boot 中 Cache 的使用
    vbs 入门
    移动端文本框被原生键盘弹出后挡住文本框
    HTML中添加音乐video embed audio
    input修改placeholder文字颜色
    vue中更换.ico图标报错路径找不到图片
    Chrome表单文本框自动填充黄色背景色样式
    请求头缺少 'Access-Control-Allow-Origin'
  • 原文地址:https://www.cnblogs.com/craftsman-gao/p/4745118.html
Copyright © 2011-2022 走看看