zoukankan      html  css  js  c++  java
  • javascript 操作符小结

    简单总结一下JavaScript的几个操作符: var、 in、 delete、 typeof、 new、 instanceof、void

    var

    定义变量要使用var操作符, 使用var操作符定义的变量将成为该变量的作用域中的局部变量。 也就是说,如果在函数中定义一个变量, 那么这个变量在函数退出后就会被销毁。

    省略var操作符可以定义全局变量, 但是不推荐这样的做法。 因为在局部作用域中定义的全局变量很难维护。

    有关作用域可以参考:变量、作用域和内存问题

    in

    in操作符有两种使用方式:for-in循环 及 单独使用。 单独使用的时候,如果 in操作符 能通过右侧的对象访问左侧给定的属性,无论该属性存在实例还是原型,返回true。

    例1:

     var a = 10;
     if(a in window) {
         alert(a);  //"10"
     }

    例2:

     function fn (){};
     fn.prototype.a = function(){};
     var fn1 = new fn();
     alert("a" in fn1);  // true

    delete

    delete可以删除对象属性或者数组元素。 当删除一个属性的时候, 这个属性将不再存在。 读取一个不存在的属性将返回 undefined , 但是可以通过in运算符来检测这个属性是否存在对象中。

    例1:

     var obj = {x: 1, y: 2};
     delete obj.x;
     alert(obj.x in obj);  //false
    
     var arr = [1,2,3];
     delete arr[0];
     alert(0 in arr);    //false
     alert(arr.length);  //"3", 尽管删除了元素, 但是留下了一个“洞”, 数组的长度不变。

    delete的操作数应该是一个 左值 ,如果它不是左值, 那么delete将不进行任何操作同时返回true; 如果delete删除成功或删除不存在的属性时, 会返回true。 然而并不是所有属性都可以删除,一些内置核心和客户端属性是 不能删除的, 用户通过var 语句声明的变量不能删除, 通过function语句定义的函数和函数参数也不能删除。

    在ECMAScript 5严格模式中, 如果delete操作数是非法的, 将会抛出一个语法错误异常, 在非严格模式下, 只会简单的返回false不会报错。

    例2:

     var obj = {x: 1, y: 2};
     delete obj.x;  //true
     "x" in obj;    //false
     delete obj.x;  //删除不存在的属性, 返回true
     delete obj;  //不能删除通过var声明的变量, 返回false 
                 //严格模式下,将抛出异常    
     delete 1;  //不是左值, 返回true;
     delete x;  //试图删除它, 在非严格模式下返回 true; 
                //严格模式下,抛出异常    

    在JavaScript中,变量、对象属性、数组元素均是左值。

    typeof

    typeof操作符可以用来检测变量的类型,对一个值使用typeof可能返回下列某个字符串

    • “undefined” — 如果这个值未定义
    • “boolean” — 如果这个值是布尔值
    • “string” — 如果这个值是字符串
    • “number” — 如果这个值是数值
    • “object” — 如果这个值是对象或null
    • “function” — 如果这个值是函数

    从技术角度讲,函数在ECMAScript中是对象,不是一种数据类型。 然而,函数也确实有一些特殊的属性,因此通过typeof操作符来区分函数和其他对象是有必要的

    要检测一个变量是不是基本数据类型,typeof操作符是最佳的工具。但在检测引用数据类型的值时,这个操作符的用处不大。 通常我们并不想知道某个值是对象,而是想知道它是什么类型的对象, 为此使用 instaceof操作符比较适合。 instanceof操作符在下边会有介绍。

    关于数据类型的可以参考:变量、基本数据类型

    new

    new操作符用来创建实例。 任何函数,只要通过new操作符来调用,那它就可以作为构造函数;而任何函数,如果不通过new操作符来调用, 那它跟普通函数就没有什么两样。

    使用new操作符调用构造函数实际上会经历一下4个步骤:

    • 创建一个新对象
    • 将构造函数的作用域赋给新对象(因此this就指向了这个新对象)
    • 执行构造函数中的代码(为这个新对象添加属性)
    • 返回新对象

    instanceof

    instanceof可以确定对象的类型,如果左侧的对象是右侧类型的实例(这个判断也会包括对“父类”的检测),那么instanceof操作符就会返回true。

    例1:

     var arr = new Array();
     var reg = new RegExp();
     alert(arr instanceof Array);      //true
     alert(reg instanceof RegExp);     //true
     alert(arr instanceof Object);      //true        
     alert(reg instanceof Object);     //true

    根据规定,所有引用类型的值都是Object的实例。 因此,在检测一个引用类型值和Object构造函数时,instanceof操作符始终返回true。 如果用instanceof检测基本类型的值,始终会返回false, 因为基本类型不是对象。

    例2:

     function fn(){};
     function fnSub() {};
     fnSub.prototype = new fn();  
     var fn1 = new fnSub();      
     alert(fn1 instanceof Object);  //true
     alert(fn1 instanceof fn);      //true
     alert(fn1 instanceof fnSub);   //true

    在这个例子中,我们可以说fn1是Object、fn、fnSub任何一个类型的实例,因此测试这三个构造函数都返回了true。

    void

    void的操作数可以是任意值, 这个运算符不经常使用, 操作数会照常计算, 但忽略其计算结果并返回 undefined 。

    void最常用在客户端URL — javascript:URL 中,让URL中可以写有副作用的表达式,而浏览器不必显示表达式的计算结果。

    例1:

     <a href="javascript:window.open()">click</a>
     <a href="javascript:void window.open()">click</a>

    例2:

     <a href="#">click</a>
     <a href="javascript:void #">click</a>

    使用void操作符返回undefined, 所以点击过页面会定位在原来的位置。

    通过添加 #+锚名称 至URL末端的方式访问锚点,假如浏览器找不到该锚点,就会定位到文档的顶端

  • 相关阅读:
    C++函数参数传参的本质解析
    C#值类型和引用类型详解
    C#学习笔记(转换)
    C#学习笔记(泛型)
    # Java反射2——获取实体所有属性和方法,并对属性赋值
    Java反射1——扫描某个包下的所有类
    JSR教程2——Spring MVC数据校验与国际化
    JSR教程1——JSR 303
    Github如何撤销提交并清除痕迹
    论文第5章:Android绘图平台的实现
  • 原文地址:https://www.cnblogs.com/blackwood/p/3167261.html
Copyright © 2011-2022 走看看