суббота, 17 сентября 2011 г.

JavaScript: Присвоить метод строке или числу

Как говорится: «век живи — век учись». Я тут (не без помощи форума nodejs.ru) узнал интересный факт. Много где говорится об эквивалентности создания новой строки таким способом:
var str = 'Hello world';
С таким:
var str = new String('Hello world');
Но на самом деле, — это даёт разные результаты. Если под рукой есть Firebug, — проверьте и убедитесь сами. А тут я хочу подметить по теме о присваивании метода к строке или числу, дальше думаю сами всё поймёте:
var str = 'Hello world';
str.mthd = 123;
str; //Hello world
str.mthd; //undefined

var str2 = new String('Hello world');
str2.mthd = 123;
str2; //Hello world или объект String в отладчике {mthd: 123, 0: 'Hello world'}
str2.mthd; //123
Аналогично с new Number(), экспериментируйте!
 
И на закуску:
(new String('Hello world') === 'Hello world') //false
(new String('Hello world') == 'Hello world') //true
Спасибо некоему AbS_!

Внимание! Подводные камни!

Впоследствии практическим путём я наткнулся на подводные камни! В частности, когда я захотел вернуть в Node.JS ответ HTTP-сервера на запрос объектом строки:
require('http').createServer(function (req, res) {
    var str = new String('ok');
    res.end(str);
}).listen(8000);
При обращении к http://127.0.0.1:8000 процесс ноды обваливался с ошибкой:
TypeError: first argument must be a string or Buffer
Чтобы обойти проблему, — нужно дописывать к выводу строки вызов метода .toString(), — дабы преобразовать объект в обыкновенную строку, из строки-объекта:
res.end(str.toString());
Штука тут в следующем:
typeof new String('check') //returns 'object'
typeof 'check' //returns 'string'
Так что, коли решились использовать строку как объект, будьте бдительны и осторожны!

Комментариев нет:

Отправить комментарий