1. Array.isArray()
- 作用:判断某个对象是否为数组
- 使用:
- Array.isArray(对象)
- 返回值:布尔类型值
- 注意:存在兼容性问题(ES5)
不使用该方法如何判断一个对象是否为数组?
插入介绍toString()方法的使用
var o = {};
var a ={};
var b = {name:"张三"};
o["a"] = "Test-a";
o["b"] = "Test-b";
o[b] = "Demo-b";
o[a] = "Demo-a";
console.log(o.a); //Test-a
console.log(o.b); //Test-b
console.log(o[a]); //Demo-b
console.log(o[b]); //Demo-b
console.log(o["a"]); //Test-a
console.log(o["b"]); //Test-b
通过[]语法设置对象时的原则与注意点:
- []中存放的是字符串,那么这个字符串就直接作为key
- []中存放的不是字符串,那么就把[]中部分当成一个变量来处理,查找最近变量,获取其值
2.1. 如果对应的值是字符串,那么就直接作为key
2.2 如果对应的值是对象,那么就尝试把这个对象转换为字符串(toString)
- toString():返回的事对当前对象的字符串描述。
- object类型对象的toString: Object.prototype.toString(),返回[类型 构造函数](eg. [object Object])
- 数组类型 toString: Array.prototype.toString(),返回数组元素值得字符串
- 解决以上问题方法:返回true时则为数组,false则不是数组。
if(Array.isArray != 'function'){
Array.isArray = function(obj){
return Object.prototype.toString.call(obj) == "[object Array]";
}
}
2. instanceof
- 原理:检查该构造函数的原型对象是否在当前对象的原型链上面,如果在结果为true,如果不在结果为fasle。原型链详解
3. Object.prototype的部分方法属性
- constructor
- 构造器属性:指向构造函数
- 对象.constructor:该属性不是这个对象的实例属性,是其原型对象上的属性,指向创建该对象的构造函数。
- 原型对象.constructor:该属性是这个原型对象的实例属性,指向与其相关联的构造函数。
- hasOwnProperty
- 检查对象中是否存在某个指定的成员(仅仅检查实例属性)
- isPrototypeOf
- 作用:判断对象是否是另一个对象的原型对象
- 原型对象.isPrototypeOf(对象)。 注意点:检查整条原型链(原型链详解)
- propertyIsEnumerable
- 对象.propertyIsEnumerable(属性)
- 检查对象的属性是否是可以被枚举。如果是可以枚举的,可以使用for..in循环遍历打印
- toLocaleString
- 返回的是一个本地化字符串描述信息,大部分情况下同toString方法
- toString
- 如果是object类型的对象,返回的是[object Object]
- 如果是其他类型的对象,返回的是对应的字符串描述
- 如果是Number类型调用,那么可以接受一个参数(几进制),如果参数不传递那么默认是10进制的
- valueOf(获得这个对象对应的值。)
- 基本包装类型,返回对应的基本类型值。
- 其他的对象,返回的是这个对象本身
- 日期类型的对象,返回时间戳
4. Object的静态成员
- Object.apply(借用其他对象的方法)
- 格式:对象1.方法.apply(对象2,[参数1,参数2..])
- Object.arguments(接收函数调用时候传入的实参)
- Object.assign(拷贝属性(一次性拷贝多个对象的属性))
- 格式:Object.assign(目标对象,要拷贝属性的对象1,要拷贝属性的对象2...)
- Object.bind(绑定对象调用方法,同call和apply几乎是一样。)
- Object.call(同apply方法)
- 对象1.方法.call(对象2,参数1,参数2..)
- Object.caller(调用者,谁调用当前的方法,那么就指向谁)
- Object.create(创建对象并且该对象的原型对象)
- var o = Object.create(obj);//obj为新创建的对象o的原型对象
- Object.getOwnPropertyDescriptor(获取对象中某个属性的描述信息(描述对象))
- 属性信息:
- 该属性对应的值
- 该属性是否是可枚举的enumerable
- 该属性是否是可配置的configurable
- 可配置的 该属性可以被删除,并且可以被修改为不可配置的
- 不可配置的 该属性不可以被删除 并且不可以被修改为可配置的
- 该属性是否是可重写的writable
- Object.getOwnPropertyDescriptors(获得对象中多个属性的描述信息)
- Object.defineProperty(设置对象中某个属性的描述信息(对象))
- 第一个参数:对象
- 第二个参数:属性
- 第三个参数:描述对象
注意点:
如果是已经存在的属性,在设置时省略不写,默认值全部都是true
如果是新增加一个属性,在设置时省略不写,默认值全部都是false
var o = {
name:"小明",
des:"描述信息"
}
//console.log(Object.getOwnPropertyDescriptor(o, "name"));
Object.defineProperty(o, "name",{
configurable:true, //删除属性,以及配置
writable:true, //重写属性 修改
enumerable:false,
value:"明明"
});
- Object.getOwnPropertyNames(获得对象所有的实例属性名(key),返回值是一个数组,不论该属性是否是可枚举的,都可以获取)
- Object.keys(获取所有的key)
- 不包含原型对象中的key
- 不能返回不可枚举的属性
- Object.getPrototypeOf(获取原型对象)
- Object.preventExtensions|Object.isExtensible
- 禁止对象扩展(不能给对象添加属性或者是方法)
- Object.seal
- (密封对象(对象不能添加成员 + 不能删除成员))
- Object.freeze
- 冻结对象(对象不能添加成员 + 不能删除成员 + 不能修改成员)
5. 函数内部的隐藏参数
- this (指向一个对象)(函数的调用方法会影响到函数内部this的指向)
- 对象.方法 (以对象的方法来进行调用) this->对象本身
- 以普通函数方式进行调用 this->window(非严格模式)
- 以构造函数的方式调用 this->新创建的对象
- 函数上下文call|apply this->绑定的第一个参数
- arguments(一个类似于数组的结构,用来接收函数调用时传入的实参。)
- arguments.length:函数调用时候实际参数的个数
- 函数.length:函数期望的形参个数
6. callee 和 caller
- callee
- 返回正在执行的函数本身的引用,它是arguments的一个属性
- 常用于递归
- arguments.callee.length是形参的长度,arguments.length是实参的长度。
- caller
- 返回一个函数的引用,该函数调用了当前函数
- 注意:window来调用函数的时候,caller指向null而不是window
7. with
- 作用:缩短代码
- 使用:with(对象){} 在{}中可以通过无前缀的方式来操作对象的成员
注意点:
- this的指向->window
- 在{}中不能使用没有前缀的方式来添加成员,如果要添加成员必须要使用前缀
- 会破坏js代码的词法作用域,性能降低
- 严格模式下已经被禁止