回味JS(三)JS的内置对象
2019-05-29 本文已影响0人
ArmorVon
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方法接受三个参数,依次如下。
- object:属性所在的对象
- propertyName:字符串,表示属性名
- 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]
数组中有哪些用于遍历的方法?
- map
- 返回新数组
- 回调函数接受三个参数:当前成员、当前位置和数组本身
- map方法不会跳过undefined和null,但是会跳过空位
- 可以接受第二个参数,用来绑定回调函数内部的this变量
- forEach
- 不返回值,只用来操作数据
- 回调函数接受三个参数:当前值、当前位置、整个数组
- forEach方法不会跳过undefined和null,但会跳过空位
- 可以接受第二个参数,用来绑定回调函数内部的this变量
- forEach方法无法中断执行,总是会将所有成员遍历完
- filter
- 过滤数组成员,满足条件的成员组成一个新数组返回
- 回调函数接受三个参数:当前成员,当前位置和整个数组
- 可以接受第二个参数,用来绑定参数函数内部的this变量
- some, every
- 返回一个布尔值
- 可以接受第二个参数,用来绑定参数函数内部的this变量
- reduce,reduceRight
- 返回一个值,依次处理数组的每个成员,最终累计为一个值
- 回调函数接受以下四个参数:累积变量(默认数组第一项),当前变量(默认数组第二项),当前位置(从0开始)原数组