1. Исходное значение и эталонное значение.
Исходное значение сохраняется в стеке, а ссылочное значение хранится в куче. Например, в программе:
Скопируйте код кода следующим образом:
функция Person(id,имя,возраст){
this.id = идентификатор;
это.имя = имя;
this.age = возраст;
}
варнум = 10;
вар бол = правда;
вар стр = "abc";
вар объект = новый объект ();
var arr = ['a','b','c'];
var person = new Person(100,"Девиз идиота",25);
2.неопределенный и нулевой
undefined: переменная не определена; это эксклюзивное значение типа Undef;
null: ссылка не выделяется; это исключительное значение типа Null.
тип (неопределенный) == неопределенный;
typeof(null) == объект;
неопределенное == ноль;
не определено!==ноль;
нулевой экземпляр объекта == false;
неопределенный экземпляр объекта == false;
Хотя существуют типы Undefine и Null, следующий пример показывает, что эти два типа невидимы, а это значит, что мы можем использовать только их значения:
Предупреждение (неопределенный экземпляр Неопределенный);
предупреждение (нулевой экземпляр Null);
3. Псевдомассив
Функции:
1) Имеет атрибут длины;
2) Доступ к данным в индексном порядке, как к массиву;
3) Не существует методов манипулирования данными, специфичных для массива, таких как push, pop, срез...
Псевдомассивы можно преобразовать в реальные массивы с помощью Array.prototype.slice:
var faceArray = {0: 'a', 1: 'b', length: 2} // Стандартный псевдомассив;
вар realArray = Array.prototype.slice.call(fakeArray);
Псевдомассивы в js: аргументы, node.childNodes, document.getElementsByTagName()...
Проблема в IE: node.childNodes в IE невозможно преобразовать с помощью среза.
Псевдомассив в Jquery: Jquery сам по себе является псевдомассивом:
оповещение($('.class1').length); оповещение($('.class1').[0].tagName);
4. О литералах простого типа
вар а = 1; б = правда, с = «ccc»;
Литералы, похоже, имеют типы
alert(typeof a);//число
alert(typeof b);//логическое значение
предупреждение(тип c);//строка
Но его нельзя измерить с помощью экземпляра.
предупреждение(экземпляр номера)//false
предупреждение (экземпляр объекта) // false
alert(b instanceof Boolean)//false
предупреждение(b экземпляр объекта)//ложь
предупреждение (c экземпляр строка) // ложь
предупреждение (c экземпляр объекта) // false
5. Атрибут прототипа функции и внутренний атрибут прототипа экземпляра объекта.
Каждая функция (конструктор) имеет атрибут прототипа, а каждый экземпляр объекта имеет невидимый (Mozilla делает его общедоступным и может быть получен через __proto__) внутренний атрибут прототипа, который указывает на атрибут прототипа конструктора. Прототип также может иметь свой атрибут. собственное свойство прототипа, которое формирует цепочку прототипов. Объект является верхним объектом, поэтому все цепочки прототипов в конечном итоге будут указывать на Object.prototype. При доступе к свойствам/методам экземпляра объекта. Начните поиск с самого экземпляра объекта. Если его невозможно найти, ищите вверх по цепочке прототипов, пока Object.prototype.prototype == null.
6. Маленький секрет конструктора
Скопируйте код кода следующим образом:
вар s = новая функция () {возвращение «ссс»};
оповещение(я);//[объект Object]
s = новая функция () {вернуть новую строку («ссс»)};
оповещение(я);//ссс
Объяснение этого кода:
Пока конструктор после выражения new возвращает ссылочный объект (массив, объект, функцию и т. д.), он перезаписывает анонимный объект, созданный методом new. Если он возвращает примитивный тип (когда возврата нет, он фактически возвращает). примитивный тип undef), то возвращается анонимный объект, созданный new.
7. Процесс создания объекта
Скопируйте код кода следующим образом:
функция Человек(имя){
это.имя = имя;
}
Человек.прототип = {
getName: function(){return this.name}
};
вар p = новый человек('чжансан');
Расшифруйте процесс создания p:
◦Создайте встроенный объект obj и инициализируйте его;
◦Укажите внутренний [[Prototype]] p на Person.prototype;
◦Используйте p в этом качестве и используйте параметр аргументы для вызова внутреннего метода Person [[Call]], то есть выполнения тела функции Person и возврата возвращаемого значения. Если возврат невозможен, возвращается неопределенное значение.
◦Если предыдущий шаг возвращает тип объекта, верните это значение в p, в противном случае верните obj.
8. Собственные свойства объекта и унаследованные свойства.
Скопируйте код кода следующим образом:
функция Человек(имя){
это.имя = имя;
}
Человек.прототип = {
тип: 'человеческий',
getName: function(){return this.name}
};
вар p = новый человек('чжансан');
alert(p.hasOwnProperty('type'));//false
p.type = 'рен';
alert(p.hasOwnProperty('type'));//true
Результат работы очень ясен. Свойства объекта не могут изменять свойство с тем же именем в его прототипе, а только создают свойство с тем же именем и присваивают ему значение.
9.Процесс создания функциональных объектов
Создайте встроенный объектный объект fn;
Установите для внутреннего [[Prototype]] fn значение Function.prototype;
Установите внутренний атрибут [[Call]], который представляет собой внутренне реализованный метод, обрабатывающий логику вызовов функций. (Просто понимается как указание на тело функции);
Установите для fn.length значение funArgs.length. Если функция не имеет параметров, установите для fn.length значение 0;
Конструктор fn.prototype указывает на саму fn;
Возврат фн.
10.Принцип экземпляра
Чтобы проверить, является ли a экземпляром B, вам необходимо проверить, находится ли объект, на который указывает прототип B (атрибут прототипа конструктора), в цепочке прототипов a.
11. Догадки о функции и предмете
alert(Function instanceof Function);//true
alert(Function instanceof Object);//true
alert(Object instanceof Function);//true
alert(Object instanceof Object);//true
Давно об этом думал, но так и не придумал...