精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

使用 GPT 寫(xiě)代碼:高亮頁(yè)面關(guān)鍵字

人工智能
目前這種使用方式的效率還有待提升。整個(gè)過(guò)程耗費(fèi)了 1 個(gè)多小時(shí),寫(xiě)了不到 100 行代碼。在對(duì)話的過(guò)程中,還需要將代碼復(fù)制到 IDE 中,這并沒(méi)有將 GPT 和 IDE 串聯(lián)起來(lái)。

最近用戶(hù)跟我反饋了一個(gè)問(wèn)題,他們使用的瀏覽器高亮關(guān)鍵字的插件在我們的網(wǎng)站不生效,我看了一下,因?yàn)槭褂昧?webComponent 但插件沒(méi)有進(jìn)行兼容。他們說(shuō)這個(gè)功能非常重要,因此,我們就要在系統(tǒng)內(nèi)自己實(shí)現(xiàn)高亮頁(yè)面關(guān)鍵字。

在做一個(gè)新功能的時(shí)候,首先要先調(diào)研一下方案。

但在網(wǎng)上找了一圈,發(fā)現(xiàn)基本上都是以下這種方案:

// js部分
var bodyContent = document.body.innerHTMl;  // 獲取頁(yè)面內(nèi)容
var pattern = new RegExp('關(guān)鍵字', 'g'); // 生成正則表達(dá)式
// 匹配關(guān)鍵詞并替換
document.body.innerHTMl = bodyContent.replace(pattern, '<span class="highlight">$&</span>');

在 innerHTML 匹配關(guān)鍵字,將關(guān)鍵字替換成高亮的 span,然后重新替換 innerHTML 這樣實(shí)現(xiàn)雖然非常簡(jiǎn)單,但會(huì)導(dǎo)致 shadowRoot 和 iframe 失效。

于是我決定問(wèn)問(wèn) GPT,看看它能不能給我一點(diǎn)驚喜

使用 GPT 編寫(xiě)代碼

我:我要寫(xiě)一段 js 代碼,傳入指定的文本,在整個(gè)頁(yè)面高亮

GPT: 你可以使用 JavaScript 中的 DOM 操作來(lái)實(shí)現(xiàn)這個(gè)功能。以下是一段示例代碼:

function highlightText(text) {
  const body = document.body;
  const regex = new RegExp(text, 'gi');
  let match;

  while ((match = regex.exec(body.innerText))) {
    const span = document.createElement('span');
    span.style.backgroundColor = 'yellow';
    span.textContent = match[0];
    const range = document.createRange();
    range.setStart(body, match.index);
    range.setEnd(body, regex.lastIndex);
    range.deleteContents();
    range.insertNode(span);
  }
}

這段代碼會(huì)將頁(yè)面中所有匹配指定文本的文本節(jié)點(diǎn)用黃色高亮顯示。你可以將需要高亮的文本作為參數(shù)傳入 highlightText 函數(shù)中,例如:

highlightText('JavaScript');

點(diǎn)評(píng):代碼是寫(xiě)出來(lái)了,用了一個(gè)我還沒(méi)見(jiàn)過(guò)的 API。。。趕緊學(xué)習(xí)了一下 原理是:用 Range API 去選擇對(duì)應(yīng)的文本,然后使用 Range API 刪除和新增高亮節(jié)點(diǎn),思路看起來(lái)是沒(méi)問(wèn)題的,而且跟網(wǎng)上找到的不同

撤銷(xiāo)高亮

我: 還要能夠撤銷(xiāo)高亮

GPT: 好的,為了實(shí)現(xiàn)撤銷(xiāo)高亮的功能,我們可以在高亮文本時(shí)將每個(gè)被高亮的文本節(jié)點(diǎn)保存到一個(gè)數(shù)組中,然后在需要撤銷(xiāo)高亮?xí)r,遍歷這個(gè)數(shù)組,將每個(gè)高亮的文本節(jié)點(diǎn)恢復(fù)到原來(lái)的狀態(tài)。

以下是修改后的代碼:

let highlightedNodes = [];

function highlightText(text) {
  const body = document.body;
  const regex = new RegExp(text, 'gi');
  let match;

  while ((match = regex.exec(body.innerText))) {
    const span = document.createElement('span');
    span.style.backgroundColor = 'yellow';
    span.textContent = match[0];
    const range = document.createRange();
    range.setStart(body, match.index);
    range.setEnd(body, regex.lastIndex);
    range.deleteContents();
    range.insertNode(span);
    regex.lastIndex -= match[0].length - span.textContent.length;
    highlightedNodes.push(span);
  }
}

function clearHighlight() {
  while (highlightedNodes.length > 0) {
    const node = highlightedNodes.pop();
    const parent = node.parentNode;
    parent.replaceChild(node.firstChild, node);
    parent.normalize();
  }
}

點(diǎn)評(píng):牛逼,GPT 還是很聰明的,居然還會(huì)把 span 存起來(lái),用于撤銷(xiāo)高亮,這個(gè)思路也是非常的正確的。

Range 范圍算不準(zhǔn)

但是實(shí)際運(yùn)行后,這段代碼是會(huì)報(bào)錯(cuò)的,我排查了一下,發(fā)現(xiàn)計(jì)算出來(lái)的 Range 的 start 和 end 的位置是錯(cuò)誤的,于是我跟 GPT 說(shuō)一下,看看它如何糾正

我:算不準(zhǔn) start 和 end 的位置

GPT: 如果 setStart 和 setEnd 方法的位置計(jì)算不準(zhǔn)確,可能是因?yàn)樵谟?jì)算位置時(shí)沒(méi)有考慮到文本節(jié)點(diǎn)之間的空格和換行符。在這種情況下,你可以使用 createTreeWalker 方法來(lái)遍歷文檔樹(shù)中的所有文本節(jié)點(diǎn),并計(jì)算出每個(gè)文本節(jié)點(diǎn)的起始和結(jié)束位置。

以下是一段示例代碼:

function highlightText(text) {
  const body = document.body;
  const regex = new RegExp(text, 'gi');
  let match;

  const walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null, false);
  while (walker.nextNode()) {
    const node = walker.currentNode;
    while ((match = regex.exec(node.nodeValue))) {
      const span = document.createElement('span');
      span.style.backgroundColor = 'yellow';
      span.textContent = match[0];
      const range = document.createRange();
      range.setStart(node, match.index);
      range.setEnd(node, regex.lastIndex);
      range.deleteContents();
      range.insertNode(span);
    }
  }
}

在這個(gè)修改后的代碼中,我們使用 createTreeWalker 方法來(lái)遍歷文檔樹(shù)中的所有文本節(jié)點(diǎn)。對(duì)于每個(gè)文本節(jié)點(diǎn),我們使用 exec 方法來(lái)查找匹配指定文本的子串,并將每個(gè)匹配的子串用黃色高亮顯示。在計(jì)算位置時(shí),我們使用 setStart 和 setEnd 方法來(lái)設(shè)置范圍的起始和結(jié)束位置,以確保高亮顯示的文本范圍正確。

點(diǎn)評(píng):有點(diǎn)東西,我其實(shí)是不知道為什么算不準(zhǔn) start 和 end 的位置,但 GPT 自己也能發(fā)現(xiàn)問(wèn)題,并且給出了另一個(gè)解決方案,并且非常貼心解析了這段代碼

根據(jù) GPT 的提示,是空字符的文本節(jié)點(diǎn)導(dǎo)致的問(wèn)題,跟 GPT 提出的假設(shè)類(lèi)似。

頁(yè)面卡死

但我把上面代碼運(yùn)行,發(fā)現(xiàn)頁(yè)面卡死了,原因是,在 TreeWalker 遍歷過(guò)程中,新增了高亮節(jié)點(diǎn),然后又進(jìn)入高亮節(jié)點(diǎn)進(jìn)行遍歷,然后又創(chuàng)建高亮節(jié)點(diǎn)。。。

因此應(yīng)該在 TreeWalker 遍歷節(jié)點(diǎn)之后再進(jìn)行高亮節(jié)點(diǎn)替換,于是我讓 GPT 繼續(xù)改

我:在 TreeWalker 遍歷過(guò)程中修改節(jié)點(diǎn),會(huì)遍歷到新節(jié)點(diǎn),需要延遲修改節(jié)點(diǎn)

GPT: 是的,你說(shuō)的很對(duì)。在 TreeWalker 遍歷過(guò)程中修改節(jié)點(diǎn),會(huì)導(dǎo)致遍歷到新節(jié)點(diǎn),從而可能會(huì)出現(xiàn)意外的結(jié)果。為了避免這種情況,我們可以將需要修改的節(jié)點(diǎn)保存到一個(gè)數(shù)組中,在遍歷完成后再對(duì)這些節(jié)點(diǎn)進(jìn)行修改。

以下是一段示例代碼:

function highlightText(text) {
  const body = document.body;
  const regex = new RegExp(text, 'gi');
  let match;

  const nodesToHighlight = [];

  const walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, null, false);
  while (walker.nextNode()) {
    const node = walker.currentNode;
    while ((match = regex.exec(node.nodeValue))) {
      const span = document.createElement('span');
      span.style.backgroundColor = 'yellow';
      span.textContent = match[0];
      const range = document.createRange();
      range.setStart(node, match.index);
      range.setEnd(node, regex.lastIndex);
      range.deleteContents();
      range.insertNode(span);
      nodesToHighlight.push(span);
    }
  }

  nodesToHighlight.forEach(node => {
    const parent = node.parentNode;
    parent.replaceChild(node.firstChild, node);
    parent.normalize();
  });
}

在這個(gè)修改后的代碼中,我們新增了一個(gè)名為 nodesToHighlight 的數(shù)組,用于保存需要高亮的節(jié)點(diǎn)。在遍歷過(guò)程中,每當(dāng)找到一個(gè)需要高亮的節(jié)點(diǎn)時(shí),我們將這個(gè)節(jié)點(diǎn)添加到 nodesToHighlight 數(shù)組中。在遍歷完成后,我們遍歷 nodesToHighlight 數(shù)組,對(duì)每個(gè)節(jié)點(diǎn)進(jìn)行高亮處理。

這樣做可以確保在遍歷過(guò)程中不會(huì)修改節(jié)點(diǎn),從而避免出現(xiàn)意外的結(jié)果。

點(diǎn)評(píng):改了,但沒(méi)完全改好,TreeWalker 中仍然有修改 DOM 的操作,于是我換了個(gè)說(shuō)法

我:不能在遍歷過(guò)程中調(diào)用 deleteContents 和 insertNode

GPT: 是的,你說(shuō)的很對(duì)。在遍歷過(guò)程中調(diào)用 deleteContents 和 insertNode 方法,會(huì)導(dǎo)致遍歷到新節(jié)點(diǎn),從而可能會(huì)出現(xiàn)意外的結(jié)果。為了避免這種情況,我們可以將需要修改的節(jié)點(diǎn)保存到一個(gè)數(shù)組中,在遍歷完成后再對(duì)這些節(jié)點(diǎn)進(jìn)行修改。

以下是一段示例代碼:

function highlightText(text) {
  const body = document.body;
  const regex = new RegExp(text, 'gi');
  let match;

  const nodesToHighlight = [];

  const walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, {
    acceptNode: function(node) {
      if (node.parentNode.nodeName.match(/^(script|style)$/i)) {
        return NodeFilter.FILTER_REJECT;
      }
      return NodeFilter.FILTER_ACCEPT;
    }
  }, false);

  while (walker.nextNode()) {
    const node = walker.currentNode;
    while ((match = regex.exec(node.nodeValue))) {
      const span = document.createElement('span');
      span.style.backgroundColor = 'yellow';
      span.textContent = match[0];
      const range = document.createRange();
      range.setStart(node, match.index);
      range.setEnd(node, regex.lastIndex);
      nodesToHighlight.push({ range, span });
      regex.lastIndex -= match[0].length - span.textContent.length;
    }
  }

  setTimeout(() => {
    nodesToHighlight.forEach(({ range, span }) => {
      range.deleteContents();
      range.insertNode(span);
    });
  }, 0);
}

在這個(gè)修改后的代碼中,我們新增了一個(gè)名為 nodesToHighlight 的數(shù)組,用于保存需要高亮的節(jié)點(diǎn)和它們對(duì)應(yīng)的范圍。在遍歷過(guò)程中,每當(dāng)找到一個(gè)需要高亮的節(jié)點(diǎn)時(shí),我們將這個(gè)節(jié)點(diǎn)和它對(duì)應(yīng)的范圍添加到 nodesToHighlight 數(shù)組中。在遍歷完成后,我們使用 setTimeout 方法將對(duì)節(jié)點(diǎn)的修改延遲到下一個(gè)事件循環(huán)中執(zhí)行。

這樣做可以確保在遍歷過(guò)程中不會(huì)修改節(jié)點(diǎn),從而避免出現(xiàn)意外的結(jié)果。同時(shí),使用 setTimeout 方法可以將對(duì)節(jié)點(diǎn)的修改延遲到下一個(gè)事件循環(huán)中執(zhí)行,從而確保在修改節(jié)點(diǎn)時(shí)不會(huì)影響遍歷過(guò)程。

點(diǎn)評(píng):這段代碼終于能運(yùn)行了,非常的優(yōu)秀!

支持 shadowRoot

我:但這樣還不能遍歷 webComponent shadowRoot 里面的元素

GPT:

function highlightText(text) {
  const body = document.body;
  const regex = new RegExp(text, 'gi');
  let match;

  const nodesToHighlight = [];

  const walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, {
    acceptNode: function(node) {
      if (node.parentNode.nodeName.match(/^(script|style)$/i)) {
        return NodeFilter.FILTER_REJECT;
      }
      return NodeFilter.FILTER_ACCEPT;
    }
  }, false);

  while (walker.nextNode()) {
    const node = walker.currentNode;
    while ((match = regex.exec(node.nodeValue))) {
      const span = document.createElement('span');
      span.style.backgroundColor = 'yellow';
      span.textContent = match[0];
      const range = document.createRange();
      range.setStart(node, match.index);
      range.setEnd(node, regex.lastIndex);
      nodesToHighlight.push({ range, span });
      regex.lastIndex -= match[0].length - span.textContent.length;
    }
  }

  const shadowHosts = document.querySelectorAll('*');
  shadowHosts.forEach(shadowHost => {
    const shadowRoot = shadowHost.shadowRoot;
    if (shadowRoot) {
      const walker = document.createTreeWalker(shadowRoot, NodeFilter.SHOW_TEXT, {
        acceptNode: function(node) {
          if (node.parentNode.nodeName.match(/^(script|style)$/i)) {
            return NodeFilter.FILTER_REJECT;
          }
          return NodeFilter.FILTER_ACCEPT;
        }
      }, true);

      while (walker.nextNode()) {
        const node = walker.currentNode;
        while ((match = regex.exec(node.nodeValue))) {
          const span = document.createElement('span');
          span.style.backgroundColor = 'yellow';
          span.textContent = match[0];
          const range = document.createRange();
          range.setStart(node, match.index);
          range.setEnd(node, regex.lastIndex);
          nodesToHighlight.push({ range, span });
        }
      }
    }
  });

  setTimeout(() => {
    nodesToHighlight.forEach(({ range, span }) => {
      range.deleteContents();
      range.insertNode(span);
    });
  }, 0);
}

在這個(gè)修改后的代碼中,我們使用 querySelectorAll 方法來(lái)獲取所有元素,然后對(duì)于每個(gè)元素,我們**檢查它是否有 shadowRoot**。如果有,我們使用 createTreeWalker 方法來(lái)遍歷它的 shadowRoot 中的所有文本節(jié)點(diǎn)。在遍歷過(guò)程中,我們使用與之前相同的方式來(lái)查找需要高亮的節(jié)點(diǎn),并將它們添加到 nodesToHighlight 數(shù)組中。

這樣做可以確保遍歷到 shadowRoot 中的所有文本節(jié)點(diǎn),并將需要高亮的節(jié)點(diǎn)保存到 nodesToHighlight 數(shù)組中。然后,我們使用 setTimeout 方法將對(duì)節(jié)點(diǎn)的修改延遲到下一個(gè)事件循環(huán)中執(zhí)行,從而確保在修改節(jié)點(diǎn)時(shí)不會(huì)影響遍歷過(guò)程。

點(diǎn)評(píng):這段代碼也是能運(yùn)行的,很牛逼,不過(guò)沒(méi)考慮代碼的復(fù)用性,shadowRoot 的處理,可以復(fù)用普通的 DOM 的高亮邏輯

撤銷(xiāo)操作支持 shadowRoot

我:撤銷(xiāo)操作也要作用到 shadowRoot

GPT: 是的,你說(shuō)的很對(duì)。如果需要對(duì) shadowRoot 中的高亮文本進(jìn)行撤銷(xiāo)操作,我們可以使用 Range 對(duì)象的 deleteContents() 方法來(lái)刪除高亮文本所在的節(jié)點(diǎn),并將原始文本重新插入到文檔中。

以下是一段示例代碼:

function removeHighlight() {
  const highlightedSpans = document.querySelectorAll('span[style="background-color: yellow;"]');
  highlightedSpans.forEach(span => {
    const range = document.createRange();
    range.selectNode(span);
    range.deleteContents();
    range.insertNode(document.createTextNode(span.textContent));
  });

  const shadowHosts = document.querySelectorAll('*');
  shadowHosts.forEach(shadowHost => {
    if (shadowHost.shadowRoot) {
      const highlightedSpans = shadowHost.shadowRoot.querySelectorAll('span[style="background-color: yellow;"]');
      highlightedSpans.forEach(span => {
        const range = document.createRange();
        range.selectNode(span);
        range.deleteContents();
        range.insertNode(document.createTextNode(span.textContent));
      });
    }
  });
}

點(diǎn)評(píng):代碼可以運(yùn)行,但有以下缺點(diǎn):

  • ? 同樣是復(fù)用性不足,
  • ? 高亮節(jié)點(diǎn)的選擇器 span[style="background-color: yellow;"] 不太優(yōu)雅,不夠健壯 但問(wèn)題不大,我自己能改hhh

highligh 函數(shù)需要支持重復(fù)調(diào)用

目前的代碼會(huì)有一個(gè)問(wèn)題,就是重復(fù)調(diào)用 highlightText,已高亮的節(jié)點(diǎn),仍然會(huì)創(chuàng)建 span,這就會(huì)導(dǎo)致 span 重復(fù)嵌套。需要先判斷是否已經(jīng)高亮了。

我:highlightText 如果同一個(gè)值多次調(diào)用,會(huì)給文本節(jié)點(diǎn)再嵌套一層高亮節(jié)點(diǎn),要支持重復(fù)調(diào)用不會(huì)重復(fù)嵌套節(jié)點(diǎn)

GPT: 好的,如果需要支持重復(fù)調(diào)用 highlightText 函數(shù)時(shí)不會(huì)重復(fù)嵌套高亮節(jié)點(diǎn),我們可以在每次調(diào)用函數(shù)之前先檢查文本節(jié)點(diǎn)是否已經(jīng)被高亮過(guò),如果已經(jīng)被高亮過(guò),則不再重復(fù)嵌套高亮節(jié)點(diǎn)。

以下是修改后的 highlightText 函數(shù)代碼:

function highlightText(text) {
  const body = document.body;
  const regex = new RegExp(text, 'gi');
  let match;

  const nodesToHighlight = [];

  const walker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT, {
    acceptNode: function(node) {
      if (node.parentNode.nodeName.match(/^(script|style)$/i)) {
        return NodeFilter.FILTER_REJECT;
      }
      return NodeFilter.FILTER_ACCEPT;
    }
  }, false);

  while (walker.nextNode()) {
    const node = walker.currentNode;
    if (node.parentNode.classList.contains('highlighted')) {
      continue;
    }
    while ((match = regex.exec(node.nodeValue))) {
      const span = document.createElement('span');
      span.style.backgroundColor = 'yellow';
      span.textContent = match[0];
      const range = document.createRange();
      range.setStart(node, match.index);
      range.setEnd(node, regex.lastIndex);
      nodesToHighlight.push({ range, span });
      regex.lastIndex -= match[0].length - span.textContent.length;
    }
  }

  const shadowHosts = document.querySelectorAll('*');
  shadowHosts.forEach(shadowHost => {
    if (shadowHost.shadowRoot) {
      const shadowRoot = shadowHost.shadowRoot;
      const walker = document.createTreeWalker(shadowRoot, NodeFilter.SHOW_TEXT, {
        acceptNode: function(node) {
          if (node.parentNode.nodeName.match(/^(script|style)$/i)) {
            return NodeFilter.FILTER_REJECT;
          }
          return NodeFilter.FILTER_ACCEPT;
        }
      }, true);

      while (walker.nextNode()) {
        const node = walker.currentNode;
        if (node.parentNode.classList.contains('highlighted')) {
          continue;
        }
        while ((match = regex.exec(node.nodeValue))) {
          const span = document.createElement('span');
          span.style.backgroundColor = 'yellow';
          span.textContent = match[0];
          const range = document.createRange();
          range.setStart(node, match.index);
          range.setEnd(node, regex.lastIndex);
          nodesToHighlight.push({ range, span });
          regex.lastIndex -= match[0].length - span.textContent.length;
        }
      }
    }
  });

  nodesToHighlight.forEach(nodeToHighlight => {
    const range = nodeToHighlight.range;
    const span = nodeToHighlight.span;
    range.deleteContents();
    span.classList.add('highlighted');
    range.insertNode(span);
  });
}

在這個(gè)代碼中,我們添加了一個(gè)名為 highlighted 的 CSS 類(lèi),用于標(biāo)記已經(jīng)被高亮過(guò)的文本節(jié)點(diǎn)。在每次遍歷文本節(jié)點(diǎn)時(shí),我們檢查當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)是否已經(jīng)被標(biāo)記為 highlighted,如果是,則跳過(guò)當(dāng)前節(jié)點(diǎn),不再重復(fù)嵌套高亮節(jié)點(diǎn)。在插入高亮節(jié)點(diǎn)時(shí),我們還將其添加到 highlighted 類(lèi)中,以便下次遍歷時(shí)可以正確地跳過(guò)已經(jīng)被高亮過(guò)的節(jié)點(diǎn)。

點(diǎn)評(píng):完美符合要求~我只需要稍微復(fù)用以下代碼,進(jìn)行一些小修改即可。

最終還是成為了一名代碼美化工程師~~~

使用體驗(yàn)

GPT 確實(shí)非常強(qiáng)大,它知道的非常多,有我不知道的知識(shí),如果不是 GPT 我的確不會(huì)知道可以使用 Range API 去操作 DOM 實(shí)現(xiàn)高亮。

它還能較好的根據(jù)提示,糾正自己的錯(cuò)誤

我們可以讓 GPT 提供思路,寫(xiě)一個(gè)簡(jiǎn)單的 Demo,然后自己進(jìn)行代碼優(yōu)化。

目前這種使用方式的效率還有待提升。整個(gè)過(guò)程耗費(fèi)了 1 個(gè)多小時(shí),寫(xiě)了不到 100 行代碼。在對(duì)話的過(guò)程中,還需要將代碼復(fù)制到 IDE 中,這并沒(méi)有將 GPT 和 IDE 串聯(lián)起來(lái)。

不過(guò),我們可以嘗使用 Cursor 這個(gè) IDE,它可以直接在 IDE 中使用 GPT,這樣應(yīng)該會(huì)有更好的編碼體驗(yàn)。

責(zé)任編輯:武曉燕 來(lái)源: Candy 的修仙秘籍
相關(guān)推薦

2021-02-01 13:10:07

Staticc語(yǔ)言UNIX系統(tǒng)

2012-06-02 00:53:39

Javafinally

2010-07-23 14:32:43

SQL Server

2011-06-27 17:32:20

2022-01-04 16:35:42

C++Protected關(guān)鍵字

2012-03-01 12:50:03

Java

2009-09-02 09:24:03

C# this關(guān)鍵字

2009-09-17 09:30:00

Linq LET關(guān)鍵字

2018-04-20 15:56:09

Pythonglobal關(guān)鍵字

2009-08-21 14:58:56

C# this關(guān)鍵字

2013-01-30 10:12:14

Pythonyield

2009-06-25 10:33:53

StaticJava類(lèi)

2009-12-08 18:02:06

PHP final關(guān)鍵

2009-06-29 18:14:23

Java多線程volatile關(guān)鍵字

2009-09-01 15:25:04

C# default關(guān)

2009-08-13 13:04:29

C# lock關(guān)鍵字

2022-06-29 08:05:25

Volatile關(guān)鍵字類(lèi)型

2019-11-06 10:36:43

MavenoptionalJava

2025-01-09 10:30:40

2022-02-17 08:31:38

C語(yǔ)言staic關(guān)鍵字
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产精品久久久久久无人区| 久久人妻少妇嫩草av无码专区| av大全在线免费看| 麻豆精品国产91久久久久久| 久久夜色精品国产| 国产51自产区| 国精产品一区二区三区有限公司| 国产精品久久久久久福利一牛影视| 亚洲精品日韩激情在线电影| 国产做受高潮漫动| 国产精品久久久乱弄| 亚洲精品xxx| 天堂av8在线| 性欧美18~19sex高清播放| 国产精品久久久爽爽爽麻豆色哟哟 | 欧美激情欧美| 亚洲精品黄网在线观看| 亚洲天堂网2018| 亚洲黄色免费看| 亚洲欧美区自拍先锋| 欧美精品亚洲精品| 亚洲国产999| 国产xxxx在线观看| 91精品麻豆| 色综合久久综合网欧美综合网| 天堂av在线中文| www.亚洲免费| 久久亚洲精华国产精华液| 亚洲伊人第一页| 国产一级精品毛片| 国产日本精品| 久久免费视频网站| 国产盗摄x88av| 99久久激情| 国产一区二区三区在线视频 | 激情久久一区二区| 色哟哟欧美精品| 玩弄中年熟妇正在播放| 午夜在线激情影院| 亚洲乱码国产乱码精品精的特点| 日韩三级电影免费观看| 欧美日韩影视| 91一区在线观看| 激情视频一区二区| 欧美一级特黄aaaaaa| 国产一区二区三区四区五区入口 | 亚洲午夜av久久乱码| 国产日韩视频一区| 综合成人在线| 欧美r级在线观看| 妖精视频在线观看| 欧美高清一级片| 日韩视频一区在线观看| 91视频福利网| 久久av网站| 日韩免费观看高清完整版在线观看| 天堂视频免费看| 日本成人一区二区| 91精品麻豆日日躁夜夜躁| 午夜视频在线网站| 国内不卡的一区二区三区中文字幕 | 免费污视频在线| 亚洲视频一区二区在线观看| 中文字幕一区二区三区最新| 在线看免费av| 亚洲欧洲综合另类| 久久亚洲a v| 美女日批视频在线观看| 亚洲国产视频网站| 成人av一级片| 欧美aaa视频| 欧美精品日韩一本| 美女被爆操网站| 你懂的在线观看一区二区| 日韩精品亚洲元码| xxxx日本黄色| 日韩精品看片| 欧美成人中文字幕| 国产无遮挡又黄又爽| 在线一区欧美| 国产精品色婷婷视频| 国产女人高潮时对白| 成人精品一区二区三区中文字幕 | 欧美特级aaa| 国产人与zoxxxx另类91| 欧美大片在线观看一区| 在线观看日韩精品视频| 久久激情电影| 欧美激情xxxxx| 国产成人一级片| 精品亚洲国内自在自线福利| 国产福利不卡| 自拍视频在线网| 一区二区国产视频| av观看免费在线| 999精品视频在线观看| 亚洲第一区第二区| 一级黄色片网址| 欧美视频网站| 国产精品高清在线| 亚洲欧美黄色片| 国产精品免费久久久久| 青青在线免费观看| 91丨porny丨探花| 中文字幕中文字幕在线十八区 | 国产av不卡一区二区| 白白色在线观看| 欧美日韩综合不卡| 在线视频 日韩| 久久精品国产68国产精品亚洲| 久久男人资源视频| 97精品人妻一区二区三区在线| 99国产精品久久久久| 熟妇熟女乱妇乱女网站| se01亚洲视频| 亚洲精品久久视频| h色网站在线观看| 日韩高清一区在线| 久久精品国产一区二区三区不卡| 黄色片网站在线观看| 日韩欧美中文字幕在线观看| 无码国产精品一区二区高潮| 成人av资源电影网站| 91大神福利视频在线| 99久久国产热无码精品免费| 国产视频一区二区三区在线观看| 可以看毛片的网址| 久久久精品区| 久久精品国产2020观看福利| 日韩在线播放中文字幕| 99久久婷婷国产综合精品| 久久这里只有精品8| 图片一区二区| 色琪琪综合男人的天堂aⅴ视频| 国产精品国产三级国产专区52| 国产精品888| 色哟哟免费网站| 国产精品1区| 爱福利视频一区| 伊人网中文字幕| 久久精品一区八戒影视| 国产 福利 在线| 九色丨蝌蚪丨成人| 国产69精品久久久| 亚洲免费不卡视频| 亚洲曰韩产成在线| 亚洲国产精品狼友在线观看| 欧美成人一品| 99久久99| 国产www视频在线观看| 欧美tk丨vk视频| 亚洲日韩中文字幕| 老熟妇高潮一区二区三区| 久久国产精品色| 做爰高潮hd色即是空| avtt久久| 欧美激情女人20p| 亚洲成人第一区| 亚洲成a人v欧美综合天堂| 国产伦精品一区二区三区精品| 亚洲第一黄网| 欧美日韩免费观看一区| 欧美色网一区| 综合欧美国产视频二区| 97超碰人人草| 亚洲精品免费在线| 国产艳妇疯狂做爰视频| 亚洲精品美女91| 欧美久久电影| 国产一区二区三区四区五区3d| www国产91| 精品人妻一区二区三区换脸明星| 亚洲国产精品久久久久秋霞影院 | 亚洲 欧美 日韩 在线| 久久精品一区蜜桃臀影院| 性猛交ⅹ×××乱大交| 91精品一区二区三区综合在线爱| 999国内精品视频在线| free性护士videos欧美| 亚洲天堂成人在线| 99精品视频在线播放免费| 亚洲国产视频网站| 久久精品三级视频| 国产aⅴ综合色| 91av在线免费播放| 伊人久久大香线蕉精品组织观看| 国产精品一区二区欧美黑人喷潮水| 毛片在线网站| 亚洲视频免费一区| 国产成人av免费看| 色94色欧美sute亚洲线路一久| 黄色录像二级片| 久久综合狠狠综合久久激情| 亚洲娇小娇小娇小| 日韩天天综合| 国产一区一区三区| 亚洲国产合集| 亚洲自拍偷拍一区| 欧美舌奴丨vk视频| 欧美激情久久久久久| 国产资源在线看| 精品乱人伦一区二区三区| 国产精品美女免费看| 青青草娱乐在线| 91精品国产一区二区人妖| 日韩 欧美 中文| 中文字幕一区在线观看视频| 动漫美女无遮挡免费| 麻豆精品新av中文字幕| 男女高潮又爽又黄又无遮挡| 99久久99久久精品国产片果冰| 久久精品女人的天堂av| 亚洲三区欧美一区国产二区| 国产福利成人在线| 国内激情视频在线观看| 久久天天躁狠狠躁老女人| 黄色av网址在线免费观看| 日韩免费高清av| 国产女人18毛片水真多| 欧美优质美女网站| 国产精品男女视频| 亚洲图片欧美综合| 婷婷伊人五月天| 国产精品免费网站在线观看| 成人精品在线观看视频| 国产成人精品网址| 制服丝袜中文字幕第一页| 久久精品官网| 亚洲熟妇无码另类久久久| 国内自拍视频一区二区三区| 亚洲一区二区四区| 日韩国产在线| 亚洲成人蜜桃| 精品国产一区二区三区香蕉沈先生 | 正在播放一区二区三区| 欧美少妇xxxx| 日韩精品极品视频在线观看免费| 亚洲盗摄视频| 精品久久久久久中文字幕动漫| av男人一区| 国产传媒一区二区| 99这里只有精品视频| 亚洲综合中文字幕在线观看| 亚洲色图图片| 91在线中文字幕| 久久影院一区二区三区| 成人a在线视频| 国产精品成人**免费视频| 成人a级免费视频| 国产精品久久久久久av公交车| 国产精品自产拍在线观| 欧美黄页免费| 成人精品一区二区三区电影免费| 久久青草视频| 91热福利电影| 视频一区日韩| 国产精品一区二区你懂得| 四季av综合网站| 免播放器亚洲一区| 亚洲一区日韩精品| 国产一区二区伦理片| 又色又爽又黄18网站| 成人国产在线观看| 亚洲国产综合视频| 国产欧美日韩不卡| 日韩一区二区三区四区视频| 亚洲欧美另类小说视频| 久久久99精品| 黑人与娇小精品av专区| 无码人妻熟妇av又粗又大| 欧美日韩综合色| 国产不卡精品视频| 日韩h在线观看| av影片在线看| 欧美激情手机在线视频| 亚洲欧美一区二区三区| 国产日韩欧美成人| julia中文字幕一区二区99在线| 国产在线欧美日韩| 精品视频久久| 一本色道久久88亚洲精品综合| 亚洲电影成人| 天天操,天天操| 高清成人免费视频| 公侵犯人妻一区二区三区| 日韩美女精品在线| 国产精品美女久久久久av爽| 欧美在线不卡视频| 亚洲国产精品suv| 亚洲天堂av女优| 免费毛片在线看片免费丝瓜视频| 日本中文字幕久久看| 成人精品在线| 欧美日韩在线观看一区| 亚洲综合五月| 成年人黄色片视频| 国产69精品久久久久777| av小说在线观看| 亚洲精品日日夜夜| 国产精品国产精品国产| 精品日本一线二线三线不卡| 国产视频第一区| 久久久久五月天| 四虎精品一区二区免费| 久久国产精品 国产精品| 91精品啪在线观看国产81旧版| 国产在线青青草| 国产成人综合网| 老鸭窝一区二区| 一区二区不卡在线播放| 中文字幕一级片| 亚洲男人av在线| 手机av在线播放| 国产一区二区在线播放| 蜜桃成人av| 黄色三级中文字幕| 国产一区在线看| 一级片视频免费看| 日韩欧美精品中文字幕| 亚洲国产精品suv| 久久国产色av| 免费日韩成人| 欧美一级午夜免费电影| 麻豆亚洲av成人无码久久精品| 91福利在线观看| 日本大臀精品| 午夜精品美女自拍福到在线| 美国十次综合久久| 一区二区在线高清视频| 蜜臀av一区二区在线免费观看| 成年人在线观看av| 五月天视频一区| 欧美 日韩 国产 在线| 久久99久久99精品免观看粉嫩 | 福利在线播放| 日韩美女中文字幕| 一个色免费成人影院| 欧美精品一区免费| av在线不卡电影| 国产一级做a爱片久久毛片a| 亚洲高清久久久久久| 黄页网站大全在线免费观看| 亚洲最大的av网站| 欧美成人69av| 亚洲性图第一页| 亚洲午夜电影在线| 天堂在线观看av| 51精品国产黑色丝袜高跟鞋 | 日本高清不卡一区二区三| 国产日韩一区| 免费看污黄网站在线观看| 欧美日韩裸体免费视频| 毛片在线播放网站| 国产精品亚洲视频在线观看| 视频在线不卡免费观看| 男人午夜视频在线观看| 亚洲精选免费视频| 亚洲av综合色区无码一区爱av| 久久久久久久久久av| 色天下一区二区三区| 日韩无套无码精品| 国产精品久久夜| 精品人妻久久久久一区二区三区| 久久久午夜视频| 一区二区导航| 色免费在线视频| 一区二区三区四区乱视频| 欧美天堂在线视频| 国产成人精品免费视频| 成人中文在线| 久久精品无码一区二区三区毛片| 亚洲国产美国国产综合一区二区| 四虎精品在永久在线观看| 国产成人精品在线观看| 久久久久久美女精品| 亚洲国产精品第一页| 日韩欧美一区二区三区久久| 成年人在线视频免费观看| 91在线|亚洲| 雨宫琴音一区二区在线| 日本理论中文字幕| 91精品国产免费| 日韩精品极品| 一区二区视频在线观看| 波多野结衣视频一区| 成人免费一级片| 欧美成人剧情片在线观看| 日韩三级视频| 日本77777| 五月婷婷另类国产| 免费大片在线观看www| 91看片淫黄大片一级| 亚洲图片第一页| 精品99999| 播放一区二区| h无码动漫在线观看| 亚洲国产精品av| 五月婷婷在线播放| 成人网页在线免费观看| 久久精品人人做人人爽电影蜜月|