Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Тестовое задание Yandex (https://javascript.ru/forum/offtopic/18474-testovoe-zadanie-yandex.html)

monolithed 02.07.2011 23:34

Цитата:

Сообщение от B@rmaley.e><e
Но с учетом поправки, корректный код будет выглядеть так:

Однако, не соответствует условиям здания, т.к. выражения должны быть идентичными :)
RegExp.prototype.toString = function(){
    return this.source;
}
 
var rx1 = RegExp(/regular/ + /expression/);
var rx2 = /regularexpression/;

alert(rx1 == rx2);


как альтернативный подход:
var rx1 = RegExp(/regular/ + /expression/);
var rx2 = /regularexpression/;

rx1 = rx1.source.replace(/\W/g, '').replace(/.*/, '/$&/');

rx1 = rx1.toString();
rx2 = rx2.toString();
    
alert(rx1 === rx2)

B@rmaley.e><e 02.07.2011 23:36

monolithed, регэкспы - объекты, в данном случае идентичными в смысле оператора == они не будут никогда.

monolithed 02.07.2011 23:49

Цитата:

Сообщение от B@rmaley.e><e
регэкспы - объекты, в данном случае идентичными в смысле оператора == они не будут никогда.

ну это я имел ввиду, что без приведения к элементарному типу никак

tenshi 03.07.2011 17:07

есть идентичность по имени (которое в данном случае - адрес в памяти), а есть идентичность по содержимому (рекурсивное равенство всех данных).

первая - как правило бесполезна. редко когда нужно отличать объекты с одинаковым содержимым.
вторая же наоборот как правило и нужна, но по неведомой мне причине, реализуется через костыли типа a.equal(b)
по хорошему оператор == должен проверять именно идентичность данных, а не проверять через десяток эвристик: если оба объекты - сравниваем по имени, если один из них строка - сравниваем "строковые представления" (которые у разных объектов либо отражают содержимое, либо лишь принадлежность к классу), если один из них число - сравниваем "примитивные значения".

mycoding 04.07.2011 08:37

Вчера monolithed, дал ссылку на интересные примеры.
Огромное тебе спасибо monolithed.:)

Совет всем глянуть
http://code.google.com/p/jslibs/wiki/JavascriptTips

Честно признаюсь, что и понятия не имел о таких тонкостях и методах.

Возьмем несколько примеров
1 - Почему это так?
var a = [4,5,6];
var b = [7,8,9];
Array.prototype.push.apply(a, b);

uneval(a); // is: [4, 5, 6, 7, 8, 9]

2 - Про такую технику я не знал, хотя до этого можно было додуматься)))
Milliseconds since epoch
alert(+new Date());

3 -
var text = <>
this
is
my
multi-line
text
</>.toString();
console.log(text);

4 - Creates a random alphabetic string
function RandomString(length) {
    var str = '';
    for ( ; str.length < length; str += Math.random().toString(36).substr(2) );
    return str.substr(0, length);
}

RandomString(10);

5 - Kind of destructuring assignments
Как это?
var { a:x, b:y } = { a:7, b:8 };
console.log(x); // prints: 7
console.log(y); // prints: 8

B@rmaley.e><e 04.07.2011 10:39

Цитата:

Сообщение от mycoding
1 - Почему это так?

Потому что вызывается a.push(7, 8, 9)

Цитата:

Сообщение от mycoding
3 - Это как такое получается?

Что получается? Syntax error что ли?

Цитата:

Сообщение от mycoding
var { a:x, b:y } = { a:7, b:8 };console.log(x); // prints: 7console.log(y); // prints: 8

Syntax Error в ES5.

mycoding 04.07.2011 10:44

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 111675)
Потому что вызывается a.push(7, 8, 9)

Точно, забыл чуток
apply(this, [name, value]).

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 111675)
Что получается? Syntax error что ли?

Сначала написал пример с threads, потом проверил что не работает
решил удалить, а коммент оставил.

Вот к чему это было
Simulate threads using yield operator
//// thread definition
function Thread( name ) {

    for ( var i = 0; i < 5; i++ ) {

        Print(name+': '+i);
        yield;
    }
}

//// thread management
var threads = [];

// thread creation
threads.push( new Thread('foo') );
threads.push( new Thread('bar') );

// scheduler
while (threads.length) {

    var thread = threads.shift();
    try {
        thread.next();
        threads.push(thread);
    } catch(ex if ex instanceof StopIteration) {}
}

monolithed 04.07.2011 11:11

Там многие вещи из JavaScript 1.6+ поэтому, работать будет только на платформах Geko и SpiderMonkey (до принятия ES6-7, однако кому не терпится можно попробовать уже сейчас) причем для запуска тех же yield/let код нужно заключать в дескрипторы с указанием версии:
<script type="application/javascript;version=1.7"/>

float 04.07.2011 17:51

ООооо.... Безграничные возможности для индусов.

tenshi 04.07.2011 18:56

ого, я думал про js знаю всё, однако о такой фиче даже и не подозревал:

var result
job: {
    if( result ) break job
    result= 0
    if( result ) break job
    ++result
    if( result ) break job
    ++result
}
alert( result === 1 )


всегда эмулировал её через цыкл #^_^#


Часовой пояс GMT +3, время: 05:24.