这篇是自己阅读你不知道的js上篇关于对象的📒。
1.内置对象:
如 String、Number、Boolean、Object、Function、Array、Date、RegExp、Error。实际上这些是一些内置函数,这些内置函数可以当做构造函数来使用,从而创建一个对应子类型的新对象。
var strP = "i am iverson";
typeof strP; //"string"
strP instanceof String; //false
var strObj = new String("我是海贼猎人索隆");
typeof strObj ;//Object
strObj instanceof String; // true;
2.[]和.对象的访问:
-
.属性访问:要求属性名满足标识符命名规范。
-
[]键访问:可以接受任意的
utf-8/Unicode字符串作为属性名。
如果要使用Super-man的属性,就必须使用["Super-man"],因为Super-man并不是一个幼小的标识符属性名。
对象中的属性名永远都是字符串
3.检测存在:
下面是一个检测对象中是否存在某个属性的方法
var myObj={
name:"李白打野换酒钱"
};
console.log("name" in myObj);
//true;
console.log("age" in myObj);
//false;
myObj.hasOwnProperty("name");
//true
myObj.hasOwnProperty("age");
//false;
for(var k in myObj){
console.log("k",k,myObj[k])
}
//k name 李白打野换酒钱
Object.keys(myObj);
//["name"]
Object.getOwnPropertyNames(myObj);
//["name"]
in操作符:in操作符会检查属性是否在对象以及prototype原型链上。hasOwnProperty:只会检查属性是否在myObj对象上,不会检查原型链。Object.keys():会返回一个数组,包含所有可枚举属性Object.getOwnPropertyNames():会返回一个包含所有属性的数组,无论是否可枚举。
4.for...of遍历:
for...of循环首先会向被访问的对象请求一个迭代器对象,然后通过迭代器对象的next()方法来遍历所有返回值。
//for of 循环
var myArr = [1,2,3];
for(var v of myArr){
console.log(v);
}
//1,2,3
//迭代器对象
var myArr1 = [1,2,3];
var it = myArr1[Symbol.iterator]();
it.next();//{value:1,done:false};
it.next();//{value:2,done:false};
it.next();//{value:3,done:false};
it.next();//{done:true};
//书中对象使用迭代器的例子
var myObject={
a:2,
b:3
}
Object.defineProperty(myObject,Symbol.iterator,{
enumerable:false,
writable:false,
configurable:true,
value:function(){
var o = this;
var idx = 0;
var ks = Object.keys(o);
return {
next:function(){
return {
value:o[ks[idx++]],
done:(idx > ks.length)
}
}
}
}
});
var it = myObject[Symbol.iterator]();
it.next();//{value:2,done:false};
it.next();//{value:3,done:false};
it.next();//{done:true};
for(var t of myObject){
console.log(t);
};
//2,3