zoukankan      html  css  js  c++  java
  • javascript中的操作符详解1

      好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符。

    一、前言

    javascript中有许多操作符,但是许多初学者并不理解或曲解他们的用途,本章将会带领初学者们一起来学习一下javascript的几个常用操作符:typeof、in、delete、new。

    二、学习目标

    1. 深入了解javascript操作符:typeof、in、delete、new的功能及用法。

    2. 剖析根本,掌握这些常用的操作符的运用场景,活学活用。

    三、课程讲解

    1. typeof

       typeof操作符输出的值有以下几种:number、string、boolean、undefined、object、function,但是如何判断typeof输出的是什么值并不容易,其中结合着许多js的其他基础知识,下面我们来看这些代码:

    var a=NaN
    var b=null
    var c=new String('123')
    var d= []
    var e;
    typeof a  // number
    typeof b  // object
    typeof c  // object
    typeof d  // object
    typeof e // undefined
    typeof f  // undefined

    结论:

        NaN是非数值,虽然他的意思是非数值,但是他的类型仍然是数字类型,其只是代表着非数值这个数字。

        null由于历史原因,其typeof仍然是object,null表示一个空指针对象,原型链的顶层Object.prototype.__proto__就指向null

        new String/Number/Boolean 这三个都是创建一个对象,与直接赋值字面量是不一样的。

        typeof操作未定义变量不会报错,而是返回undefined,因此在代码中,我们常用typeof判断一个变量是否存在,这样避免了变量不存在引起报错。

    2. in

      遍历对象键值,最常用的方法是for...in,但是你真正了解in么?如果不了解,那就进入这一节的学习吧。

      对于in的执行,是与原型链有关系的, in 操作符会查找对象的整个原型链,他会找到并且输出原型链中可枚举的属性和方法(关于原型链和描述符不在此文范围内)。为了避免for...in遍历出原型链上的属性或方法,我们常常看到会有一个判断: o.hasOwnProperty(property),此方法可以判断属性是否是对象本身拥有的属性,而非继承获得。

    var Foo = function (name) {
      this.name = name  
    }
    Foo.prototype.hello = function () {
      console.log(this.name + '问好'
    }
    var f = new Foo('xu')
    for (var key in f) {
      console.log(key) // 输出 name、 hello  
    }
    for (key in f) {
      if (f.hasOwnProperty(key)) {
        console.log(key)   // 输出 name
      }
    }

    in还可以用于判断中,判断对象是否存在某属性可以用in 来判断,表达式: property in object (如: 'name' in f)

    3. delete

        故名思议,用来删除数据,他只能删除对象的属性内容或者数组的某个下标元素,他不能删除定义的变量包括对象和数组,删除成功返回true,否则返回false。如下所示:

    var a = 1
    var b = [1,5]
    var c = {
      name: 'xu', 
      hello: function () {
        console.log('hello')
      }
    }
    
    delete a   // false
    delete arr[1]   //true
    delete c.name  // true
    console.log(a)  // 1
    console.log(b)  // [1,undefined]
    console.log(c) // {hello: function () {...}}

    javascript中,凡是var定义的变量都不能用delete操作符删除(es6中let/const定义的变量对delete不可见),javascript解析器将var定义的变量的configurable描述符初始化为false,因此不能删除成功。而删除的数组元素会用undefined来填充。对象的属性被删除后没有遗留痕迹,但前提是可配置的属性。

    4. new

      我们经常用到的new新建一个对象,其工作原理其实很简单,但是也有一些潜在的隐患,如下所示:

    var Foo = function (name) {
      this.name = name;
      return {
        user: 'xu' 
      }  
    }
    
    var f = new Foo('xu')
    
    console.log(f.name)  // undefined
    console.log(name in f) // false console.log(f.user) // 'xu'

    上面的例子我们定义了一个构造函数Foo,传入一个参数姓名,在构造函数内部将传入的name写入实例中,最后返回了一个对象{user: 'xu'}。那么问题来了,new Foo 按理说应该返回的是一个Foo实例,也就是说f.name是有的并且在案例中的值为'xu', 但是我们却得到了undefined,并且name in f 返回 false,表示f这个对象并没有name属性。而f.user却得到了'xu'。

    大家可能猜到了,如果构造函数中返回了一个对象,那么这个构造函数在new的过程中会返回这个定义的对象,而并非返回这个构造函数的实例。那么,如果return的是一个数字或者string呢?

    var Foo = function (name) {
      this.name = name;
      return 1;
    }
    
    var f = new Foo('xu')
    
    console.log(f) // {name: 'xu'}

    以上案例我们可以看出,如果构造函数中return的是一个数字,那么new的这个构造函数会忽略,仍然返回正确的构造函数实例对象。不信你可以用instanceof来验证。

    结尾

        以上就是此文章的内容,希望对读者有所帮助,如有错误请指正~~~

  • 相关阅读:
    2.12 使用@DataProvider
    2.11 webdriver中使用 FileUtils ()
    Xcode8 添加PCH文件
    The app icon set "AppIcon" has an unassigned child告警
    Launch Image
    iOS App图标和启动画面尺寸
    iPhone屏幕尺寸、分辨率及适配
    Xcode下载失败 使用已购项目页面再试一次
    could not find developer disk image
    NSDate与 NSString 、long long类型的相互转化
  • 原文地址:https://www.cnblogs.com/xujiazheng/p/6241501.html
Copyright © 2011-2022 走看看