整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

深入理解 JavaScript:实现自定义 `pop` 方法

家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力

在 JavaScript 中,Array.prototype.pop 是一个常用的方法,用于移除数组的最后一个元素并返回该元素。为了更好地理解其内部机制,今天我们将从零开始,实现一个自定义的 pop 方法,并详细解析其实现步骤。

实现自定义 pop 方法

首先,我们创建一个 myPop 方法,将其添加到 Array.prototype 上。这个方法将移除数组的最后一个元素,并返回该元素。

Array.prototype.myPop = function() {
  // 将传入的数组转换为对象
  const O = Object(this);

  // 获取数组的长度
  const len = O.length >>> 0;

  // 如果数组长度为 0,则直接返回 undefined
  if (len === 0) {
    this.length = 0; // 确保数组长度为 0
    return undefined;
  }

  // 获取数组的最后一个元素
  const element = O[len - 1];

  // 删除数组的最后一个元素
  delete O[len - 1];

  // 更新数组的长度
  this.length = len - 1;

  // 返回数组的最后一个元素
  return element;
};

让我们逐步解析这个实现。

1. 将传入的数组转换为对象

我们首先将 this 转换为一个对象,以便在方法中使用:

const O = Object(this);

2. 获取数组的长度

使用 >>> 0 操作符将长度转换为无符号整数,确保其为正整数:

const len = O.length >>> 0;

3. 处理空数组的情况

如果数组长度为 0,则将数组长度设为 0,并返回 undefined

if (len === 0) {
  this.length = 0;
  return undefined;
}

4. 获取数组的最后一个元素

我们获取数组的最后一个元素并将其存储在 element 变量中:

const element = O[len - 1];

5. 删除数组的最后一个元素

使用 delete 操作符删除数组的最后一个元素:

delete O[len - 1];

6. 更新数组的长度

将数组的长度减少 1:

this.length = len - 1;

7. 返回数组的最后一个元素

最后,我们返回存储在 element 变量中的最后一个元素:

return element;

示例使用

下面是一个示例,展示如何使用自定义的 myPop 方法:

const arr = [1, 2, 3, 4, 5];
console.log(arr.myPop()); // 输出 5
console.log(arr); // 输出 [1, 2, 3, 4]

在这个示例中,我们使用 myPop 方法从 arr 数组中删除最后一个元素,并返回它。结果输出为 5,并且 arr 数组变为 [1, 2, 3, 4]。这样,我们成功地实现了与原生 pop 方法相同的功能。

最后

通过实现自定义的 pop 方法,我们深入理解了 JavaScript 中数组的操作方式。相信你也可以更好地掌握 pop 方法的内部机制,并提升你的 JavaScript 编程技巧。如果你有任何问题或建议,欢迎在评论区留言交流!祝你编程愉快!


HTML 5 也被称为 Web Applications 1.0。为了实现这个目标,增加了几个为 Web 页面提供交互体验的新元素:

details

datagrid

menu

command

这些元素都可以根据用户的操作和选择改变显示的内容,而不需要从服务器装载新页面。

details

details 元素表示在默认情况下可能不显示的详细信息。可选的 legend 元素可以提供详细信息的摘要。

details 元素的用途之一是提供脚注和尾注。例如:

The bill of a Craveri's Murrelet is about 10% thinner

than the bill of a Xantus's Murrelet.

<details>

<legend>[Sibley, 2000]</legend>

<p>Sibley, David Allen, The Sibley Guide to Birds,

(New York: Chanticleer Press, 2000) p. 247

</p>

</details>

没有指定具体的显示方式。浏览器可以选用脚注、尾注和工具提示等方式。

每个 details 元素可以有一个 open 属性。如果设置了这个属性,那么详细信息在最初就显示出来。如果没有设置这个属性,那么会隐藏它们,直到用户要求显示它们。无论是哪种情况,用户都可以通过单击一个图标或其他控件来显示或隐藏详细信息。

datagrid

datagrid 元素提供一个网格控件。可以用它显示树、列表和表格,用户和脚本可以更新这些界面元素。与之相反,传统的表格主要用来显示静态数据。

datagrid 从它的内容(一个 table、select 或其他 HTML 元素)获得初始数据。例如,代码 9 中的 datagrid 包含一张成绩表。在这个示例中,datagrid 的数据来自一个 table。更简单的一维 datagrid 可以从 select 元素获得数据。如果使用其他 HTML 元素,那么每个子元素成为网格中的一行。

<datagrid>

<table>

<tr><td>Jones</td><td>Allison</td><td>A-</td><td>B </td><td>A</td></tr>

<tr><td>Smith</td><td>Johnny</td><td>A</td><td>C </td><td>A</td></tr>

<tr><td>Willis</td><td>Sydney</td><td>C-</td><td>D</td><td>F</td></tr>

<tr><td>Wilson</td><td>Frank</td><td>B-</td><td>B </td><td>A</td></tr>

</table>

</datagrid>

这个元素与常规表格的区别在于,用户可以选择行、列和单元格;把行、列和单元格折叠起来;编辑单元格;删除行、列和单元格;对网格排序;以及在客户机浏览器中直接进行其他数据操作。可以用 JavaScript 代码监视更新。Document Object Model(DOM)中增加了 HTMLDataGridElement 接口以支持这个元素(代码 10 HTMLDataGridElement)。

interface HTMLDataGridElement : HTMLElement {

attribute DataGridDataProvider data;

readonly attribute DataGridSelection selection;

attribute boolean multiple;

attribute boolean disabled;

void updateEverything();

void updateRowsChanged(in RowSpecification row, in unsigned long count);

void updateRowsInserted(in RowSpecification row, in unsigned long count);

void updateRowsRemoved(in RowSpecification row, in unsigned long count);

void updateRowChanged(in RowSpecification row);

void updateColumnChanged(in unsigned long column);

void updateCellChanged(in RowSpecification row, in unsigned long column);

};

还可以使用 DOM 在网格中动态地装载数据。也就是说,datagrid 可以不包含那些提供初始数据的子元素。可以用一个 DataGridDataProvider 对象设置它(代码 11 DataGridDataProvider)。这样就可以从数据库、XmlHttpRequest 或者 JavaScript 代码能够访问的任何资源装载数据。

interface DataGridDataProvider {

void initialize(in HTMLDataGridElement datagrid);

unsigned long getRowCount(in RowSpecification row);

unsigned long getChildAtPosition(in RowSpecification parentRow,

in unsigned long position);

unsigned long getColumnCount();

DOMString getCaptionText(in unsigned long column);

void getCaptionClasses(in unsigned long column, in DOMTokenList classes);

DOMString getRowImage(in RowSpecification row);

HTMLMenuElement getRowMenu(in RowSpecification row);

void getRowClasses(in RowSpecification row, in DOMTokenList classes);

DOMString getCellData(in RowSpecification row, in unsigned long column);

void getCellClasses(in RowSpecification row, in unsigned long column,

in DOMTokenList classes);

void toggleColumnSortState(in unsigned long column);

void setCellCheckedState(in RowSpecification row, in unsigned long column,

in long state);

void cycleCell(in RowSpecification row, in unsigned long column);

void editCell(in RowSpecification row, in unsigned long column, in DOMString data);

};

menu 和 command

menu 元素实际上在 HTML 2 中就出现了。在 HTML 4 中废弃了它,但是 HTML 5 又恢复了它并指定了新的意义。在 HTML 5 中,menu 包含 command 元素,每个 command 元素引发一个操作。例如,代码 12 HTML 5 菜单 是一个弹出警告框的菜单。

<menu>

<commandlabel="Do 1st Command"/>

<command label="Do 2nd Command"/>

<commandlabel="Do 3rd Command"/>

</menu>

还可以用 checked="checked" 属性将命令转换为复选框。通过指定 radiogroup 属性,可以将复选框转换为单选按钮,这个属性的值是互相排斥的按钮的组名。

除了简单的命令列表之外,还可以使用 menu 元素创建工具栏或弹出式上下文菜单,这需要将 type 属性设置为 toolbar 或 popup。例如,代码 13. HTML 5 工具栏 显示一个与 WordPress 等 blog 编辑器相似的工具栏。它使用 icon 属性链接到按钮的图片。

<menu type="toolbar">

<commandlabel="strong" icon="bold.gif"/>

<command onclick="insertTag(buttons, 1);"label="em" icon="italic.gif"/>

<command onclick="insertLink(buttons, 2);" label="link" icon="link.gif"/>

<commandlabel="b-quote" icon="blockquote.gif"/>

<command onclick="insertTag(buttons, 4);"label="del" icon="del.gif"/>

<command onclick="insertTag(buttons, 5);"label="ins" icon="insert.gif"/>

<command label="img" icon="image.gif"/>

<commandlabel="ul" icon="bullet.gif"/>

<commandlabel="ol" icon="number.gif"/>

<commandlabel="li" icon="item.gif"/>

<command label="code" icon="code.gif"/>

<command onclick="insertTag(buttons, 11);" label="cite" icon="cite.gif"/>

<command label="abbr" icon="abbr.gif"/>

<command label="acronym" icon="acronym.gif"/>

</menu>

label 属性提供菜单的标题。例如,代码14. HTML 5 Edit 菜单 显示一个 Edit 菜单。

<menu type="popup" label="edit">

<command label="Undo"/>

<command label="Redo"/>

<commandlabel="Cut"/>

<command onclick="copy()" label="Copy"/>

<command onclick="paste()"label="Paste"/>

<command label="Clear"/>

</menu>

菜单可以嵌套在其他菜单中,形成层次化的菜单结构。