<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=4395</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=4395&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «JScript: Вывод свойств и значений массива или объекта - дополнение».]]></description>
		<lastBuildDate>Mon, 25 Apr 2011 07:28:09 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47795#p47795</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>typeof не очень удобное средство определения типа</p></blockquote></div><p>не возражаю )))</p><div class="quotebox"><blockquote><p>var sGetClassOf = function(object)</p></blockquote></div><p>Не вижу смысла объявлять внутреннюю функцию. Выполняемые функцией вычисления несложные, вычисления избыточны - нет необходимости, используя регулярные выражения, вычислять имя конструктора - достаточно сравнить со строкой. </p><div class="codebox"><pre><code>
...
      if (sGetClassOf(oBj) == &quot;Array&quot;) {
...
      }
      if (sGetClassOf(oBj) == &quot;Date&quot; || sGetClassOf(oBj) == &quot;RegExp&quot;) {</code></pre></div><div class="codebox"><pre><code>
...
      var t = Object.prototype.toString.call(oBj);
      if (t == &quot;[object Array]&quot;) {
...
      }
      if (t == &quot;[object Date]&quot; || t == &quot;[object RegExp]&quot;) {</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Mon, 25 Apr 2011 07:28:09 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47795#p47795</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47793#p47793</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>typeof очень ненадежное средство для определения типа переданной переменной</p></blockquote></div><p>Ну, для примеров {}, [] и null получать &#039;object&#039; - это ж не баг, а вроде так и задумывалось. Что есть массив - как не объект? Что есть null - как не информация об отсутствии объекта? Так что я бы переформулировал &quot;typeof не очень <em>удобное</em> средство определения типа&quot;.</p><div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>instanceof гораздо лучше справляется с проблемой, но плохо работает в оконных документах с использованием фреймов (frame, iframe)</p></blockquote></div><p>Ага, <a href="http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/">прочел</a> и осознал: тот же прототип, но из другого фрейма для instanceof уже другой прототип. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> Поэтому в общем случае надо переводить типы в строки по которым уже судить типах. Например, используя такую функцию:<br /></p><div class="codebox"><pre><code>/**
Источник https://github.com/kangax/protolicious/blob/master/experimental/__getClass.js
* Returns internal [[Class]] property of an object
* __getClass(5); // =&gt; &quot;Number&quot;
* __getClass({}); // =&gt; &quot;Object&quot;
* __getClass(/foo/); // =&gt; &quot;RegExp&quot;
* __getClass(&#039;&#039;); // =&gt; &quot;String&quot;
* __getClass(true); // =&gt; &quot;Boolean&quot;
* __getClass([]); // =&gt; &quot;Array&quot;
* __getClass(undefined или null); // =&gt; &quot;Window&quot; или &quot;global&quot; или &quot;DOMWindow&quot; или &quot;Object&quot; в зависимости от браузера
//да-да снова полный разброд и шатание, так что метод в данной редакции не является &quot;универсальным определителем типа&quot; :(
* __getClass(Element); // =&gt; &quot;Constructor&quot;
*
*/
function __getClass(object){
  return Object.prototype.toString.call(object)
    .match(/^\[object\s(.*)\]$/)[1];
};

/*
И везде вместо 
объект instanceof НекийТип
использовать
__getClass(объект) == &quot;НекийТип&quot;
*/</code></pre></div><p>О, дорогая редакция... (с)</p><p>Что ж, вот вариант, работающий и для фреймов тоже:<br /></p><div class="codebox"><pre><code>/** Возвращает строку рекурсивного описания содержимого объекта oBj
 * @param sParentName - имя объекта, произвольное, по сути комментарий (можно опустить)
 * @param nEsting - максимальный уровень вложенности объектов/значений (можно опустить)
 */
function vardump(oBj, sParentName, nEsting) {
  var sNL = &quot;\r\n&quot;; // Перенос строки 
  var nEsting_max = 12; //Максимальный исследуемый уровень вложенности, против бесконечных ссылок на самого себя
  var nPadding = 2; //Структурный отступ сдвига потомков относительно родителей, в пробелах
  //Ограничивать ли слишком длинное отображение объекта в поле &gt;значения&lt;
  var bRestrictObjectVal = true, nRestrictWidth = 80, sCutSign = &quot;...&quot;;
  var bShowOnlyOwnProps = true; //Показывать только собственные (уникальные) свойства объекта или все приобретенные
  var bShowFunctionsCode = true; //Показывать ли код функций
  if (sParentName == undefined) sParentName = &quot;&quot;;
  if (isNaN(parseInt(nEsting))) nEsting = nEsting_max;
  var sRes = &quot;&quot;;
  var sGetClassOf = function(object) {
    return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
  };
  for ( var i = 0; i &lt; nPadding * (nEsting_max - nEsting); i++)
    sRes += &quot; &quot;;
  if (nEsting &gt;= 0) {
    sRes += sParentName + &quot;  &quot;;
    switch (typeof oBj) { //Описание элемента toString() и обрамление в соответствии с его типом 
    case &quot;string&quot;:
      sRes += &quot;\&quot;&quot; + oBj + &quot;\&quot;&quot;;
      break;
    case &quot;function&quot;:
      if (sGetClassOf(oBj) == &quot;RegExp&quot;) //В Chrome typeof RegExp =&gt; function
      sRes += oBj + &quot;  as &quot;;
      sRes += &quot;function&quot;;
      break;
    case &quot;object&quot;:
      if (sGetClassOf(oBj) == &quot;Array&quot;) {
        sRes += &quot;Array[&quot; + oBj.length + &quot;]  &quot;;
      }
      if (sGetClassOf(oBj) == &quot;Date&quot; || sGetClassOf(oBj) == &quot;RegExp&quot;) {
        sRes += oBj;
      }
      else { //Вывод прочих объектов и массивов
        sRes += &quot;&gt;&quot;;
        var sOTS = (&quot;&quot; + oBj).replace(/\r/g, &quot;\\r&quot;).replace(/\n/g, &quot;\\n&quot;);
        if (bRestrictObjectVal) { //Если надо, подрезаем слишком длинные описания в строку
          var nMaxOTSLength = nRestrictWidth - sRes.length - 1; //-1 под &quot;&lt;&quot;
          var nCutOSTLength = nMaxOTSLength - sCutSign.length;
          if (nCutOSTLength &lt; 0) nCutOSTLength = 0;
          if (sOTS.length &gt; nMaxOTSLength) sOTS = sOTS.substr(0, nCutOSTLength) + sCutSign;
        }
        sRes += sOTS + &quot;&lt;&quot;;
      }
      break;
    default: //числа, спецзначения, логические
      sRes += oBj;
    }
    sRes += sNL;

    var sEl;
    var sGetChildName =
      function(oParent, sParentName, sChildName) {
        var sFullChildName = sParentName;
        var bIsIndex = false;
        if (sGetClassOf(oParent) == &quot;Array&quot;) {
          var nIdx = parseInt(sChildName, 10);
          if (!isNaN(nIdx) &amp;&amp; nIdx.toString() === sChildName.toString() &amp;&amp; nIdx &gt;= 0 &amp;&amp; nIdx &lt; oParent.length)
            bIsIndex = true;
        }
        if (bIsIndex) sFullChildName += &quot;[&quot; + sChildName + &quot;]&quot;;
        else {
          if (sFullChildName != &quot;&quot;) sFullChildName += &quot;.&quot;; //Если есть что отделять, отделяем точкой
          sFullChildName += sChildName;
        }
        return sFullChildName;
      }; //sGetChildName

    if (sGetClassOf(oBj) == &quot;RegExp&quot;) { //В зависимости от браузера typeof то object, то function
      sEl = &quot;lastIndex&quot;;
      sRes += arguments.callee(oBj[sEl], sGetChildName(oBj, sParentName, sEl), nEsting - 1);
    }
    else { //Осмотрим внутренности
      switch (typeof oBj) {
      case &quot;object&quot;: //Объекты и массивы
        for (sEl in oBj) {
          if (bShowOnlyOwnProps &amp;&amp; !oBj.hasOwnProperty(sEl)) break;
          sRes += arguments.callee(oBj[sEl], sGetChildName(oBj, sParentName, sEl), nEsting - 1);
        }
        break;
      case &quot;function&quot;:
        if (bShowFunctionsCode) sRes += &quot;&gt;&gt;&gt;&quot; + sNL + oBj + &quot;&lt;&lt;&lt;&quot; + sNL;
        break;
      //Остальное содержимого не имеет
      }
    }
  }
  else
    sRes += sParentName + &quot; ! Nesting limit !&quot; + sNL;
  return(sRes);
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Sun, 24 Apr 2011 20:22:54 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47793#p47793</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47776#p47776</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>if (oBj instanceof RegExp) { //В зависимости от браузера typeof то object, то function</p></blockquote></div><p>typeof очень ненадежное средство для определения типа переданной переменной<br /></p><div class="codebox"><pre><code>
typeof {} == &#039;object&#039;
typeof null == &#039;object&#039;
typeof [] == &#039;object&#039;</code></pre></div><p>instanceof гораздо лучше справляется с проблемой, но плохо работает в оконных документах с использованием фреймов (frame, iframe). Если Вы не планируете активно работать с такими документами и ограничиваетесь только одним документов или работаете в консольном JScript, то проблем не будет. </p><p>Можно еще проверять конструктор:<br /></p><div class="codebox"><pre><code>
if ( object &amp;&amp; object.contructor == RegExp )</code></pre></div><p>Но у него те же самые проблемы. Если Вас не беспокоит эта проблема, то и ничего страшного.&nbsp; </p><p>Есть универсальное средство:<br /></p><div class="codebox"><pre><code>
if ( Object.prototype.toString.call(object) == &#039;[object RegExp]&#039; )</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 22 Apr 2011 12:43:41 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47776#p47776</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47693#p47693</link>
			<description><![CDATA[<p>Опсс. Видимо придется еще делать сортировку элементов массивов, чтобы индексы шли по возрастанию.</p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Mon, 18 Apr 2011 21:48:10 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47693#p47693</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47692#p47692</link>
			<description><![CDATA[<p>Понятно, учел. Вот реализация по озвученным чуть выше идеям. Обертка vard() - под WSH, но основная функция проверялась и под браузерами.<br /></p><div class="codebox"><pre><code>/** Возвращает строку рекурсивного описания содержимого объекта oBj
 * @param sParentName - имя объекта, произвольное, по сути комментарий (можно опустить)
 * @param nEsting - максимальный уровень вложенности объектов/значений (можно опустить)
 */
function vardump(oBj, sParentName, nEsting) {
  var sNL = &quot;\r\n&quot;; // Перенос строки 
  var nEsting_max = 12; //Максимальный исследуемый уровень вложенности, против бесконечных ссылок на самого себя
  var nPadding = 2; //Структурный отступ сдвига потомков относительно родителей, в пробелах
  //Ограничивать ли слишком длинное отображение объекта в поле &gt;значения&lt;
  var bRestrictObjectVal = true, nRestrictWidth = 80, sCutSign = &quot;...&quot;;
  var bShowOnlyOwnProps = true; //Показывать только собственные (уникальные) свойства объекта или все приобретенные
  var bShowFunctionsCode = true; //Показывать ли код функций
  if (sParentName == undefined) sParentName = &quot;&quot;;
  if (isNaN(parseInt(nEsting))) nEsting = nEsting_max;
  var sRes = &quot;&quot;;
  for ( var i = 0; i &lt; nPadding * (nEsting_max - nEsting); i++)
    sRes += &quot; &quot;;
  if (nEsting &gt;= 0) {
    sRes += sParentName + &quot;  &quot;;
    switch (typeof oBj) { //Описание элемента toString() и обрамление в соответствии с его типом 
    case &quot;string&quot;:
      sRes += &quot;\&quot;&quot; + oBj + &quot;\&quot;&quot;;
      break;
    case &quot;function&quot;:
      if (oBj instanceof RegExp) //В Chrome typeof RegExp =&gt; function
        sRes += oBj + &quot;  as &quot;;
      sRes += &quot;function&quot;;
      break;
    case &quot;object&quot;:
      if (oBj instanceof Array) {
        sRes += &quot;Array[&quot; + oBj.length + &quot;]  &quot;;
      }
      if (oBj instanceof Date || oBj instanceof RegExp) {
        sRes += oBj;
      }
      else { //Вывод прочих объектов и массивов
        sRes += &quot;&gt;&quot;;
        var sOTS = (&quot;&quot; + oBj).replace(/\r/g, &quot;\\r&quot;).replace(/\n/g, &quot;\\n&quot;);
        if (bRestrictObjectVal) { //Если надо, подрезаем слишком длинные описания в строку
          var nMaxOTSLength = nRestrictWidth - sRes.length - 1; //-1 под &quot;&lt;&quot;
          var nCutOSTLength = nMaxOTSLength - sCutSign.length;
          if (nCutOSTLength &lt; 0) nCutOSTLength = 0;
          if (sOTS.length &gt; nMaxOTSLength) sOTS = sOTS.substr(0, nCutOSTLength) + sCutSign;
        }
        sRes += sOTS + &quot;&lt;&quot;;
      }
      break;
    default: //числа, спецзначения, логические
      sRes += oBj;
    }
    sRes += sNL;

    var sEl;
    var sGetChildName =
      function(oParent, sParentName, sChildName) {
        var sFullChildName = sParentName;
        var bIsIndex = false;
        if (oParent instanceof Array) {
          var nIdx = parseInt(sChildName, 10);
          if (!isNaN(nIdx) &amp;&amp; nIdx.toString() === sChildName.toString() &amp;&amp; nIdx &gt;= 0 &amp;&amp; nIdx &lt; oParent.length)
            bIsIndex = true;
        }
        if (bIsIndex) sFullChildName += &quot;[&quot; + sChildName + &quot;]&quot;;
        else {
          if (sFullChildName != &quot;&quot;) sFullChildName += &quot;.&quot;; //Если есть что отделять, отделяем точкой
          sFullChildName += sChildName;
        }
        return sFullChildName;
      }; //sGetChildName

    if (oBj instanceof RegExp) { //В зависимости от браузера typeof то object, то function
      sEl = &quot;lastIndex&quot;;
      sRes += arguments.callee(oBj[sEl], sGetChildName(oBj, sParentName, sEl), nEsting - 1);
    }
    else { //Осмотрим внутренности
      switch (typeof oBj) {
      case &quot;object&quot;: //Объекты и массивы
        for (sEl in oBj) {
          if (bShowOnlyOwnProps &amp;&amp; !oBj.hasOwnProperty(sEl))
            break;
          sRes += arguments.callee(oBj[sEl], sGetChildName(oBj, sParentName, sEl), nEsting - 1);
        }
        break;
      case &quot;function&quot;:
        if (bShowFunctionsCode) sRes += &quot;&gt;&gt;&gt;&quot; + sNL + oBj + &quot;&lt;&lt;&lt;&quot; + sNL;
        break;
      //Остальное содержимого не имеет
      }
    }
  }
  else
    sRes += sParentName + &quot; ! Nesting limit !&quot; + sNL;
  return(sRes);
}

/** Echo-обертка
 */
function vard() {
  WScript.Echo(vardump.apply(null, arguments));
}</code></pre></div><p>Обновленный демонстрационный пример:<br /></p><div class="codebox"><pre><code>var arrMyPrettySample = [];
arrMyPrettySample[0] = &quot;string 1234&amp; абв &quot;;
arrMyPrettySample[1] = function() {
  return a + b;
};
arrMyPrettySample[2] = {a: 3.2, b: &quot;v4&quot;, c: [1, &quot;a&quot;], d: &quot;&quot;};
arrMyPrettySample[-1] = -2; //Не войдет в индекс (и не отразится в length), а будет записано как свойство 
arrMyPrettySample[3] = [98, false, function() {
  x++;
}, {prop: &quot;value&quot;}];
//arrMyPrettySample[6] = arrMyPrettySample; //Расскомментировать для теста циклических ссылок
arrMyPrettySample[30] = null;
arrMyPrettySample[31] = NaN;
arrMyPrettySample[32] = undefined;
arrMyPrettySample[33] = Infinity;
arrMyPrettySample[55] = new Date();
arrMyPrettySample[44] = new RegExp(&quot;123&quot;, &quot;g&quot;);

Array.prototype.prop1 = &quot;:)&quot;; //Внедренное в прототип массива доп. свойство (не показывается при bShowOnlyOwnProps true)

vard(arrMyPrettySample, &quot;arrMyPrettySample&quot;);</code></pre></div><p>Выведет:<br /></p><div class="codebox"><pre><code>arrMyPrettySample  Array[56]  &gt;string 1234&amp; абв ,function() {\r\n  return a ...&lt;
  arrMyPrettySample[0]  &quot;string 1234&amp; абв &quot;
  arrMyPrettySample[1]  function
&gt;&gt;&gt;
function() {
  return a + b;
}&lt;&lt;&lt;
  arrMyPrettySample[2]  &gt;[object Object]&lt;
    arrMyPrettySample[2].a  3.2
    arrMyPrettySample[2].b  &quot;v4&quot;
    arrMyPrettySample[2].c  Array[2]  &gt;1,a&lt;
      arrMyPrettySample[2].c[0]  1
      arrMyPrettySample[2].c[1]  &quot;a&quot;
    arrMyPrettySample[2].d  &quot;&quot;
  arrMyPrettySample.-1  -2
  arrMyPrettySample[3]  Array[4]  &gt;98,false,function() {\r\n  x++;\r\n},[obj...&lt;
    arrMyPrettySample[3][0]  98
    arrMyPrettySample[3][1]  false
    arrMyPrettySample[3][2]  function
&gt;&gt;&gt;
function() {
  x++;
}&lt;&lt;&lt;
    arrMyPrettySample[3][3]  &gt;[object Object]&lt;
      arrMyPrettySample[3][3].prop  &quot;value&quot;
  arrMyPrettySample[30]  &gt;null&lt;
  arrMyPrettySample[31]  NaN
  arrMyPrettySample[32]  undefined
  arrMyPrettySample[33]  Infinity
  arrMyPrettySample[55]  Wed Apr 20 00:31:34 UTC+0600 2011
  arrMyPrettySample[44]  /123/g
    arrMyPrettySample[44].lastIndex  0</code></pre></div><p>Мне так гораздо больше нравится.</p><p><strong>upd</strong> Небольшие правки и добавки.</p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Mon, 18 Apr 2011 21:44:22 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47692#p47692</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47690#p47690</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Это пагубная тенденция</p></blockquote></div><p>Вообще-то, в целом это верно: объектам - for in, массивам for each. </p><p>Но в данном случае это не принципиально. Ведь надо просто показать, содержимое некоторой переменной любой степени сложности. А вот просматривать надо вот так:<br /></p><div class="codebox"><pre><code>
for (var k in object) {
    if ( ! object.hasOwnProperty(k) ) {
        continue;
    }
    var v = ... object[k] ...;
}</code></pre></div><p>Так мы исключаем из просмотра свойства прототипа объекта и просматриваем исключительно свойства самого объекта.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Mon, 18 Apr 2011 18:30:54 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47690#p47690</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47687#p47687</link>
			<description><![CDATA[<div class="quotebox"><cite>jite пишет:</cite><blockquote><p>Про показ типов. Да, был неправ</p></blockquote></div><p>Был неправ в части:<br /></p><div class="quotebox"><cite>jite пишет:</cite><blockquote><p>Недостатки DataDumper:<br />- не показывает типы</p></blockquote></div><p>Показывает типы, большей частью, хоть и неявно. Никакой категоричности, просто констатация.<br />А я осознал всю прелесть и тоже так хочу. Ну хотя бы попробовать. Главное, чтобы сохранялась исчерпывающая информативность и код функции остался достаточно компактным.</p><div class="quotebox"><cite>jite пишет:</cite><blockquote><p>особое оформление для Date и, возможно, RegExp</p></blockquote></div><p>* для строк кавычки<br />* для номеров, логических значений и спецзначений (null, undefined, NaN и пр.) ничего - и так понятно<br />* массивы обрамлять как-то так:<br /></p><div class="codebox"><pre><code>arrName [length_циферкой]
[
  arrName[0] : значение
  arrName[2] : значение
  arrName.неиндексное_свойство : значение
]</code></pre></div><p>объекты в общем виде примерно так же:<br /></p><div class="codebox"><pre><code> objName &gt;тут_будет_objName.toString()&lt; 
{
  objName.prop1 : значение
  objName.prop2 : значение
}</code></pre></div><p>* для функций видимо так<br /></p><div class="codebox"><pre><code> fName &gt;function&lt;
&gt;&gt;&gt;код&lt;&lt;&lt;</code></pre></div><p>* Date вот это как? ... <br />О! А если будет показывать без кавычек, то это получается - не строка, а дата! <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />К слову, с показом даты у браузеров если и не бардак, то все равно разброд и шатание буквально в каждой из функций вывода текстом отличия в тексте - специально проверял. Так что не суть, какую функцию за основу брать, главное чтобы в ней была полная дата и время и чтобы с GMT/UTC (это кто как пишет)<br />* RegExp<br /></p><div class="codebox"><pre><code> RegexpName /pattern/ флаги</code></pre></div><p>Словом что-то такое JSON-образное, но с полными &quot;именами&quot; элементов (вроде myObj.prop1[34].prop2) ибо мотать портянку вверх, вспоминая &quot;чье ж ты?&quot; не дело.</p><p>По расширяемой функциональности массивов. Это значит надо предусмотреть место в коде функции (пояснить комментами), где могли бы отлавливаться и соответственно обрабатываться пользовательские типы. Правда тянет уже на что-то большее, чем функцию, но может всё не так уж и сложно выйдет.</p><p>А про мощные дамперы. В идеале вместо текста это должна быть полноценная древовидная структура, сворачивающаяся плюсиками. Так что думаю, что-то такое уже наверняка наваяли.</p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Mon, 18 Apr 2011 13:40:50 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47687#p47687</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47686#p47686</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>дампер обязан это показывать, тем более что свойством индекс может оказаться по ошибке или незнанию.</p></blockquote></div><p>По-моему, это сомнительный аргумент. На самом деле не так уж много случаев, когда массив содержит дополнительное свойство, но они всегда оговариваются:<br /></p><div class="codebox"><pre><code>
var s = &#039;123abc456&#039;;
var re = /\d+/g;

var x = s.match(re);
alert(x);
alert(Object.prototype.toString.call(x));
akert(x.lastIndex);</code></pre></div><div class="quotebox"><blockquote><p>Про показ типов. Да, был неправ</p></blockquote></div><p>Отчего же так категорично? Просто эта информация избыточна. </p><div class="quotebox"><blockquote><p>особое оформление для Date и, возможно, RegExp</p></blockquote></div><div class="codebox"><pre><code>
var now = new Date();
alert(ow.toUTCString());

var re = /\d+/;
alert(re.source);</code></pre></div><div class="quotebox"><blockquote><p>А почему &quot;for in&quot; - пагубная тенденция?</p></blockquote></div><p>Часто бывает, что именно объект Array расширяют - добавляют методы, отсутствующие в JScript, но описанные в спецификации Javascript - ранней (indexOf, lastIndexOf) и посдней (forEach, map, filter и прочие). Поэтому они тоже попадут под обстрел for in. Что может оказаться не очень приятным.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Mon, 18 Apr 2011 11:49:31 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47686#p47686</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47685#p47685</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Это пагубная тенденция хранить данные в массивах с нецифровыми индексами, также&nbsp; и работать с элементами массива с помощью цикла <strong>for in</strong>.</p></blockquote></div><p>Ну про не-индексные свойства массивов когда узнал, я сам был в шоке. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> <br />Может быть тенденция и пагубная. Можно это использовать или нет, но дампер обязан это показывать, тем более что свойством индекс может оказаться по ошибке или незнанию.</p><p>Про показ типов. Да, был неправ. Но вот тип Date DataDumper явно упущен.<br />Вообще-то довольно изящное решение. Не сделать ли в vardump() так же? Осталось придумать особое оформление для Date и, возможно, RegExp.</p><p>А почему &quot;for in&quot; - пагубная тенденция? <img src="//forum.script-coding.com/img/smilies/hmm.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Mon, 18 Apr 2011 11:05:51 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47685#p47685</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47683#p47683</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>- не показывает типы</p></blockquote></div><p>Показ типа переменной или элемента массива/объекта избыточно. Сравните:<br /></p><div class="codebox"><pre><code>&quot;false&quot;
false
&quot;42&quot;
42
{ ... }
[ ... ]</code></pre></div><p>Во всех случаях понятно, что является строкой, числом, булевой, массивом или объектом. </p><p>JSON хорош, чтобы посмотреть сложную структуру развернуто:<br /></p><div class="codebox"><pre><code>
var x = {
    a: false, 
    b: &quot;false&quot;, 
    c: &quot;42&quot;, 
    d: 42
};

// {&quot;a&quot;:false,&quot;b&quot;:&quot;false&quot;,&quot;c&quot;:&quot;42&quot;,&quot;d&quot;:42}
JSON.stringify(x);

// выведет тоже самое, но в несколько строк и с отступами в 4 пробела
JSON.stringify(x, null, 4);

// тоже самое, но указан заполнитель
JSON.stringify(x, null, &#039;\t&#039;);</code></pre></div><p>Всем понятно, для чего нужен JSON. И когда надо заглянуть под юбку сложной структуры данных, он тоже может помочь. <span class="bbu">Недостаток, в данном случае один - сложен в наборе (сравните с <strong>varpdump(x)</strong>)</span>. Правда, самоссылочные, циклические структуру ему тоже не по зубам. Но для этого он не предназначался. В ФФ JSON уже встроен, но и он не работает с рекурсивными данными.</p><div class="quotebox"><blockquote><p>- ... не показывает значения объектов toString() - они вполне могут быть информативными</p></blockquote></div><p>Вообще-то перебор свойств объекта и вывод метода toString() могут очень сильно различаться. </p><div class="quotebox"><blockquote><p>- не показывает у массивов не-индексные элементы (т.е. свойства - элементы с именами не являющимися целыми положительными 32-битными числами)</p></blockquote></div><p>Это пагубная тенденция хранить данные в массивах с нецифровыми индексами, также&nbsp; и работать с элементами массива с помощью цикла <strong>for in</strong>. </p><div class="quotebox"><blockquote><p>есть и более мощные варианты дамперов под js</p></blockquote></div><p>Так Вы его уже написали ))) Сам тоже пользуюсь своим самописным. Доволен )))</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Mon, 18 Apr 2011 09:35:10 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47683#p47683</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47681#p47681</link>
			<description><![CDATA[<p>Посмотрел DataDumper. Велосипед ранней партии. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Вот вывод Dumper(myArr)<br /></p><div class="codebox"><pre><code>[
 &#039;string 1234&amp; абв &#039;,
 [function],
 {
  &#039;a&#039; =&gt; 32,
  &#039;b&#039; =&gt; &#039;v4&#039;,
  &#039;c&#039; =&gt; [
          1,
          &#039;a&#039;
         ],
  &#039;d&#039; =&gt; &#039;&#039;
 },
 [
  98,
  &#039;str&#039;,
  [function],
  {
   &#039;prop&#039; =&gt; &#039;value&#039;
  }
 ],
 [null],
 {}
]</code></pre></div><p>Вывод vardump()<br /></p><div class="codebox"><pre><code>myArr  array[6]  &gt;string 1234&amp; абв ,function () {\n    return a + b;\n},[obj...&lt;
  myArr.0  string  &gt;string 1234&amp; абв &lt;
  myArr.1  function  &gt;...&lt;
&gt;&gt;&gt;
function () {
    return a + b;
}&lt;&lt;&lt;
  myArr.2  object  &gt;[object Object]&lt;
    myArr.2.a  number  &gt;32&lt;
    myArr.2.b  string  &gt;v4&lt;
    myArr.2.c  array[2]  &gt;1,a&lt;
      myArr.2.c.0  number  &gt;1&lt;
      myArr.2.c.1  string  &gt;a&lt;
    myArr.2.d  string  &gt;&lt;
  myArr.-1  number  &gt;-2&lt;
  myArr.3  array[4]  &gt;98,str,function () {\n    x++;\n},[object Object]&lt;
    myArr.3.0  number  &gt;98&lt;
    myArr.3.1  string  &gt;str&lt;
    myArr.3.2  function  &gt;...&lt;
&gt;&gt;&gt;
function () {
    x++;
}&lt;&lt;&lt;
    myArr.3.3  object  &gt;[object Object]&lt;
      myArr.3.3.prop  string  &gt;value&lt;
  myArr.5  object  &gt;Mon Apr 18 2011 12:40:11 GMT+0600&lt;</code></pre></div><p>Особенность DataDumper - лаконичное отображение только значений. По ситуации обернется достоинством или недостатком.<br />Отсутствие у массивов индексов, думаю, все-таки больше недостаток, чем достоинство - даже на маленьких массивах начинаю путаться, где что.<br />Недостатки DataDumper:<br />- не показывает типы<br />- не показывает даты (&quot;{}&quot; это не информация) и вообще не показывает значения объектов toString() - они вполне могут быть информативными<br />- не показывает у массивов не-индексные элементы (т.е. свойства - элементы с именами не являющимися целыми положительными 32-битными числами)<br />- показывает пустые &quot;[null]&quot; элементы массивов - это пожалуй лишнее<br />- некорректно определяет массивы (массив это не то, что имеет свойство length целого типа, а то, что произошло от Array)<br />- &quot;много букв&quot; и внешних переменных, в то время как vardump() автономный моноблок, легко вставляемый и убираемый</p><p>Впрочем, все перечисленное не так уж и сложно исправить самостоятельно.</p><p>Не впечатлился как-то DataDumper. Наверняка есть и более мощные варианты дамперов под js... или браузерные отладчики настолько захватили власть? Подскажите, если знаете.</p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Mon, 18 Apr 2011 07:45:32 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47681#p47681</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47680#p47680</link>
			<description><![CDATA[<p>Версия &quot;Долой лишние разделители!&quot;<br /></p><div class="codebox"><pre><code>/** Возвращает строку рекурсивного описания содержимого объекта oBj
 * @param sParentName - имя объекта, произвольное, по сути комментарий (можно опустить)
 * @param nEsting - максимальный уровень вложенности объектов/значений (можно опустить)
 */
function vardump(oBj, sParentName, nEsting) {
  var sNL = &quot;\r\n&quot;, /* Перенос строки */ sLQ = &quot;&gt;&quot;, sRQ = &quot;&lt;&quot;; //Левый и правый ограничители значения 
  var nEsting_max = 12; //Максимальный исследуемый уровень вложенности, против бесконечных ссылок на самого себя
  var nPadding = 2; //Структурный отступ сдвига потомков относительно родителей, в пробелах
  //Ограничивать ли слишком длинное отображение объекта в поле &gt;значения&lt;
  var bRestrictObjectVal = true, nRestrictWidth = 80, sCutSign = &quot;...&quot;;
  if (sParentName == undefined) sParentName = &quot;&quot;;
  if (isNaN(parseInt(nEsting))) nEsting = nEsting_max;
  var sRes = &quot;&quot;;
  for ( var i = 0; i &lt; nPadding * (nEsting_max - nEsting); i++)
    sRes += &quot; &quot;;
  if (nEsting &gt;= 0) {
    sRes += sParentName + &quot;  &quot;;
    sRes += oBj instanceof Array ? &quot;array[&quot; + oBj.length + &quot;]&quot; : typeof oBj;
    sRes += &quot;  &quot; + sLQ;
    if (typeof oBj == &quot;function&quot;) sRes += sCutSign; //Функции в этой позиции не отображаем
    else
      //Объект.toString() с ограничениями
      if (oBj instanceof Object &amp;&amp; bRestrictObjectVal &amp;&amp; !(oBj instanceof Date)) {
        var nMaxOTSLength = nRestrictWidth - sRes.length - 1; //-1 под &lt;
        var nCutOSTLength = nMaxOTSLength - sCutSign.length;
        if (nCutOSTLength &lt; 0) nCutOSTLength = 0;
        var sOTS = oBj.toString().replace(/\r/g, &quot;\\r&quot;).replace(/\n/g, &quot;\\n&quot;);
        if (sOTS.length &gt; nMaxOTSLength) sOTS = sOTS.substr(0, nCutOSTLength) + sCutSign;
        sRes += sOTS;
      }
      else
        sRes += oBj; //Объект.toString() без ограничений
    sRes += sRQ + sNL;
    switch (typeof oBj) {
    case &quot;object&quot;:
      for ( var oEl in oBj) {
        var sObjName = sParentName; //Имя потомка
        if (sObjName != &quot;&quot;) sObjName += &quot;.&quot;; //Если есть что отделять, отделяем точкой
        sObjName += oEl;
        sRes += arguments.callee(oBj[oEl], sObjName, nEsting - 1);
      }
      break;
    case &quot;function&quot;:
      sRes += sLQ + sLQ + sLQ + sNL + oBj + sRQ + sRQ + sRQ + sNL;
      break;
    }
  }
  else
    sRes += sParentName + &quot; ! Nesting limit !&quot; + sNL;
  return(sRes);
}</code></pre></div><p>Изменения минимальные - косметические... но да, отсутствие лишних разделителей определенно идет на пользу читаемости. <br />Было на выходе:<br /></p><div class="quotebox"><blockquote><p>myArr.2 (object)=&gt;[object Object]&lt;<br />&nbsp; &nbsp; myArr.2.a (number)=&gt;32&lt;<br />&nbsp; &nbsp; myArr.2.b (string)=&gt;v4&lt;<br />&nbsp; &nbsp; myArr.2.c (array[2])=&gt;1,a&lt;</p></blockquote></div><p>Стало:<br /></p><div class="quotebox"><blockquote><p>myArr.2&nbsp; object&nbsp; &gt;[object Object]&lt;<br />&nbsp; &nbsp; myArr.2.a&nbsp; number&nbsp; &gt;32&lt;<br />&nbsp; &nbsp; myArr.2.b&nbsp; string&nbsp; &gt;v4&lt;<br />&nbsp; &nbsp; myArr.2.c&nbsp; array[2]&nbsp; &gt;1,a&lt;</p></blockquote></div><p>А вот кавычки, думаю, по информативности все же уступают угловым скобкам. Впрочем это теперь легко исправить даже не задумываясь:<br /></p><div class="quotebox"><blockquote><p>myArr.2&nbsp; object&nbsp; &quot;[object Object]&quot;<br />&nbsp; &nbsp; myArr.2.a&nbsp; number&nbsp; &quot;32&quot;<br />&nbsp; &nbsp; myArr.2.b&nbsp; string&nbsp; &quot;v4&quot;<br />&nbsp; &nbsp; myArr.2.c&nbsp; array[2]&nbsp; &quot;1,a&quot;</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Sun, 17 Apr 2011 21:13:29 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47680#p47680</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47671#p47671</link>
			<description><![CDATA[<p>Ограничители нужны для строк, чтобы видеть конец строки. Поэтому - или кавычки, или апострофы. JSON использует кавычки. Он кстати преобразует переводы строк и табуляции.</p><p>А JSON... В ФФ он есть кажется начиная с каких-то версии 3+. В МСИЕ он встроен то ли с версии 8, то ли 9. В WSH 5.7 его тоже нет (Windows XP Professional SP3, Windows Vista Enterprise SP2).</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sun, 17 Apr 2011 07:49:54 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47671#p47671</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47669#p47669</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>То есть, необходимо ли преобразование символов \n, &lt;, &gt; (и прочих подобных) в их &quot;читабельные эквиваленты&quot;, как то комбинации символов &quot;\n&quot;, &quot;&amp;lt;&quot;, &quot;&amp;gt;&quot;.</p></blockquote></div><p>Думаю, не стоит ставить перед vardump() задачу форматирования вывода, это уже задачи оберток. Впрочем есть возможность сделать что-то с переносами строки уже на данном этапе - это переменная nl.<br /></p><div class="quotebox"><cite>mikser пишет:</cite><blockquote><p>Много букв.<br />Можете в кратце объяснить чем ваще детище лучше чем уже довольно давно существующее решение - DataDumper ?<br />PS Формат вывода у вас очень замудреный, чем вас не устроил простой JSON?</p></blockquote></div><p>Это оно <em>для вас</em> &quot;давно существующее&quot;. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> И только под браузер заточенное. Как ознакомлюсь - сравню.<br />А в DataDumper мало букв? <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /></p><p>И да, я понял, &gt;ограничители значений&lt; наверное многим покажутся лишними/странными. Изначально не хотел использовать кавычки или оставлять значения просто так. Значит все-таки сделать эти ограничители опциональными? <br />Ну а указание типа - это разве лишнее? <br />Хм, print_r и JSON, говорите... Надо подумать.</p>]]></description>
			<author><![CDATA[null@example.com (jite)]]></author>
			<pubDate>Sun, 17 Apr 2011 06:10:34 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47669#p47669</guid>
		</item>
		<item>
			<title><![CDATA[Re: JScript: Вывод свойств и значений массива или объекта - дополнение]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=47666#p47666</link>
			<description><![CDATA[<p>Говоря об управляющих символах я имел в виду следующее:<br /></p><div class="codebox"><pre><code>
vardump(&#039;строка в &lt;br /&gt;браузере&#039;);
vardump(&#039;строка в \nконсоли&#039;);</code></pre></div><p>То есть, необходимо ли преобразование символов \n, &lt;, &gt; (и прочих подобных) в их &quot;читабельные эквиваленты&quot;, как то комбинации символов &quot;\n&quot;, &quot;&amp;lt;&quot;, &quot;&amp;gt;&quot;.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Sat, 16 Apr 2011 22:32:58 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=47666#p47666</guid>
		</item>
	</channel>
</rss>
