日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

13個(gè) JavaScript 面試難題及代碼實(shí)現(xiàn)

來源: 責(zé)編: 時(shí)間:2024-07-15 17:11:30 204觀看
導(dǎo)讀今天我將帶你深入了解 14 個(gè)常見的 JavaScript 高級面試問題。這些問題涵蓋了 JavaScript 的面向?qū)ο蟆⑹录h(huán)機(jī)制、Promise 等高級概念,以及函數(shù)柯里化和深度復(fù)制等實(shí)用技術(shù)。我們不僅從概念層面對每個(gè)問題進(jìn)行了分

今天我將帶你深入了解 14 個(gè)常見的 JavaScript 高級面試問題。這些問題涵蓋了 JavaScript 的面向?qū)ο蟆⑹录h(huán)機(jī)制、Promise 等高級概念,以及函數(shù)柯里化和深度復(fù)制等實(shí)用技術(shù)。4Vm28資訊網(wǎng)——每日最新資訊28at.com

4Vm28資訊網(wǎng)——每日最新資訊28at.com

我們不僅從概念層面對每個(gè)問題進(jìn)行了分析,還提供了具體的代碼實(shí)現(xiàn)。4Vm28資訊網(wǎng)——每日最新資訊28at.com

那我們現(xiàn)在就開始吧。4Vm28資訊網(wǎng)——每日最新資訊28at.com

1.this關(guān)鍵字指向

this關(guān)鍵字指向當(dāng)前執(zhí)行上下文中的一個(gè)對象。在函數(shù)中,this關(guān)鍵字通常指向函數(shù)的調(diào)用者。4Vm28資訊網(wǎng)——每日最新資訊28at.com

問題:以下代碼輸出什么?為什么?4Vm28資訊網(wǎng)——每日最新資訊28at.com

const obj = {  name: 'obj',  getName: function() {    return function() {      return this.name;    }  }}const fn = obj.getName();fn();

答案:undefined4Vm28資訊網(wǎng)——每日最新資訊28at.com

分析:因?yàn)間etName函數(shù)內(nèi)部是在全局作用域內(nèi)執(zhí)行的,這里的this指向window/global,而window/global沒有name屬性,所以返回undefined。4Vm28資訊網(wǎng)——每日最新資訊28at.com

如果想讓內(nèi)部函數(shù)的this也指向obj,可以使用箭頭函數(shù)或者bind綁定this:4Vm28資訊網(wǎng)——每日最新資訊28at.com

const obj = {  name: 'obj',  getName: function() {    return () => {       return this.name;    }  }}

2.閉包的實(shí)現(xiàn)與應(yīng)用

問題:實(shí)現(xiàn)一個(gè)計(jì)數(shù)器工廠函數(shù):4Vm28資訊網(wǎng)——每日最新資訊28at.com

function createCounter() {  let count = 0;  return function() {    return count++;   }} const counter1 = createCounter();const counter2 = createCounter();counter1(); // 1counter1(); // 2 counter2(); // 1

解析:不同的計(jì)數(shù)器之所以能獨(dú)立遞增,是因?yàn)槔昧碎]包的特性。createCounter函數(shù)創(chuàng)建了一個(gè)閉包,在其外層作用域中可以訪問變量count,counter1和counter2引用不同的閉包函數(shù)實(shí)例,從而實(shí)現(xiàn)了計(jì)數(shù)獨(dú)立性。4Vm28資訊網(wǎng)——每日最新資訊28at.com

3.事件循環(huán)機(jī)制

問:對事件循環(huán)機(jī)制做一下解釋說明。4Vm28資訊網(wǎng)——每日最新資訊28at.com

答:事件循環(huán)機(jī)制主要有以下幾個(gè)流程:4Vm28資訊網(wǎng)——每日最新資訊28at.com

  1. 同步任務(wù)在主線程執(zhí)行,形成執(zhí)行上下文棧。
  2. 執(zhí)行棧中同步任務(wù)執(zhí)行完后,系統(tǒng)會(huì)讀取隊(duì)列中的異步任務(wù),如Promise.then()、setTimeout、AJAX回調(diào)等。
  3. 異步任務(wù)會(huì)被加入到任務(wù)隊(duì)列中
  4. 清空執(zhí)行棧后,系統(tǒng)會(huì)檢查任務(wù)隊(duì)列,如果不為空,則取出第一個(gè)任務(wù)放到執(zhí)行棧中執(zhí)行。
  5. 主線程重復(fù)了棧和隊(duì)列交替執(zhí)行的過程,從而實(shí)現(xiàn)了線程的排隊(duì)執(zhí)行。

事件循環(huán)允許在同一個(gè)線程中交替執(zhí)行同步任務(wù)和異步任務(wù),充分利用CPU資源。這對于支持UI交互和響應(yīng)性的JavaScript來說很重要。4Vm28資訊網(wǎng)——每日最新資訊28at.com

4.Promise對象

問題:實(shí)現(xiàn)Promise的簡單版本:4Vm28資訊網(wǎng)——每日最新資訊28at.com

Promise對象是處理異步事件的異步編程解決方案。Promise對象可以表示異步操作的狀態(tài),包括:4Vm28資訊網(wǎng)——每日最新資訊28at.com

  • pending
  • fulfilled
  • rejected

Promise對象的實(shí)現(xiàn)如下:4Vm28資訊網(wǎng)——每日最新資訊28at.com

class MyPromise {  constructor(executor) {    this._state = "pending";    this._value = undefined;    this._reason = undefined;    this._onFulfilledCallbacks = [];    this._onRejectedCallbacks = [];    executor(this.resolve.bind(this), this.reject.bind(this));  }  resolve(value) {    if (this._state !== "pending") {      return;    }    this._state = "fulfilled";    this._value = value;    setTimeout(() => {      for (const callback of this._onFulfilledCallbacks) {        callback(value);      }    });  }  reject(reason) {    if (this._state !== "pending") {      return;    }    this._state = "rejected";    this._reason = reason;    setTimeout(() => {      for (const callback of this._onRejectedCallbacks) {        callback(reason);      }    });  }  then(onFulfilled, onRejected) {    return new MyPromise((resolve, reject) => {      if (this._state === "pending") {        this._onFulfilledCallbacks.push((value) => {          setTimeout(() => {            try {              const result = onFulfilled(value);              resolve(result);            } catch (error) {              reject(error);            }          });        });        this._onRejectedCallbacks.push((reason) => {          setTimeout(() => {            try {              const result = onRejected(reason);              resolve(result);            } catch (error) {              reject(error);            }          });        });      } else {        setTimeout(() => {          try {            if (this._state === "fulfilled") {              const result = onFulfilled(this._value);              resolve(result);            } else {              const result = onRejected(this._reason);              resolve(result);            }          } catch (error) {            reject(error);          }        });      }    });  }  catch(onRejected) {    return this.then(null, onRejected);  }  isFulfilled() {    return this._state === "fulfilled";  }  isRejected() {    return this._state === "rejected";  }}

分析:4Vm28資訊網(wǎng)——每日最新資訊28at.com

  1. MyPromise類是一個(gè)自定義的Promise類,其構(gòu)造函數(shù)接受一個(gè)執(zhí)行函數(shù)作為參數(shù)。
  2. 構(gòu)造函數(shù)中的執(zhí)行函數(shù)會(huì)被立即執(zhí)行,并接受兩個(gè)參數(shù)resolve和reject,用于修改Promise的狀態(tài)。
  3. resolve方法用于將Promise的狀態(tài)從“pending”修改為“fulfilled”,并將值傳遞給后續(xù)的handler。
  4. reject方法用于將Promise的狀態(tài)從“pending”修改為“rejected”,并將原因傳遞給后續(xù)的handler。
  5. then方法用于注冊一個(gè)回調(diào)函數(shù),在Promise完成或被拒絕時(shí)執(zhí)行,它接受兩個(gè)參數(shù)onFulfilled和onRejected,分別在Promise完成或被拒絕時(shí)調(diào)用。
  6. then方法返回一個(gè)新的MyPromise實(shí)例,以支持鏈?zhǔn)秸{(diào)用。如果 onFulfilled 或 onRejected 返回一個(gè)值,它將被用作下一個(gè) MyPromise 實(shí)例的解析值。
  7. catch 方法是 then(null, onRejected) 的簡寫形式。
  8. isFulfilled 方法用于檢查 Promise 是否處于已實(shí)現(xiàn)狀態(tài)。
  9. isRejected 方法用于檢查 Promise 是否處于已拒絕狀態(tài)。

5.類繼承實(shí)現(xiàn)

原型鏈?zhǔn)敲總€(gè)對象的一個(gè)屬性,它指向該對象構(gòu)造函數(shù)的原型對象。一個(gè)構(gòu)造函數(shù)的原型對象指向另一個(gè)構(gòu)造函數(shù)的原型對象,依此類推。4Vm28資訊網(wǎng)——每日最新資訊28at.com

問題:要實(shí)現(xiàn)一個(gè) People 類,可以通過構(gòu)造函數(shù)或 new 操作符實(shí)例化對象。同時(shí),它有一個(gè)繼承 Person 類的方法。Person 類有一個(gè) sayHi 方法:4Vm28資訊網(wǎng)——每日最新資訊28at.com

class Person {  constructor(name) {    this.name = name;  }  sayHi() {    console.log(`Hello ${this.name}`)  }}class People extends Person {  constructor(name) {    super(name);  }  method() {    console.log('people method')  }}const people = new People('John')people.sayHi() // Hello Johnpeople.method() // people method

分析:通過構(gòu)造函數(shù)調(diào)用super繼承屬性,原型鏈實(shí)現(xiàn)方法繼承。4Vm28資訊網(wǎng)——每日最新資訊28at.com

6.MVC與MVVM模式

問:簡述MVC與MVVM的概念和區(qū)別?4Vm28資訊網(wǎng)——每日最新資訊28at.com

答:MVC模式中:4Vm28資訊網(wǎng)——每日最新資訊28at.com

  1. Model負(fù)責(zé)管理數(shù)據(jù)邏輯
  2. View負(fù)責(zé)顯示界面
  3. Controller連接Model與View并傳遞數(shù)據(jù)

MVVM模式中:4Vm28資訊網(wǎng)——每日最新資訊28at.com

  1. Model負(fù)責(zé)管理數(shù)據(jù)邏輯
  2. View負(fù)責(zé)顯示界面
  3. ViewModel作為View與Model的交互代理,將Model同步到View,將View的變化同步回Model。

區(qū)別在于:4Vm28資訊網(wǎng)——每日最新資訊28at.com

  • MVVM中沒有Controller的角色,View直接將數(shù)據(jù)綁定到ViewModel。
  • ViewModel負(fù)責(zé)將數(shù)據(jù)轉(zhuǎn)換成View可以識(shí)別的格式,提供給View使用。
  • ViewModel可以將View的變化通知回Model層,實(shí)現(xiàn)雙向數(shù)據(jù)綁定。
  • MVVM可以解耦View與Model之間的緊耦合,利于單元測試和組件開發(fā)。

7.Ajax實(shí)現(xiàn)

問題:實(shí)現(xiàn)一個(gè)ajax請求函數(shù):4Vm28資訊網(wǎng)——每日最新資訊28at.com

ajax('/api/users', {  method: 'GET'  }).then(data => {  console.log(data)})

回答:4Vm28資訊網(wǎng)——每日最新資訊28at.com

function ajax(url, options) {  return new Promise((resolve, reject) => {    const xhr = new XMLHttpRequest();    const method = options.method || 'GET';    const headers = options.headers || {};    const body = options.body || null;    const timeout = options.timeout || 0;    xhr.open(method, url);    xhr.onload = () => {      if (xhr.status >= 200 && xhr.status < 300) {        resolve(xhr.response);      } else {        reject(new Error(xhr.statusText));      }    };    xhr.onerror = () => reject(xhr.error);    xhr.ontimeout = () => reject(new Error('Request timeout'));    xhr.timeout = timeout;    for (const [header, value] of Object.entries(headers)) {      xhr.setRequestHeader(header, value);    }    xhr.send(body);  });}

實(shí)現(xiàn)一個(gè)支持Promise的ajax請求函數(shù):4Vm28資訊網(wǎng)——每日最新資訊28at.com

  • 使用XMLHttpRequest對象發(fā)送請求
  • 初始化open方法,配置請求方法和url
  • 添加onload和onerror回調(diào)函數(shù)
  • onload判斷狀態(tài)碼是否在200–300范圍內(nèi)resolve,否則reject

onerror直接reject4Vm28資訊網(wǎng)——每日最新資訊28at.com

  • 請求成功后resolve返回response,失敗后reject報(bào)錯(cuò)。
  • 支持options配置請求參數(shù)和請求體
  • 返回一個(gè)Promise對象,可以使用then/catch進(jìn)行外部處理

分析:使用Promise封裝異步ajax請求,實(shí)現(xiàn)同步編程風(fēng)格。4Vm28資訊網(wǎng)——每日最新資訊28at.com

8.JSONP跨域?qū)崿F(xiàn)

問題:實(shí)現(xiàn)一個(gè)JSONP跨域請求:4Vm28資訊網(wǎng)——每日最新資訊28at.com

jsonp('/api/data', {  params: {    name: 'jsonp'  }  })

回答:4Vm28資訊網(wǎng)——每日最新資訊28at.com

function jsonp(url, options) {  return new Promise((resolve, reject) => {    const script = document.createElement('script');    const callbackName = `jsonpCallback_${Date.now()}_${Math.floor(Math.random() * 10000)}`;    const timer = setTimeout(() => {      cleanup();      reject(new Error('JSONP request timeout'));    }, options.timeout || 5000);    function cleanup() {      delete window[callbackName];      clearTimeout(timer);      script.remove();    }    window[callbackName] = function(data) {      cleanup();      resolve(data);    };    options.params = options.params || {};    options.params['callback'] = callbackName;    const paramsArr = Object.keys(options.params).map(key => {      return `${encodeURIComponent(key)}=${encodeURIComponent(options.params[key])}`;    });    script.src = `${url}?${paramsArr.join('&')}`;    script.onerror = () => {      cleanup();      reject(new Error('JSONP request error'));    };    document.body.appendChild(script);  });}

分析:創(chuàng)建腳本節(jié)點(diǎn)script.src,設(shè)置回調(diào)函數(shù)callbackName,解析參數(shù)并拼接URL,動(dòng)態(tài)插入body中實(shí)現(xiàn)JSONP跨域請求,返回Promise接口。4Vm28資訊網(wǎng)——每日最新資訊28at.com

9.實(shí)現(xiàn)深度克隆

問題:實(shí)現(xiàn)一個(gè)函數(shù)deepClone,實(shí)現(xiàn)對象的深度克隆:4Vm28資訊網(wǎng)——每日最新資訊28at.com

答案:4Vm28資訊網(wǎng)——每日最新資訊28at.com

function deepClone(source, clonedMap) {  clonedMap = clonedMap || new Map();  if (source === null || typeof source !== 'object') {    return source;  }  if (clonedMap.has(source)) {    return clonedMap.get(source);  }  var result;  var type = getType(source);  if (type === 'object' || type === 'array') {    result = type === 'array' ? [] : {};    clonedMap.set(source, result);    for (var key in source) {      if (source.hasOwnProperty(key)) {        result[key] = deepClone(source[key], clonedMap);      }    }  } else {    result = source;  }  return result;}function getType(source) {  return Object.prototype.toString    .call(source)    .replace(/^/[object (.+)/]$/, '$1')    .toLowerCase();}const obj = {  a: 1,  b: {    c: 2  }}const clone = deepClone(obj)

分析:遞歸實(shí)現(xiàn)對象和數(shù)組的深度克隆,直接返回基本類型,引用類型遞歸分層調(diào)用深度克隆。4Vm28資訊網(wǎng)——每日最新資訊28at.com

10.函數(shù)柯里化

問題:實(shí)現(xiàn)一個(gè)可以把1+2+3加起來的add函數(shù):4Vm28資訊網(wǎng)——每日最新資訊28at.com

function add() {     // When executing for the first time, define an array specifically to store all parameters     var _args = [].slice.call(arguments);     // Declare a function internally, use the characteristics of closure to save _args and collect all parameter values     var adder = function () {         var _adder = function() {             // [].push.apply(_args, [].slice.call(arguments));             _args.push(...arguments);             return _adder;         };         //Using the characteristics of implicit conversion, implicit conversion is performed when it is finally executed, and the final value is calculated and returned.         _adder.toString = function () {             return _args.reduce(function (a, b) {                 return a + b;             });         }         return _adder;     }     // return adder.apply(null, _args);     return adder(..._args);}var a = add(1)(2)(3)(4); // f 10var b = add(1, 2, 3, 4); // f 10var c = add(1, 2)(3, 4); // f 10var d = add(1, 2, 3)(4); // f 10// You can use the characteristics of implicit conversion to participate in calculationsconsole.log(a + 10); // 20console.log(b + 20); // 30console.log(c + 30); // 40console.log(d + 40); // 50// You can also continue to pass in parameters, and the result will be calculated using implicit conversion again.console.log(a(10) + 100); // 120console.log(b(10) + 100); // 120console.log(c(10) + 100); // 120console.log(d(10) + 100); // 120//In fact, the add method in Shangli is the curried function of the following function, but we do not use the general formula to convert, but encapsulate it ourselves.function add(...args) {     return args.reduce((a, b) => a + b);}

分析:add函數(shù)的柯里化是通過遞歸調(diào)用一個(gè)不斷接受參數(shù)的函數(shù)來實(shí)現(xiàn)的。4Vm28資訊網(wǎng)——每日最新資訊28at.com

11.實(shí)現(xiàn)promise.all方法

問題:實(shí)現(xiàn)一個(gè)myAll方法,類似Promise.all:4Vm28資訊網(wǎng)——每日最新資訊28at.com

myAll([  myPromise1,   myPromise2]).then(([res1, res2]) => {  //...})

回答:4Vm28資訊網(wǎng)——每日最新資訊28at.com

function myAll(promises) {  return new Promise((resolve, reject) => {    const result = new Array(promises.length);    let count = 0;    promises.forEach((p, index) => {      p.then(res => {        result[index] = res;        count++;        if (count === promises.length) {          resolve(result);        }      })      .catch(reject);    });  });}

分析:利用Promise.all原理,通過計(jì)數(shù)器和結(jié)果數(shù)組同步Promise狀態(tài)。4Vm28資訊網(wǎng)——每日最新資訊28at.com

12.實(shí)現(xiàn)Instanceof

問題:實(shí)現(xiàn)一個(gè)instanceof操作符4Vm28資訊網(wǎng)——每日最新資訊28at.com

答案:4Vm28資訊網(wǎng)——每日最新資訊28at.com

function instanceof(left, right) {  if (arguments.length !== 2) {    throw new Error("instanceof requires exactly two arguments.");  }  if (left === null) {    return false;  }  if (typeof left !== "object") {    return false;  }  let proto = Object.getPrototypeOf(left);  while (proto !== null) {    if (right.prototype === proto) {      return true;    }    proto = Object.getPrototypeOf(proto);  }  return false;}

以上代碼用于判斷一個(gè)對象是否是另一個(gè)對象的實(shí)例。4Vm28資訊網(wǎng)——每日最新資訊28at.com

JavaScript 中的 instanceof 運(yùn)算符可用于判斷一個(gè)對象是否是另一個(gè)對象的實(shí)例。但是,instanceof 運(yùn)算符有一些限制,例如:4Vm28資訊網(wǎng)——每日最新資訊28at.com

  1. instanceof 運(yùn)算符只能確定與原型鏈直接相連的對象。
  2. instanceof 運(yùn)算符無法檢測具有循環(huán)原型鏈的對象。
  3. 因此,以上代碼提供了一個(gè)更通用的 instanceof 函數(shù),可以確定任意兩個(gè)對象之間的關(guān)系。
  4. 該函數(shù)的實(shí)現(xiàn)原理是:
  5. instanceof 函數(shù)接收兩個(gè)參數(shù):left 和 right。
  6. 首先,代碼檢查參數(shù)數(shù)量是否為 2,如果不是,則拋出錯(cuò)誤。
  7. 接下來,代碼檢查左操作數(shù) left 是否為 null。如果是,則直接返回 false,因?yàn)?null 不能是任何對象的實(shí)例。
  8. 然后,代碼檢查左操作數(shù) left 的類型是否為對象。如果不是,則直接返回false,因?yàn)橹挥袑ο蟛拍苁菢?gòu)造函數(shù)的實(shí)例。
  9. 接下來,代碼使用Object.getPrototypeOf()獲取左操作數(shù)left的原型,并將其賦值給變量proto。
  10. 在循環(huán)中,代碼繼續(xù)遍歷proto的原型鏈,直到proto為null。
  11. 在循環(huán)中,代碼檢查右操作數(shù)right的原型是否等于當(dāng)前的proto,如果相等,則表示左操作數(shù)left是右操作數(shù)right的實(shí)例,返回true。
  12. 如果在循環(huán)結(jié)束時(shí)沒有找到匹配的原型,即proto為null,則表示左操作數(shù)left不是右操作數(shù)right的實(shí)例,返回false。

該函數(shù)可以在以下場景中使用:4Vm28資訊網(wǎng)——每日最新資訊28at.com

  1. 判斷一個(gè)對象是否是另一個(gè)對象的實(shí)例。
  2. 判斷一個(gè)對象是否從另一個(gè)對象繼承而來。
  3. 判斷一個(gè)對象是否屬于某個(gè)特定的類。

13. 實(shí)現(xiàn) debounce 防抖功能

問題:實(shí)現(xiàn) debounce 防抖功能4Vm28資訊網(wǎng)——每日最新資訊28at.com

答案:4Vm28資訊網(wǎng)——每日最新資訊28at.com

function debounce(fn, delay = 500) {   let timer;   return function(...args) {     clearTimeout(timer);     timer = setTimeout(() => {       fn.apply(this, args);     }, delay);     // Return to clear function     return () => {       clearTimeout(timer);     }   }}// useconst debouncedFn = debounce(fn, 1000);const cancel = debouncedFn();// clearcancel();


4Vm28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-100982-0.html13個(gè) JavaScript 面試難題及代碼實(shí)現(xiàn)

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: Python excel、word報(bào)表生成神器

下一篇: 大廠內(nèi)幕:SpringBoot項(xiàng)目為何棄用Tomcat,轉(zhuǎn)投Undertow懷抱?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時(shí)代戰(zhàn)略發(fā)布會(huì)結(jié)束之后,Redmi總經(jīng)理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時(shí)代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達(dá)到了中國第一,同時(shí)還表示小米電視的巨屏風(fēng)暴即將開始。“公布一個(gè)好消息2023年#小米電視上半年出貨量中國
  • 中興AX5400Pro+上手體驗(yàn):再升級 雙2.5G網(wǎng)口+USB 3.0這次全都有

    2021年11月的時(shí)候,中興先后發(fā)布了兩款路由器產(chǎn)品,中興AX5400和中興AX5400 Pro,從產(chǎn)品命名上就不難看出這是隸屬于同一系列的,但在外觀設(shè)計(jì)上這兩款產(chǎn)品可以說是完全沒一點(diǎn)關(guān)系
  • 7月安卓手機(jī)性能榜:紅魔8S Pro再奪榜首

    7月份的手機(jī)市場風(fēng)平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領(lǐng)先版處理器的新機(jī)之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機(jī)廠商修整的時(shí)間,進(jìn)入8月份之
  • Golang 中的 io 包詳解:組合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是對Reader和Writer接口的組合,
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過購物網(wǎng)站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結(jié)合這個(gè)小小的重要功能可以大大改善您網(wǎng)站的用戶體驗(yàn)
  • 當(dāng)家的盒馬,加速謀生

    來源 | 價(jià)值星球Planet作者 | 歸去來自己&ldquo;當(dāng)家&rdquo;的盒馬,開始加速謀生了。據(jù)盒馬官微消息,盒馬計(jì)劃今年開放生鮮供應(yīng)鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經(jīng)與
  • 阿里大調(diào)整

    來源:產(chǎn)品劉有媒體報(bào)道稱,近期淘寶天貓集團(tuán)啟動(dòng)了近年來最大的人力制度改革,涉及員工績效、層級體系等多個(gè)核心事項(xiàng),目前已形成一個(gè)初步的&ldquo;征求意見版&rdquo;:1、取消P序列
  • 消息稱小米汽車開始篩選交付中心:需至少120個(gè)車位

    IT之家 7 月 7 日消息,日前,有微博簡介為“汽車行業(yè)從業(yè)者、長三角一體化擁護(hù)者”的微博用戶 @長三角行健者 發(fā)文表示,據(jù)經(jīng)銷商集團(tuán)反饋,小米汽車目前
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久精品视频va| 一区二区高清视频| 韩日在线一区| 欧美美女操人视频| 久久亚洲二区| 亚洲一二区在线| 亚洲国产精品va在线观看黑人| 国产精品国产三级国产aⅴ浪潮 | 亚洲国产91精品在线观看| 国产精品久久久久久久午夜片 | 性欧美长视频| 一区二区三区产品免费精品久久75 | 国产日韩在线不卡| 国产精品久久久久aaaa| 欧美日韩国产免费| 蜜桃久久精品乱码一区二区| 久久国产精品第一页| 亚洲无毛电影| 韩国福利一区| 国产精品一级二级三级| 欧美精品日本| 欧美吻胸吃奶大尺度电影| 91久久午夜| 国产一区二区三区的电影| 欧美日韩在线高清| 欧美日韩国产精品| 国产欧美一区二区精品忘忧草| 亚洲成人在线免费| 激情亚洲一区二区三区四区| 国模私拍一区二区三区| 国产一区亚洲| 99在线视频精品| 一本色道久久综合亚洲91| 久久精品免费播放| 欧美揉bbbbb揉bbbbb| 国产精品超碰97尤物18| 国产精品久久一级| 国产视频久久| 国产亚洲一级| 国产欧美精品在线| 国产精品有限公司| 国产一区二区精品丝袜| 日韩五码在线| 亚洲婷婷在线| 亚洲欧美在线免费| 欧美在线日韩精品| 久久中文久久字幕| 欧美成人免费全部观看天天性色| 麻豆精品视频在线观看| 你懂的亚洲视频| 欧美午夜精品久久久久久人妖| 在线观看欧美日本| 亚洲精品美女久久7777777| 亚洲精品资源| 在线天堂一区av电影| 亚洲神马久久| 欧美在线三区| 国产欧美日韩免费| 国产欧美短视频| 国产一区二区精品在线观看| 久久精品国产999大香线蕉| 国产精品欧美风情| 久久电影一区| 久久www成人_看片免费不卡| 亚洲三级色网| 国产综合色产在线精品| 激情五月***国产精品| 久久久久在线观看| 欧美日韩亚洲一区二区三区在线观看| 国产中文一区| 国产精品视频精品视频| 欧美三区免费完整视频在线观看| 在线观看成人av| 国产欧美日韩视频一区二区三区 | 一区二区三区久久| 欧美日韩一区二区高清| 久久在线免费| 欧美经典一区二区三区| 欧美高清在线一区二区| 亚洲欧美日韩中文视频| 猛男gaygay欧美视频| 在线观看久久av| 国产精品视频一二| 国产精品自在欧美一区| 在线观看国产欧美| 国产精品素人视频| 久久综合影视| 午夜精品久久久| 欧美专区在线观看一区| 国产欧美日韩高清| 欧美在线观看网址综合| 国产亚洲一区在线播放| 国产精品久久久久久av福利软件 | 99在线精品免费视频九九视| 欧美亚洲日本国产| 欧美黄在线观看| 亚洲日产国产精品| 性欧美video另类hd性玩具| 欧美大成色www永久网站婷| 国产老肥熟一区二区三区| 午夜精品福利一区二区蜜股av| 国产欧美日韩三级| 久久免费精品视频| 国产精品专区h在线观看| 欧美一区二区三区免费观看视频| 欧美日韩一区二区三区| 亚洲网友自拍| 国产日韩欧美麻豆| 久久综合久久综合久久综合| 亚洲激情电影中文字幕| 久久男女视频| 亚洲激情图片小说视频| 欧美手机在线视频| 久久av一区二区| 亚洲国产精品欧美一二99| 欧美性片在线观看| 一区二区三区四区在线| 国产麻豆日韩| 麻豆精品精华液| a4yy欧美一区二区三区| 国产精品自拍一区| 美女精品自拍一二三四| 一区二区欧美国产| 国产午夜精品理论片a级探花| 亚洲一区二区不卡免费| 欧美日本高清一区| 亚洲免费在线精品一区| 欧美午夜一区二区| 欧美在线观看一二区| 亚洲国产老妈| 国产精品免费网站| 美女图片一区二区| 亚洲欧美成人一区二区在线电影 | 欧美另类69精品久久久久9999| 在线不卡a资源高清| 欧美精品色一区二区三区| 亚洲人成网站在线播| 国产精品久久亚洲7777| 巨乳诱惑日韩免费av| 亚洲小少妇裸体bbw| 禁久久精品乱码| 欧美日韩专区| 久久不射2019中文字幕| 99国产精品| 欧美视频在线视频| 久久九九国产| 亚洲天堂成人在线观看| 国产欧美丝祙| 久久精品国产视频| 亚洲精品免费一二三区| 欧美精品一区二区三区一线天视频 | 91久久精品日日躁夜夜躁国产| 国产精品一二| 欧美日韩国产一区二区三区| 在线亚洲高清视频| 国产精品久久久久9999吃药| 美女网站久久| 欧美中文字幕在线视频| 99热精品在线| 亚洲二区三区四区| 国产日韩欧美综合在线| 欧美日韩三级电影在线| 亚洲欧美日韩精品久久奇米色影视| 国产精品丝袜白浆摸在线| 欧美91视频| 久久精品视频99| 亚洲黄色免费网站| 国产欧美一区二区三区沐欲| 欧美日韩123| 午夜精品美女自拍福到在线| 亚洲三级国产| 国产精品久久久久aaaa樱花| 免费高清在线视频一区·| 欧美在线网址| 亚洲制服av| 影音先锋在线一区| 欧美国产先锋| 亚洲欧美日韩在线一区| 一本色道久久88综合日韩精品| 在线观看视频一区二区欧美日韩| 欧美激情亚洲另类| 亚洲欧美日本国产专区一区| 99热在线精品观看| 亚洲精品网站在线播放gif| 亚洲第一福利在线观看| 狠狠色丁香婷婷综合影院| 欧美久久久久久久久| 免费h精品视频在线播放| 久久天天狠狠| 久久久噜噜噜久久中文字幕色伊伊 | 久久亚洲免费| 欧美一级大片在线观看| 亚洲免费网站| 亚洲综合第一| 亚洲曰本av电影| 亚洲欧美日韩专区| 欧美性一二三区| 国产精品久久久久久五月尺| 欧美激情精品久久久久久| 久久综合给合| 狂野欧美性猛交xxxx巴西| 亚洲精品孕妇| 亚洲人妖在线| 亚洲国产天堂久久国产91|