Перечисление объектов JavaScript, изучение массива классов (4)

Перечисление объектов

Поскольку в
Когда мы проходим по массиву, мы можем использовать метод length, чтобы узнать длину массива, а затем установить верхний предел цикла для обхода, но у объекта нет метода длины, мы можем использовать только for в методе прохождения:

obj={
    
    
	work:student,
	name = "xxx",
	sex="male",
	proe:123,
}
for (var x in obj){
    
    
	console.log(x);
}

Результат программы выдаст по очереди work, name, sex и proe; когда мы хотим получить значения атрибутов по очереди, первое, что приходит на ум, будет:

for (var x in obj){
    
    
	console.log(obj.x);
}

Но результат превзойдет наши ожидания, он выдаст четыре undefined, почему это?
Что нам нужно знать, так это obj.x ------> obj ['x'] , эти две грамматики равны, когда мы каждый объект. Свойство, программа поможет нам сделать такое неявное преобразование. Таким образом, программа будет думать, что мы ищем свойство x в объекте obj, а если нет, то выведет undefined.Эту ошибку часто делают новички. Нам нужно только изменить код следующим образом:

for (var x in obj){
    
    
	console.log(obj[x]);
}

Таким образом, x будет использоваться как переменная вместо неявного преобразования в строку.

hasOwnProperty

Этот метод используется для определения всех атрибутов / методов, определенных им самим , а возвращаемое значение - это логический внутренний тип.

对象.hasOwnProperty("属性值/方法")

Пока он определен сам по себе, он будет возвращать истину, даже если мы определим его таким образом: определим Object.prototype.abc=123;атрибут в его прототипе верхнего уровня, когда мы оценим его, он все равно вернет нам истину, но когда мы захотим для оценки прототипа верхнего уровня Метод toString (), поскольку он автоматически определяется системой, он вернет true.

в

ABC in A

Этот метод аналогичен предыдущему. Он также используется для определения того, существует ли определенное свойство или метод в объекте, но разница в том, что его диапазон поиска находится во всей цепочке прототипов , независимо от того, определен ли он нами или нет, пока он существует, он вернет истину.

экземпляр

Этот метод используется для определения наличия прототипа B в цепочке прототипов A.

A instanceof B;

Мы можем использовать этот метод, чтобы оценить разницу между объектами и массивами. [] Instanceof Array возвращает true, а {} instanceof Array возвращает false.

arguments.callee

Метод вызываемого объекта определен в объекте arguments для определения ссылки на функцию. Когда некоторой функции немедленного выполнения требуется использовать рекурсию, обнаруживается, что у нее нет имени функции, поэтому мы будем использовать этот метод:

//递归计算100的阶乘
var test = (
	function (n){
    
    
	if (n === 1)
		return;
	else
		return n * arguments.callee(n-1);
}(100))

fun.caller

Возврат текущей среды вызова в основном предназначен для того, чтобы отличить ее от метода вызываемого объекта: один возвращает текущую среду, а другой возвращает ссылку на функцию.

клон

Клонирование также можно назвать копированием. Чтобы полностью скопировать объект в другой объект, мы можем использовать функции для обхода исходного объекта, а затем использовать новый объект для получения свойств исходного объекта одно за другим. Если свойства находятся в Исходный тип, мы копируем только данные поверхностного слоя, но когда атрибут является эталонным значением, мы копируем адрес эталонного значения. Когда мы изменяем исходный атрибут, соответствующий атрибут скопированного объекта также будет затронут , поэтому мы Чтобы сделать дальнейшее оптимизированное клонирование, напишите следующую функцию для решения вышеуказанных проблем:

obj={
    
    
	name:"xxx,
	a:1,
	b:[1,2,3,4],
	c:{
    
    
		c1:1,
		c3:3,
		c2:2
	}
};
obj1={
    
    };

function Clone(target,origin){
    
    
	var target = target || {
    
    };
	var toStr = Object.prototype.toString();
	var strRes = "[Object,Array]";
	for (var proe in origin){
    
    
		if(origin.hasOwnProperty(proe)){
    
    
			if(typeof(origin[proe]) !== 'null' && typeof(origin[proe]) == 'Object'){
    
    
				if(toStr.call(origin[proe] == strRes)){
    
    
					target[proe] = [];
				}
				else{
    
    
					target[proe] = {
    
    };
				}
				Clone(origin[proe],target[proe]);
			}
			else{
    
    
				target[proe] = origin[proe];
			}
		}
	}
	return target;
}

obj и obj1 представляют клонированные и клонированные объекты соответственно. Функция Clone в основном выполняет следующие функции:

  • Если пользователь не передал объект для клонирования, используйте вместо этого {},
  • Определите пользовательские свойства клонированного объекта и просматривайте их один за другим
  • Используйте typeof, чтобы определить, является ли текущий атрибут исходным эндотипом, и выполните соответствующие шаги.
  • Оцените конкретный эндотип эталонного эндотипа и снова рекурсивно клонируйте в соответствии с другими результатами.
    Таким образом, на клонированный объект больше не будет влиять изменение данных исходного объекта.

Множество

Undefined существует в операции с массивом. Когда мы ** a = [1,2,3 ,,, 4] ** для определения такого массива, он автоматически заполнит пустое значение в undefined вместо того, чтобы сообщать об ошибке, и массив выходит за пределы доступа, он также вернет undefined. Проверка массивов в js все еще относительно свободна. Как правило, об ошибках не сообщается. Есть два способа определить его: один является буквальным выражением, а другой - для создания объекта массива для определения.
Вот несколько методов работы с массивами:

Измените исходный массив

  • push метод
    Этот метод может добавить t элементов в конец исходного массива, и количество добавлений не ограничено.
Array.prototype.push = function (target){
    
    
	this[this.length] = target;
	this,length++;
}

Приведенный выше код является методом push в прототипе массива. Базовая основа помогает нам понять, как изменить значение атрибута в массиве классов.

  • Метод pop
    Этот метод может удалить последний элемент из исходного массива.

  • Метод unshift
    Этот метод может последовательно добавлять элементы вверху исходного массива, и количество добавлений не ограничено.

  • метод shift
    Этот метод может удалить первый элемент из исходного массива.

  • Обратный метод
    Этот метод может изменить исходный массив.

  • Метод splice
    Этот метод используется для вырезания массива, а отрицательное число представляет собой обратный элемент. Можно выбрать до трех параметров,

    • Первый параметр: выбрать стартовый элемент для резки
    • Второй параметр: выберите количество разрезов.
    • Третий параметр: выберите значение наполнения после резки.
  • Метод sort
    используется для сортировки массива, но если вы просто вызовете его с помощью метода array name.sort (), результат может отличаться от того, что мы себе представляли. Он будет сортировать по кодировке символов, но метод сортировки позволяет Мы передаем функция для настройки и сортировки в соответствии с нашими идеями, конкретный синтаксис выглядит следующим образом:

a = [1,4,-3,4,6,7,2,4,5];
a.sort(
	//当返回值为正数的时候,保持位序不变
	//当返回值为负数的时候,交换两数的位置
	//当返回值为0的时候,保持位序不变
	function (a,b) {
    
    
		if(a < b){
    
    
			return 1;
		}
		else{
    
    
			return -1;
		}
	}
)

В приведенном выше коде мы определяем метод положительной сортировки. Из комментариев мы можем узнать, как сортировать, о чем можно судить по возвращаемому значению, определенному нами самим. Внутренняя сортировка эквивалентна алгоритму пузырьковой сортировки, который вызывается шаг за шагом. Эта функция передается для вынесения суждений. Конечно, в коде есть некоторые части, которые можно упростить. Мы можем напрямую изменить тело функции, return a-b;чтобы массив по-прежнему можно было отсортировать в положительном порядке, в противном случае он будет отсортирован в обратном порядке.

  • Совместное использование небольшого упражнения по запросу
    Если нам нужно, чтобы массив каждый раз отображался в неупорядоченном порядке, как использовать метод сортировки для этого?
    • Фактически, мы можем использовать случайное случайное число и сортировку вместе, чтобы использовать Math.random()метод для возврата числа в диапазоне (0, 1) каждый раз, поэтому мы позволяем ему вычитать 0,5, тогда возвращаемое значение может быть отрицательным или положительным. это как возвращаемое значение функции параметра сортировки может удовлетворить наши потребности.

Не меняйте исходный массив

  • Метод concat
    Этот метод используется для соединения двух массивов и возврата результата без изменения исходного массива.
  • метод соединения
    Этот метод используется для соединения массивов со значениями формальных параметров и преобразования их в строки для возврата.
  • toString метод
    Этот метод используется для преобразования массива в строку и ее возврата.
  • slice метод
    Этот метод используется для перехвата элементов массива, до двух параметров, от начальной позиции до конечной позиции перехвата, если есть только один параметр, по умолчанию выполняется перехват от этой позиции до последней. Отрицательные числа представляют собой взаимные элементы

Как массив

Объект, очень похожий на массив, такой как хорошо известный аргумент, хранит наши фактические параметры как массив, но у него нет всех методов, которые есть в массиве, поэтому мы называем его подобным массиву.

var obj = {
    
    
 
                "0" : 'a',
 
                "1" : 'b',
 
                "2" : 'c',
 
                "length" : 3,
 
                "push" : Array.prototype.push
 
            }

Таким образом, мы берем на себя инициативу добавить ему свойство length и метод push массива, сделав его более похожим на массив, а затем мы можем вызвать его метод push.Перед этим нам нужно понять суть метода push Чтобы понять, как протолкнуть атрибут массива классов, о котором мы упоминали ранее, он добавляется в соответствии со значением атрибута length. Он добавил «3»: «d» после «2», и длина также стала 4. Это вещи, которых объект не может иметь.
Массив классов должен состоять из нескольких компонентов:
четыре лучших компонента массива классов.

  • Атрибут должен быть индексным (числовым) атрибутом.
  • Должен иметь атрибут длины
  • Лучше добавить метод push
  • «Splice»: Array.prototype.splice

Поделитесь небольшим упражнением для интервью с Alibaba

28var obj = {
    
    
 
                "2" : 'a',
 
                "3" : 'b',
 
                "length" : 2,
 
                "push" : Array.prototype.push,
 
            }
 
            obj.push(obj);

this.length равно 2, поэтому замените a на c, а length будет равно 3. Во второй раз this.length будет равно 2, измените d на d, и length + 1 станет 4.

var obj = {
    
    
 
                "2" : 'c',
 
                "3" : 'd',
 
                "length" : 2,
 
                "push" : Array.prototype.push,
 
            }

Поделиться методом дедупликации массива

Основная идея состоит в том, чтобы использовать объект, у которого не может быть атрибута с таким же именем, по очереди прочитать значение из массива, а затем перейти к объекту, чтобы определить, содержит ли он атрибут, если нет, определить его, если есть, это означает, что массив имеет большое значение, которое можно отфильтровать.

Array.prototype.unique=function () {
    
    
	var len = this.length,obj = {
    
    },arr = [];
	for(var i = 0;i < len;i++){
    
    
		if(!obj[this[i]]){
    
    
			obj[this[i]] = "xxx";//这里属性值可随意填写
			arr.push(this[i]);
		}
	}
	return arr;
}

Когда метод не определен в объекте, он возвращает undefined, если нет, он истинен, а затем сохраняется. Значение свойства может быть записано в любое значение, кроме 0, потому что, когда значение свойства читается, оно возвращает 0, и суждение остается верным. Таким образом, могут быть ошибки доступа.

рекомендация

отblog.csdn.net/baldicoot_/article/details/106237399