in
prop in object
- 如果指定的属性在指定的对象或其原型链中,则in运算符返回true
- 对于对象
{}
,prop是其key;对于[]
,prop是其index或内置属性。
const car = { make: 'Honda', model: 'Accord', year: 1998 };
console.log('make' in car);
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
console.log(0 in trees);
console.log(3 in trees);
console.log(5 in trees);
console.log("bay" in trees);
console.log("length" in trees);
console.log(Symbol.iterator in trees);
console.log("PI" in Math);
delete car.make;
console.log(car);
if ('make' in car === false) {
car.make = 'Suzuki';
}
console.log(car.make);
delete trees[3];
console.log(trees);
console.log(3 in trees);
hasOwnProperty()
obj.hasOwnProperty(prop)
- 会返回一个布尔值,指示对象自身属性中是否具有指定的属性(不包括原型,继承)
const object1 = {};
object1.property1 = 42;
console.log(object1.hasOwnProperty('property1'));
console.log(object1.hasOwnProperty('toString'));
var triangle = {a: 1, b: 2, c: 3};
function ColoredTriangle() {
this.color = 'red';
}
ColoredTriangle.prototype = triangle;
var obj = new ColoredTriangle();
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
console.log(`111:obj.${prop} = ${obj[prop]}`);
} else{
console.log(`222:obj.${prop} = ${obj[prop]}`);
}
}
for(var prop in obj){
console.log(`333:obj.${prop} = ${obj[prop]}`);
}
Object.getOwnPropertyNames()
Object.getOwnPropertyNames(obj)
- 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
- 不会获取到原型链上的属性。
- 枚举属性的顺序与通过 for...in 循环(或 Object.keys)迭代该对象属性时一致。数组中不可枚举属性的顺序未定义。
var arr = ["a", "b", "c"];
console.log(Object.getOwnPropertyNames(arr));
var obj = { 0: "a", 1: "b", 2: "c"};
console.log(Object.getOwnPropertyNames(obj).sort());
Object.getOwnPropertyNames(obj).forEach(function(val, idx, array) {
console.log(val + " -> " + obj[val]);
});
var my_obj = Object.create({}, {
getFoo: {
value: function() { return this.foo; },
enumerable: false
}
});
my_obj.foo = 1;
console.log(Object.getOwnPropertyNames(my_obj).sort());
Object.getOwnPropertyNames('foo');
Object.keys()
Object.keys(obj)
- 会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr));
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.keys(obj));
var anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj));
var myObj = Object.create({}, {
getFoo: {
value: function () { return this.foo; }
}
});
myObj.foo = 1;
console.log(Object.keys(myObj));
for...in
for (variable in object) statement
- 在每次迭代时,variable会被赋值为不同的属性名。
- 以任意顺序遍历一个对象的除Symbol以外的可枚举属性。
- 所有可枚举的属性都会返回
- 输出是无序的(由于对象中的属性时无序的)
- 为遍历对象属性而构建的,不建议与数组一起使用
var obj = {a:1, b:2, c:3};
for (const prop in obj) {
console.log("obj." + prop + " = " + obj[prop]);
}
for...of
- 在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句,迭代结果是值,而非属性/索引。
- 对于for...of的循环,可以由break, throw continue 或return终止。在这些情况下,迭代器关闭。
let iterable = [10, 20, 30];
for (const value of iterable) {
console.log(value);
}
let iterable = "boo";
for (let value of iterable) {
console.log(value);
}
Object.prototype.objCustom = function() {};
Array.prototype.arrCustom = function() {};
let iterable = [3, 5, 7];
iterable.foo = 'hello';
for (let i in iterable) {
console.log(i);
}
for (let i in iterable) {
if (iterable.hasOwnProperty(i)) {
console.log(i);
}
}
for (let i of iterable) {
console.log(i);
}
forEach()
arr.forEach(callback(currentValue [, index [, array]])[, thisArg])
- callback为数组中每个元素执行的函数,该函数接收一至三个参数:currentValue数组中正在处理的当前元素。index 可选,数组中正在处理的当前元素的索引。array 可选,forEach() 方法正在操作的数组。thisArg 可选,可选参数。当执行回调函数 callback 时,用作 this 的值。
- 按升序为数组中含有效值的每一项执行一次 callback 函数,那些已删除或者未初始化的项将被跳过
- 如果 thisArg 参数有值,则每次 callback 函数被调用时,this 都会指向 thisArg 参数。如果省略了 thisArg 参数,或者其值为 null 或 undefined,this 则指向全局对象。
- 与 map() 或者 reduce() 不同的是,它总是返回 undefined 值,并且不可链式调用。
const items = ['item1', 'item2', 'item3'];
const copy = [];
for (let i=0; i<items.length; i++) {
copy.push(items[i]);
}
items.forEach(function(item){
copy.push(item);
});
map()
arr.map(function callback(currentValue[, index[, array]]) {// Return element for new_array }[, thisArg])
- 创建一个新数组,其结果是该数组中的每个元素是调用一次提供的函数后的返回值。
- 给原数组中的每个元素都按顺序调用一次 callback 函数。callback 每次执行后的返回值(包括 undefined)组合起来形成一个新数组。 callback 函数只会在有值的索引上被调用;那些从来没被赋过值或者使用 delete 删除的索引则不会被调用。
var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
var kvArray = [{key: 1, value: 10},
{key: 2, value: 20},
{key: 3, value: 30}];
var reformattedArray = kvArray.map(function(obj) {
var rObj = {};
rObj[obj.key] = obj.value;
return rObj;
});