Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Перебор объектов (https://javascript.ru/forum/misc/61780-perebor-obektov.html)

DivMan 08.03.2016 13:57

Перебор объектов
 
https://jsfiddle.net/ou6q8za6/1/

Я не понимаю, как это работает.

Почему сначала выскакивает последний return, а не тот, который вложенный в перебор ключей?

Или если в объекте нету ключей, то код, который находится в цикле игнорируется?

destus 08.03.2016 14:19

DivMan,
ну в schedule есть некоторые унаследованные методы, которые однако неперечислимы, а цикл for..in перебирает только все перечисляемые свойства объекта и его цепочки прототипов. Чтобы увидеть все неперечисляемые поля надо использовать Object.getOwnPropertyNames.
function isEmpty(obj) {
            var result = [];
            for (objectToInspect = obj; objectToInspect !== null; objectToInspect = Object.getPrototypeOf(objectToInspect)) {
                result = result.concat(Object.getOwnPropertyNames(objectToInspect));
            }
            //alert(result) //здесь все методы 
            if (result)
                return "есть";
            else return "нету";
        }

        var schedule = {};

        alert(isEmpty(schedule));

        schedule["8:30"] = "подъём";

        alert(isEmpty(schedule));

DivMan 08.03.2016 14:41

Как то сложно

destus 08.03.2016 14:46

DivMan,
https://learn.javascript.ru/native-prototypes

DivMan 08.03.2016 14:50

Ну получается, если в объекте нету ключей, то код, который находится в цикле игнорируется?

destus 08.03.2016 15:14

DivMan,
если вы не определяли в Object.prototype свои методы и свойства или определяли, но указали в дескрипторе объекта enumerable : false, считайте что так.

DivMan 08.03.2016 20:11

Ещё 1 вопрос, почему выводит максимальное значение?

http://plnkr.co/edit/xwJuT94gQRdOLPISFX7n?p=preview

var salaries = {
  "Вася": 100,
  "Петя": 300,
  "Даша": 250
};



var max = 0;

for(var key in salaries){
  if(salaries[key] > max){
    max = salaries[key]
  }
}
alert(max)


Первое условие true, значит в переменную max записывается значение 100.
Второе условие true, значит переменная max перезаписывается на значение 300.
Третье условие true, значит переменная max перезаписывается на значение 250.

И по моей логике, должно вывести 250, потому что оно записалось последним.
Почему выводит максимальное, как это рассчитывает?

destus 08.03.2016 20:23

Цитата:

Третье условие true, значит переменная max перезаписывается на значение 250.
:blink: А с каких это пор 250 больше чем 300?

DivMan 08.03.2016 20:37

Я не писал, то, что 250 больше чем 300.

Я хочу узнать, почему он вычисляет наибольшее значение, а не выводит последнее.

DivMan 08.03.2016 20:40

Я кажись понял, когда в переменную max попало значение 300, то при сравнение с 250, условие становится false и переменная не перезаписывается. :dance:

DivMan 14.08.2016 16:21

Такой способ перебора с помощью for of, это тоже самое, что и через обычный for?

let o = {
	origin: 100
}

let o2 = {
	origin: 200
}

function sum(){
	let origin = this.origin;
	
	for(let arg of arguments){
		origin += arg
	}
}
	
	return origin
}

console.log(sum.call(o, 2,3))



let o = {
	origin: 100
}

let o2 = {
	origin: 200
}

function sum(){
	let origin = this.origin;
	
	for(var i =0; i < arguments.length; i++){
	origin += arguments[i]
}
	
	return origin
}

console.log(sum.call(o, 2,3))

DivMan 06.09.2016 10:33

В первой итерации будет flase, условие не выполняется и переменная не изменяется
Во второй будет true и переменная меняет значение на large

В третей итерации условие false, а во второй же итерации, переменная изменила значение
и почему же в третей итерации выводится изначально значение?

http://plnkr.co/edit/Q1fcLHfd2Z2iIdr9x2tN?p=preview

warren buffet 06.09.2016 14:15

DivMan, потому что ты задрал своей тупизной.

var size = 'small'; - это стоит внутри цикла и стало быть объявляется каждый раз.

Я понимаю, что по-первости даже самое элементарное не доходит, но ты ведь уже кандидат блин.

warren buffet 06.09.2016 15:04

Начни уже решать прикладные задачи, хватит собаководством заниматься. На практике учиться не легче, но зато интереснее.

DivMan 06.09.2016 19:16

А можешь подкинуть, какую-нибудь задачу?

warren buffet 07.09.2016 10:12

Их тут десятками каждый день подкидывают. Сделай рони. )))


Часовой пояс GMT +3, время: 13:29.