JS基础3
Object对象
(1)Object()(注意O是大写的)本身是一个工具函数,它可以将任意值转换为对象,
var obj=Object();
var obj=Object(undefined);
var obj=Object(null);
console.log(obj instanceof Object);
//输出为true
在以上代码中Object()
是把obj
转成一个空的对象,相当于是Undefined
和null
的,最后一行我们用instanceof
来验证看obj
对象是否为Object()
的一个实例,如果是返回true
,如果不是返回false
。
如果返回参数是原始对象的值,则会返回其数值类型所对应的实例。
var obj=Object(1);
console.log(obj instanceof Object);
console.log(obj instanceof Number);
var obj=Object('cool');
console.log(obj instanceof Object);
console.log(obj instanceof String);
var obj=Object(true);
console.log(obj instanceof Object);
console.log(obj instanceof Boolean);
//(返回了六个true)
如果其参数是一个对象,则直接返回对象值。
Object()方法还可以用来构造函数,即使用new
创造一个新得对象:
var obj= new Object();
上面这句话还可以这样写:
var obj={};
(2)Object()的静态方法:本身自带的方法
Object()
有很多静态方法比如这一对:key()
和getOwnPropertyNames()
,他们两者的区别如下所示:
var obj=['a','b'];
console.log(Object.getOwnPropertyNames(obj));
console.log(Object.keys(obj));
//返回['0','1','length']
//返回['0','1']
从一以上代码我们可以看出,keys()
方法返回的是可以枚举的属性 ,但是呢,getOwnPropertyNames()
方法它就变态了,它还返回了不可枚举的属性length
.
利用这。两个方法我们还可以返回属性的个数:
var obj=['a','b'];
console.log(Object.getOwnPropertyNames(obj).length);
console.log(Object.keys(obj).length);
//输出为3 2
var obj={
p1:'udsfo',
p2:'hfuid'};
console.log(Object.getOwnPropertyNames(obj).length);
console.log(Object.getOwnPropertyNames(obj).length);
//输出为2 2
Object()还有很多静态方法:
Object.isExtensible(obj)//判断对象是否 可以拓展
Object.getOwnPropertyNames(obj)//获取某个属性的描述
Object.defineProperty(obj)//通过描述对象那个,定义某个属性
Object.defineproperries(obj)//通过描述对象,定义多个属性
Object.preventExtensions(obj)//防止对象扩展
Object.seal(obj)//禁止对象配置
Object.isSealed(obj)//判断啊一个对象是否可以配置
Object.freeze(obj)//冻结一个对象
Object.isFrozen(obj)//判断一个对象是否被冻结
Object.create(obj)//该方法可以指定原型对象和属性,返回一个新的对象
Object.getPrototypeOf(obj)//获取对象的Prototype对象
(3)Object()对象的实例方法(定义在Object.prototype()上的方法)
Obect.protopyte.valueOf()
var obj=new Object();
obj.valueOf=function(){
return 2;
};
console.log(1+obj);
//输出3
Object.protopyte.toString()
这个方法一般可以用来判断数据的类型:
var obj={};
console.log(obj.toString());
//输出为[object Object]
注意两个输出第一个为小写的object
表示一个恐惧感对象。第二个一个大写的Object
表示该值的构造函数。
不顾哦我恩一般都直接用Object.prototype.toString.call(value);
来查看这个value
的类型,数值返回[object Numbers]
,NULL型返回[object Null]
,数组的话返回[object Array]
等。
Object.protopyte.toLocaletoString()
var date=new Date();
console.log(date.toString());
console.log(date.toLocaleString());
//输出结果为:Tue Oct 23 2018 13:21:40 GMT+0800 (GMT+08:00)
//2018-10-23 13:21:40
从上面的输出结果个人觉得toString()
更详细呢,额,但是文档上还补充说toLocaletoString
还和地域有关系,真的是厉害了我的天。
Object..protopyte.protopyte.toString()
这个方法是用来判断对象的属性是否为其自身的属性,并返回对应的布尔值。
var obj={
p:132
};
console.log(obj.hasOwnProperty('p'));
console.log(obj.hasOwnProperty('toString'));
//返回 true false
补充:一个关于闭包的解释:
在javascript中,我们在使用函数的内部变量时,可以取到外部变量。而当我们想在外部取得内部变量时,则需要闭包来解决,同时,我们有时候需要不让内部变量受到外部变量的“污染“,也需要闭包的使用,以下是简单的代码来帮助我们理解:
function parent(){
function child(){
var i=100;
return i;
}
return child();
}
console.log(parent());//输出100
以上代码我们可以看出闭包child()可以帮助我们在外部使用内部的变量i,闭包通常是函数里面套函数的形式。
var arr=[];
for(var i=0;i<3;i++){
arr[i]=(function (i){
{
console.log(i);
}
})(i);
}
console.log(arr[i]);
//输出为0 1 2
对以上代码给出解释如下,首先定义一个全局变量数组arr
,再定义一个全局变量i
,让i做自增运算,到3,再把一个传参的函数赋值给arr[]
数组,就可以让console,log(i)
分别取得每个i
的值,注意我们这里用到了在基础2中所提到的立即执行的函数表达式(IIFE),对console.log(i)
进行了立即执行的操作。最后输出arr[i]
。
`