В этой серии вы можете познакомиться с идеей функционального программирования, прочитав исходный код подчеркивания и реальный бой, вместо того, чтобы читать точность в длинных текстовых учебниках.
Подчеркивание около 1500 строк способствует написанию кода с низкой степенью связанности и соответствует идее функционального программирования, а также позволяет изучить разницу между эффективностью выполнения вызова и применения, а затем навыками оптимизации производительности кода.
Добро пожаловать на главную роль или посмотрите этот сериал, ваше внимание - самая большая мотивация автора, давайте продолжим вместе добиваться прогресса.
Эта серия складов:GitHub.com/looks9…
Typeof
Мы все используем typeof — это команда, используемая для определения типа данных, которой достаточно для удовлетворения потребностей определения типа данных в обычных сценариях:
var obj = {
name: 'zhangxiang'
};
function foo() {
console.log('this is a function');
}
var arr = [1,2,3];
console.log(typeof 1); // number
console.log(typeof '1'); //string
console.log(typeof true); //boolean
console.log(typeof null); //object
console.log(typeof undefined); //undefined
console.log(typeof obj); //object
console.log(typeof foo); //function
console.log(typeof arr); //object
Как видите, команда typeof может определять все основные типы данных в javascript (Null, Undefined, Boolean, String, Number), хотя null использует typeof для возврата строки объекта, но это не имеет значения
Его базовое использование, но в некоторых сложных сценариях, таких как различие типов между объектом и нулем, массивом и объектом, функцией и объектом и т. д., typeof может оказаться недостаточным.
Таким образом, typeof будет использоваться в относительно простых сценариях, например, когда вы можете почти определить, что это за данные, а затем немного их различать Вот простой пример, иллюстрирующий ситуацию:
function unique(array){
var hash = {};
var result = [], key;
array.forEach(function(item, index){
key = item;
if(typeof item === 'string') {
key = '_' + item;
}
if(!hash[key]) {
result.push(item);
} else {
hash[key] = true;
}
});
return result;
}
instanceof
instanceof на самом деле подходит для оценки объектов экземпляра пользовательского класса, а не для оценки собственных типов данных, например:
// a.html
<script>
var a = [1,2,3];
</script>
//main.html
<iframe src="a.html"></iframe>
<script>
var frame = window.frame[0];
var a = frame.a;
console.log(a instanceof Array); // false
console.log(a.contructor === Array); //false
console.log(a instanceof frame.Array); // true
</script>
В чем причина приведенных выше результатов?На самом деле цепочка прототипов не разделяется между iframe, потому что они имеют независимые среды выполнения, поэтому массив a во фрейме a не будет экземпляром объекта этой среды выполнения. конструктор
Конкретные методы массива (или других типов данных) или свойства сортировки, среза и т. д., если объект также имеет свойства сортировки, среза, могут привести к неверному суждению, поэтому наиболее надежным методом является использование метода Object.prototype.toString.
Object.prototype.toString
С помощью метода Object.prototype.toString можно получить точный тип переменной.
function foo(){};
Object.prototype.toString.call(1); '[object Number]'
Object.prototype.toString.call('1'); '[object String]'
Object.prototype.toString.call(NaN); '[object Number]'
Object.prototype.toString.call(foo); '[object Function]'
Object.prototype.toString.call([1,2,3]); '[object Array]'
Object.prototype.toString.call(undefined); '[object Undefined]'
Object.prototype.toString.call(null); '[object Null]'
Object.prototype.toString.call(true); '[object Boolean]'
....
Принцип Object.prototype.toString заключается в том, что при вызове он принимает значение свойства [[Class]] внутри значения, а затем объединяет его в строку типа '[object' + [[Class]] + ']' и возвращает его. Затем мы используем метод call, чтобы получить тип данных любого значения.
Полезные функции определения типа данных
isArray polyfill
isArray — это встроенная функция оценки типов данных для типов массивов, но будут проблемы с совместимостью, поэтому метод записи в символе подчеркивания симуляции выглядит следующим образом:
isArray = Array.isArray || function(array){
return Object.prototype.toString.call(array) === '[object Array]';
}
isNaN polyfill
Чтобы судить о том, является ли число NaN, нельзя просто использовать ===, потому что NaN не равно никакому числу, включая само себя, поэтому:
isNaN: function(value){
return isNumber(value) && isNaN(value);
}
isNumber здесь оценивается по Object.prototype.toString, упомянутому выше, а затем isNaN используется для оценки значения.Что касается того, почему необходимо судить, является ли это числовым типом, прежде чем оценивать isNaN, это потому, что сам NaN
Это также числовой тип (можно знать Object.prototype.toString), в ES6 isNaN, только если значение числового типа использует NaN, он вернет true, это для имитации ES6 isNaN.
Определите, является ли это элементом DOM
В реальных проектах иногда нам может понадобиться судить, является ли это объектом элемента DOM, тогда мы используем атрибут nodeType, специфичный для объекта DOM, при оценке:
isElement: function(obj){
return !!(obj && obj.nodeType === 1);
}
определить, является ли это объектом
isObject: function(obj){
var type = typeof obj;
return type === 'function' || typeof === 'object' && obj !== null;
}
Объект здесь имеет узкое определение, которое обычно называют коллекцией ключ-значение или функциональной функцией, а не нулевым значением.
Определите, является ли полифилл объекта аргументов
О том, является ли объект объектом arguments, можно судить по Object.prototype.toString, но нижняя версия браузера не поддерживает его, они возвращают [object Object], поэтому он должен быть совместим:
isArguments: function(obj){
return Object.prototype.toString.call(obj) === '[object Arguments]' || (obj != null && Object.hasOwnProperty.call(obj, 'callee'));
}
Принцип совместимости заключается в использовании метода hasOwnProperty объекта, чтобы определить, имеет ли объект свойство callee, чтобы определить, является ли он объектом arguments.
Если вы чувствуете, что что-то приобрели, перейдите на github, чтобы дать автору звезду, чтобы показать свою поддержку, спасибо.
Эта серия складов:GitHub.com/looks9…