美文网首页
回味JS(三)JS的内置对象

回味JS(三)JS的内置对象

作者: ArmorVon | 来源:发表于2019-05-29 11:52 被阅读0次

    1. Object对象

    判断变量是否为对象的小技巧

    如果Object方法的参数是一个对象,它总是返回该对象,即不用转换,所以可以利用这一点来判断一个变量是否为对象:

    function isObject(value) {
      return value === Object(value);
    }
    
    isObject([]) // true
    

    Object.keys()和Object.getOwnPropertyNames()有什么区别?

    • 这两者都是用来遍历对象的属性,接受一个对象作为参数,返回一个数组。
    • 遍历的都是该对象自身的(而不是继承的)所有属性名;但Object.keys方法只返回可枚举的属性,Object.getOwnPropertyNames方法还返回不可枚举的属性名。

    例如:

    var a = ['Hello', 'World'];
    
    Object.keys(a) // ["0", "1"]
    Object.getOwnPropertyNames(a) // ["0", "1", "length"]
    

    使用toString判断数据类型

    Object的toString方法,作用是返回一个对象的字符串形式,默认情况下返回类型字符串,因此可以用来判断一个值的类型。

    数组、字符串、函数、Date 对象都分别部署了自定义的toString方法,覆盖了Object.prototype.toString方法,所以通常使用Object.prototype.toString.call(value)来判断值的类型。

    不同数据类型的Object.prototype.toString方法返回值如下。

    • 数值:返回[object Number]
    • 字符串:返回[object String]
    • 布尔值:返回[object Boolean]
    • undefined:返回[object Undefined]
    • null:返回[object Null]
    • 数组:返回[object Array]
    • arguments 对象:返回[object Arguments]
    • 函数:返回[object Function]
    • Error 对象:返回[object Error]
    • Date 对象:返回[object Date]
    • RegExp 对象:返回[object RegExp]
    • 其他对象:返回[object Object]

    tips: 简单封装一个判断类型的函数:

    var type = function (o){
      var s = Object.prototype.toString.call(o);
      return s.match(/\[object (.*?)\]/)[1].toLowerCase();
    };
    

    2. 属性描述对象

    Object.defineProperty() 的作用?它接受哪几个参数?

    Object.defineProperty()方法允许通过属性描述对象,定义或修改一个属性,然后返回修改后的对象,如果属性已经存在,Object.defineProperty()方法相当于更新该属性的属性描述对象。

    Object.defineProperty方法接受三个参数,依次如下。

    1. object:属性所在的对象
    2. propertyName:字符串,表示属性名
    3. attributesObject:属性描述对象

    其中第三个参数是属性描述对象,Object.defineProperty()和Object.defineProperties()参数里面的属性描述对象,writable、configurable、enumerable这三个属性的默认值都为false

    • value
    • writable
    • enumerable, 表示该属性是否可遍历
    • configurable, 表示可配置性
    • get
    • set

    注意: 一旦定义了取值函数get(或存值函数set),就不能将writable属性设为true,或者同时定义value属性,否则会报错。

    3. Array对象

    为什么不建议使用new Array的方式生成新数组?

    Array构造函数有一个很大的缺陷,就是不同的参数,会导致它的行为不一致

    // 单个正整数参数,表示返回的新数组的长度
    var arr = new Array(1);
    console.log(arr); //[empty]
    
    // 非正整数的数值作为参数,会报错
    new Array(3.2) // RangeError: Invalid array length
    
    // 多参数时,所有参数都是返回的新数组的成员,该方式是正常情况
    new Array(1, 2) // [1, 2]
    

    数组中有哪些用于遍历的方法?

    1. map
      • 返回新数组
      • 回调函数接受三个参数:当前成员、当前位置和数组本身
      • map方法不会跳过undefined和null,但是会跳过空位
      • 可以接受第二个参数,用来绑定回调函数内部的this变量
    2. forEach
      • 不返回值,只用来操作数据
      • 回调函数接受三个参数:当前值、当前位置、整个数组
      • forEach方法不会跳过undefined和null,但会跳过空位
      • 可以接受第二个参数,用来绑定回调函数内部的this变量
      • forEach方法无法中断执行,总是会将所有成员遍历完
    3. filter
      • 过滤数组成员,满足条件的成员组成一个新数组返回
      • 回调函数接受三个参数:当前成员,当前位置和整个数组
      • 可以接受第二个参数,用来绑定参数函数内部的this变量
    4. some, every
      • 返回一个布尔值
      • 可以接受第二个参数,用来绑定参数函数内部的this变量
    5. reduce,reduceRight
      • 返回一个值,依次处理数组的每个成员,最终累计为一个值
      • 回调函数接受以下四个参数:累积变量(默认数组第一项),当前变量(默认数组第二项),当前位置(从0开始)原数组

    相关文章

      网友评论

          本文标题:回味JS(三)JS的内置对象

          本文链接:https://www.haomeiwen.com/subject/gzietctx.html