Comments 23
http://javascript.ru/php — аналогичная база. Из этого закономерный вопрос — чем JSSamePHP лучше?
Даже так лучше: phpjs.org/
Просто сравните
и
http://phpjs.org/functions/strlen/
function strlen(string) {
// discuss at: http://phpjs.org/functions/strlen/
// original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// improved by: Sakimori
// improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
// input by: Kirk Strobeck
// bugfixed by: Onno Marsman
// revised by: Brett Zamir (http://brett-zamir.me)
// note: May look like overkill, but in order to be truly faithful to handling all Unicode
// note: characters and to this function in PHP which does not count the number of bytes
// note: but counts the number of characters, something like this is really necessary.
// example 1: strlen('Kevin van Zonneveld');
// returns 1: 19
// example 2: ini_set('unicode.semantics', 'on');
// example 2: strlen('A\ud87e\udc04Z');
// returns 2: 3
var str = string + '';
var i = 0,
chr = '',
lgth = 0;
if (!this.php_js || !this.php_js.ini || !this.php_js.ini['unicode.semantics'] || this.php_js.ini[
'unicode.semantics'].local_value.toLowerCase() !== 'on') {
return string.length;
}
var getWholeChar = function(str, i) {
var code = str.charCodeAt(i);
var next = '',
prev = '';
if (0xD800 <= code && code <= 0xDBFF) { // High surrogate (could change last hex to 0xDB7F to treat high private surrogates as single characters)
if (str.length <= (i + 1)) {
throw 'High surrogate without following low surrogate';
}
next = str.charCodeAt(i + 1);
if (0xDC00 > next || next > 0xDFFF) {
throw 'High surrogate without following low surrogate';
}
return str.charAt(i) + str.charAt(i + 1);
} else if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate
if (i === 0) {
throw 'Low surrogate without preceding high surrogate';
}
prev = str.charCodeAt(i - 1);
if (0xD800 > prev || prev > 0xDBFF) { //(could change last hex to 0xDB7F to treat high private surrogates as single characters)
throw 'Low surrogate without preceding high surrogate';
}
return false; // We can pass over low surrogates now as the second component in a pair which we have already processed
}
return str.charAt(i);
};
for (i = 0, lgth = 0; i < str.length; i++) {
if ((chr = getWholeChar(str, i)) === false) {
continue;
} // Adapt this line at the top of any loop, passing in the whole string and the current iteration and returning a variable to represent the individual character; purpose is to treat the first part of a surrogate pair as the whole character and then ignore the second part
lgth++;
}
return lgth;
}
и
function strlen(str){return str.length;}
var Count=strlen(STR);
Почему уж тогда не так?
$Count=strlen($STR);
Думаю, автор JSSamePHP скоро перенесет методы PHP в Python и Java, а потом примется за Erlang. И заголовок будет звучать очень интригующе — «умею на PHP, а нужно на Erlang».
Я всё конечно понимаю, но ведь это простейшие функции. Зачем делать обвязки на них?
Тем более в JS есть много тонкостей, которые стоит учитывать.
Имхо намного проще один раз разобраться в языке, чем потом наткнуться на странный баг такого эмулятора.
Тем более в JS есть много тонкостей, которые стоит учитывать.
Имхо намного проще один раз разобраться в языке, чем потом наткнуться на странный баг такого эмулятора.
Неправда Ваша. Если автор сумеет хотя бы приблизиться к строковым и прочим багам приведения типов в php и доподлинно воссоздать их на js, выкинув при этом js-ные баги приведения типов с NaNами и прочим, то подумайте… Если такая либа даже и не будет востребована, то уж как минимум войдет в эпик программерской индустрии, и послужит отправной точкой для создания высшего языка php-js! Как в фильму «Другой Мир» — это будет «Сила их обоих»!
А всякие lo-dash'и и underscore'ы — это для продакшна а не для развлекалочки!
Может быть автор Ньютон нашего времени! Сначала портирует php на js, потом js на php — и вот тут уже закрутится-завертится! Erlang покажется детской сказкой, JVM выкинут на помойку! Haskell'ем начнут заправлять газонокосилки для прополки тундры!
Вот это будет шедевр и роботехника на грани фантастики! А Вы все так на корню: «Зачем делать обвязки», «Много тонкостей которые стоит учитывать»…
А всякие lo-dash'и и underscore'ы — это для продакшна а не для развлекалочки!
Может быть автор Ньютон нашего времени! Сначала портирует php на js, потом js на php — и вот тут уже закрутится-завертится! Erlang покажется детской сказкой, JVM выкинут на помойку! Haskell'ем начнут заправлять газонокосилки для прополки тундры!
Вот это будет шедевр и роботехника на грани фантастики! А Вы все так на корню: «Зачем делать обвязки», «Много тонкостей которые стоит учитывать»…
Какой ужас, ох уж эти пехапешники… Чем же lazyjs, underscorejs, lodashjs не угодили? Плюс ко всему ES-5 и ES-6 фичи =)
Вот еще для саморазвития github.com/rwaldron/idiomatic.js
Я часто пользую trim() со вторым параметром, а тут (из кода видно), что только 1. Из того же trim видно, что для работы нужен еще и jQuery, а об этом в посте ничего нет. Как-то недоработанно
Я написал данный пост не для того, чтобы ставить в противовес свой принцип другим сайтам с базами функций, а для того, чтобы новичкам нашего web-дела дать общую концепцию, что так можно. Поверьте, в былые годы небыло подобной информации, были частичные инструкции «как делать», но не было инструкций «как додуматься». Поэтому данный мой пост несет чисто концептуальный характер, нежели технический.
Так нельзя, тем более новичкам. Набор методов JS учится за пару дней, он не настолько сложен и суров, чтобы из-за нежелания изучить его использовать химеры. Зато после ознакомления с чистым натуральным JS, после понимания логики работы объектов, замыканий и прототипов, напротив, многие вещи получаются куда проще и лаконичнее. Плюс открывается взор на огромное количество библиотек и методик, которые используются в JS.
Может если не умеешь на JS, так и не надо? К чему все эти телодвижения? А если проект потом кто-то другой будет поддерживать? Странные люди…
Те вещи, для которых Вы написали функции, как-раз на JavaScript выглядят красивее чем на PHP. Скалярные типы данных как объекты — это как-раз та фича, которую многие в PHP ждут уже очень давно, и видимо еще не скоро дождуться. Да и различия в наименовании функций в PHP — не самая приятная особенность PHP.
А можно немного критики?
Плюс к тому, этот метод может привести к непредсказуемым результатам:
Джаваскрипт всё-таки надо писать на джаваскрипте.
function count(str){return str.count;}
String.prototype.count
? В спеках такого нет.Весь jQuery тащить ради одного метода? Он же пишется элементарно. А в ES5 уже естьfunction trim(str){return $.trim(str);}
String.prototype.trim()
из коробки.function substr(a,b,c){if(b<0){b+=a.length;}if(c==undefined){c=a.length;}else if(c<0){c+=a.length;}else{c+=b;}if(c<b){c=b;}return a.substring(b,c);}
function substr(a,b,c){return a.substr(b,c);}
function is_numeric(a){return !isNaN(a-0) && a!==null && a.replace(/^\s\s*/,'')!=="" && a!==false;}
> is_numeric(42)
TypeError: Object 42 has no method 'replace'
Плюс к тому, этот метод может привести к непредсказуемым результатам:
var foo = "42", bar = "42";
if (is_numeric(foo) && is_numeric(bar)) return foo + bar; // "4242"
Джаваскрипт всё-таки надо писать на джаваскрипте.
За критику благодарю, поработаю со своим кодом, по Вашим наводкам.
А спрашивать можно ли критики не нужно, тут и так все сообщество накинулось на мой первый пост с удивительной симпатией, загнав меня в recovery mode с пол клика :)
А спрашивать можно ли критики не нужно, тут и так все сообщество накинулось на мой первый пост с удивительной симпатией, загнав меня в recovery mode с пол клика :)
> is_numeric(42)
TypeError: Object 42 has no method 'replace'
Это легко пофиксить:
function is_numeric(a) { if (a === 42) return true; ... }
Также хорошо написать юнит тест, который будет намекать на высокое качество кода:
test("42", function () {
assert(is_numeric(42));
});
str_replace() заменит только первое вхождение, или в php тоже так?
более лучший вариант:
function str_replace(a,b,c){return c.replace(a,b);}
str_replace('foo', 'bar', 'foofoo')
> "barfoo"
более лучший вариант:
function str_replace(a,b,c){return c.split(a).join(b);}
str_replace('foo', 'bar', 'foofoo')
> "barbar"
Не уверен, что это хороший тон. Даже для новичков. Это стимулирует деградацию личных знаний, приравнивая JS к PHP, и заставляет писать трудно портируемый код. Для функций сложнее типа
in_array
либо array_keys
либо конструкций типа foreach
и всяких мапперов/фильтров, может, и был бы смысл писать такое (и то это уже существует в виде замечательной библиотеки underscore
и аналогичных). А если сравнить типизацию в JS и её же в PHP (в последнем она, увы, местами просто дико ненормальная) — то это может только запутать. Пример для этого — конкатенация и сравнивание различных значений.Sign up to leave a comment.
JSSamePHP: умею на PHP, а нужно на JavaScript