Еще маленькая ошибка (сам только что у себя заметил):
var r = (new Array(5)).map(function(I, i) { return i; }); alert(r.length); Выводит "0", при нативной реализации выводит "5". Ну и проверки на (forEach, map, filter, every, some) и (reduce, reduceRight), возможно, достаточно делать по одной на всех: if (!('forEach' in arrayProto)) { arrayProto.forEach = function() {/* ..... */}; arrayProto.map = function() {/* ..... */}; arrayProto.filter = function() {/* ..... */}; arrayProto.every = function() {/* ..... */}; arrayProto.some = function() {/* ..... */}; } if (!('reduce' in arrayProto)) { arrayProto.reduce = function() {/* ..... */}; arrayProto.reduceRight = function() {/* ..... */}; } |
Цитата:
Цитата:
|
Цитата:
var range = [], i = 10; while (i) { range[--i] = i + 1; } alert(range); хотя и так нормально, в общем вечер свободный, вот и маюсь. |
А чем Array.range не угодил? Он же для перебора чисел по порядку и придуман.
|
Цитата:
|
Цитата:
Может убрать if(a in array)? Что-то ща пытаюсь представить зачем эта проверка нужна, чет туго. |
Пару часов назад запушил исправленную версию.
Цитата:
|
Цитата:
var t = new Array(5); alert(t.length+'\n'+t[0]); var t = []; t[0] = 1; t[100] =1; t.length Стандартным методам походу плевать undefined там или что другое... var r = new Array(5); r[2] = 1; var t = r.map(function(c, i, m) { return ++m[i]; }) t.length // стандарт 5, с проверкой 3 Цитата:
|
Цитата:
var t = new Array(5); alert(t.length+'\n'+t["vasyaPupkin"]); |
всё я догнал зачем такие сложности.
Стандартная функция не вызывает fn если элемент undefined. var t = new Array(5); t[1] = 1; t.map(function(c, i) {alert(i); return 2;}); |
кстати прикольно пофиксили:)
Цитата:
Так что с точки зрения железа вроде это 2 разных undefined. Может я в чём-то неправ? |
Цитата:
var t = new Array(5); t[1] = undefined; t.map(function(c, i) {alert(c); return 2;}); |
Цитата:
|
Цитата:
|
У меня кстати есть предложение по сжиманию кода. Я у себя делаю так:
(function(A) { })(Array.prototype); Имхо коротко и понятно:) Хотя в вашем случае это будет не так красиво, зачем-то ещё Array передаёте... |
Цитата:
|
Цитата:
Правила такие При установке свойства length удаляются числовые свойства больше либо равные новому length. При установке числового свойства, если length не больше этого свойства, то length устанавливается на единицу больше этого свойства. Отрицательный length, кстати, присвоить нельзя. Некоторые следствия из этих правил. Свойство length равно количеству элементов в массиве только при аккуратной работе с массивом (нет пропусков элементов). В общем случае length всегда больше максимального индекса в массиве. Чтобы очистить массив, достаточно свойству length присвоить 0. |
Цитата:
Да... я уже понял, что рассматривать низкий уровень в js-се не катит, тк его движки сами написаны на ОО язке/ах... Kolyaj, сенкс за доходчивое объяснение. Наверное надо всё таки собраться и прочитать http://javascript.ru/ecma/part15 :) |
Переопределенные
constructor , toString , toLocaleString , valueOf , hasOwnProperty , propertyIsEnumerable и isPrototypeOf не становятся enumerable в IE<9, поэтому Object.keys({toString: fn}) вернет пустой массив.Думаю toString и valueOf хорошо бы пофиксить. ___________________ offtop Раньше этого как-то не замечал, а вот сейчас наткнулся, такое во всех браузерах: function F() {} F.prototype.constructor = F; F.prototype.toString = F; for (var key in new F) { alert(key); }constructor не становится enumerable, в отличие от toString |
Цитата:
Цитата:
function F() {} alert([F.prototype.hasOwnProperty('constructor'), F.prototype.hasOwnProperty('toString')]) |
О сейчас в голову пришло, с таким фиксом теоретически возникнет проблема с defineProperty:
(function () { function fn() {} var obj = {}; Object.defineProperty(obj, "toString", {value: fn, enumerable: false}); console.log(Object.keys(obj));//[] console.log(obj.hasOwnProperty("toString"));//true console.log(obj.propertyIsEnumerable("toString"));//false }()); кто-то специально выставит enumerable:false , а мы в Object.keys проверим obj.hasOwnProperty("toString") и все равно вернем ключ toString . НО браузеров, одновременно поддерживающих Object.defindeProperty и не поддерживающих Object.keys , и имеющих баг, наверное нет, ну кроме IE8, но в нем Object.defindeProperty работает только для DOM-объектов и при попытке установить для этих свойств enumerable:false возникает ошибка: «Для данного объекта атрибут enumerable дескриптора свойства не может иметь значение false »Object.defineProperty(Element.prototype, "toString", { value: function fn() {}, enumerable: false }); Object.keys: 1|2 |
Вроде ерунда, но советую переписать Array_prototype.flatten. Медленно работает.
|
Медленно по сравнению с чем?
Я его из Prototype перетащил, не помню, чтобы использовал :) |
Цитата:
в своем ворке юзаю похожую функцию для разворачивания мультивыборок. |
Я в своем Array#flatten вместо проверки на массив делал проверку на наличие метода flatten:
'flatten' in Object(value) так вреде правильней (вдруг |
Еще улучшение заметил: в Array#remove к вызову indexOf полезно добавить index вторым аргументом (даже если собственная реализация Array#indexOf не поддерживает второй аргумент, чаще нативная будет использоваться). Так массив не будет каждый раз сначала перебираться.
|
А чего ты тег экранируешь, а имя класса не экранируешь? Хотя там по-моему вообще экранировать не надо, да и trim в общем-то...
А еще можно добавить проверку, что селектор указан, чтобы не делать таке проверки за пределами функции |
Цитата:
|
Часовой пояс GMT +3, время: 20:17. |