主頁 > 前端設計 > JS的100道經典面試題(三)只看這四篇就夠了,收藏起來以后偷偷看

JS的100道經典面試題(三)只看這四篇就夠了,收藏起來以后偷偷看

2020-11-20 11:56:39 前端設計

年輕人你不講武德,耗子尾汁~~~
在這里插入圖片描述

總結就是為了形成自己的js知識網,提升自己,加油!

開始干

51、談性能優化問題

  • 代碼層面:避免使用css運算式,避免使用高級選擇器,通配選擇器,
  • 快取利用:快取Ajax,使用CDN,使用外部js和css檔案以便快取,添加Expires頭,服務端配置Etag,減少DNS查找等
  • 請求數量:合并樣式和腳本,使用css圖片精靈,初始首屏之外的圖片資源按需加載,靜態資源延遲加載,
  • 請求帶寬:壓縮檔案,開啟GZIP,代碼層面的優化
  • 用hash-table來優化查找,少用全域變數
  • 用innerHTML代替DOM操作,減少DOM操作次數,優化javascript性能
  • 用setTimeout來避免頁面失去回應
  • 快取DOM節點查找的結果
  • 避免使用CSS Expression
  • 避免全域查詢
  • 避免使用with(with會創建自己的作用域,會增加作用域鏈長度)
  • 多個變數宣告合并
  • 避免圖片和iFrame等的空Src,空Src會重新加載當前頁面,影響速度和效率
  • 盡量避免寫在HTML標簽中寫Style屬性

51、解釋jsonp的原理,以及為什么不是真正的ajax
動態創建script標簽,回呼函式;Ajax是頁面無重繪請求資料操作

52、javascript的本地物件,內置物件和宿主物件

  • 本地物件為array obj regexp等可以new實體化
  • 內置物件為gload Math 等不可以實體化的
  • 宿主為瀏覽器自帶的document,window 等

53、document load 和document ready的區別
Document.onload 是在結構和樣式加載完才執行js
Document.ready原生種沒有這個方法,jquery中有 $().ready(function)

54、==和===的不同
前者會自動轉換型別 值判斷數值 不判斷型別

let  a = 12;
let  b = '12'
console.log(a==b) //true

后者先比較數值后比較資料型別都一樣時才一樣

let  a = 12;
let  b = '12'
console.log(a===b) //false

55、javascript的同源策略
一段腳本只能讀取來自于同一來源的視窗和檔案的屬性,這里的同一來源指的是主機名、協議和埠號的組合

56、Ajax你以前用過么?簡單介紹一下
AJAX = 異步 JavaScript 和 XML, xmlhttprequest
AJAX 是一種用于創建快速動態網頁的技術,通過在后臺與服務器進行少量資料交換,AJAX 可以使網頁實作異步更新,這意味著可以在不重新加載整個網頁的情況下,對網頁的某部分進行更新,傳統的網頁(不使用AJAX)如果需要更新內容,必需多載整個網頁面,有很多使用 AJAX 的應用程式案例:新浪微博、Google 地圖、開心網等等,

57、 Ajax可以做異步請求么?
可以,Ajax請求默認是異步的.如果想同步把async設定為false就可以了默認是true,如果是jquery $.ajax({ url: some.php, async: false, success : function(){ } }); 如果是原生的js xmlHttp.open(“POST”,url,false),

58、一網站如果有大量的人登陸訪問,那么會產生很多的session,如果你是程式員你該怎么辦,
session默認保存在記憶體中,記憶體資源寶貴,session資料量大導致記憶體利用率高,以下方案解決session記憶體存盤問題:
(1)可以設定session超時時間,達到超時時間session自動清空

 <session-config>
<session-timeout>20</session-timeout>
</session-config> 

(2)將session中的資料序列化到硬碟中;
不使用session,使用cookie(此方法存在安全性問題)

59、Ajax如何實作異步定時5秒重繪?

setInterval(function() {
$("#content").load(location.href+" #content>*","");
}, 5000);

60、如何實作瀏覽器內多個標簽頁之間的通信?
呼叫localstorge、cookies等本地存盤方式,
方法一:
localstorge在一個標簽頁里被添加、修改或洗掉時,都會觸發一個storage事件,通過在另一個標簽頁里監聽storage事件,即可得到localstorge存盤的值,實作不同標簽頁之間的通信,

標簽頁11.<input id="name">  
2.<input type="button" id="btn" value="提交">  
3.<script type="text/javascript">  
4.    $(function(){    
5.        $("#btn").click(function(){    
6.            var name=$("#name").val();    
7.            localStorage.setItem("name", name);   
8.        });    
9.    });    
10.</script>  
標簽頁2[html] view plain copy
1.<script type="text/javascript">  
2.    $(function(){   
3.        window.addEventListener("storage", function(event){    
4.            console.log(event.key + "=" + event.newValue);    
5.        });     
6.    });  
7.</script>  

方法二:
使用cookie+setInterval,將要傳遞的資訊存盤在cookie中,每隔一定時間讀取cookie資訊,即可隨時獲取要傳遞的資訊,
標簽頁1:

1.<input id="name">  
2.<input type="button" id="btn" value="提交">  
3.<script type="text/javascript">  
4.    $(function(){    
5.        $("#btn").click(function(){    
6.            var name=$("#name").val();    
7.            document.cookie="name="+name;    
8.        });    
9.    });    
10.</script>  
標簽頁2[html] view plain copy
1.<script type="text/javascript">  
2.    $(function(){   
3.        function getCookie(key) {    
4.            return JSON.parse("{\"" + document.cookie.replace(/;\s+/gim,"\",\"").replace(/=/gim, "\":\"") + "\"}")[key];    
5.        }     
6.        setInterval(function(){    
7.            console.log("name=" + getCookie("name"));    
8.        }, 10000);    
9.    });  
10.</script>  

61、頁面可見性(Page Visibility)API 可以有哪些用途?

頁面可見性: 就是對于用戶來說,頁面是顯示還是隱藏, 所謂顯示的頁面,就是我們正在看的頁面;隱藏的頁面,就是我們沒有看的頁面, 因為,我們一次可以打開好多標簽頁面來回切換著,始終只有一個頁面在我們眼前,其他頁面就是隱藏的,還有一種就是…,(把瀏覽器最小化,所有的頁面就都不可見了),
API 很簡單,document.hidden 就回傳一個布林值,如果是true, 表示頁面可見false 則表示,頁面隱藏, 不同頁面之間來回切換,觸發visibilitychange事件, 還有一個document.visibilityState, 表示頁面所處的狀態,取值:visible, hidden 等四個,

document.addEventListener("visibilitychange", function(){
    if(document.hidden){
        document.title ="hidden";
    }else {
        document.title = "visibile";
    }
})

我們打開這個頁面,然后再打開另一個頁面,來回點擊這兩個頁面,當我們看到這個頁面時,標題顯示visiable ,當我們看另一個頁面時,標題顯示hidden;
影片,視頻,音頻都可以在頁面顯示時打開,在頁面隱藏時關閉,

62、JavaScript原型,原型鏈 ?

  1. js原型?
    js每宣告一個function,都有prototype原型,prototype原型是函式的一個默認屬性,在函式的創建程序中由js編譯器自動添加,
    也就是說:當生產一個function物件的時候,就有一個原型prototype,
    舉個栗子:

是不是還看到了一個_proto_的屬性?!騷年,你的眼睛不錯~待會在解釋prototype和_proto_的基友關系!
prototype的屬性值是一個物件,是屬性的集合,是屬性的集合,是屬性的集合

Js原型鏈是實作繼承的主要方法,其基本思想是:利用原型讓一個參考型別繼承另一個應用型別的屬性和方法,
簡單回顧一下建構式、原型和實體的關系:每個建構式都有一個原型物件,原型物件都包含一個指向建構式的指標,而實體都包含一個指向原型物件的內部指標,

首先,我覺得有必要先解釋一下prototype 和_proto_之間的關系,
每一個基本物件都有自己的_proto_屬性,而每一個函式物件都有自己的prototype原型(函式物件也屬于基本物件,所以也有_proto_),每當去定義一個prototype的時候,就相當于把該實體的__proto__指向一個結構體,那么這個被指向結構體就稱為該實體的原型, 我們還是來看圖吧~比較清晰:

	var foo = {
       x: 10,
       y: 20
};

決議:當你定義一個函式物件的時候,其內部就有這樣一個鏈表關系,宣告foo物件,自帶了_proto_的屬性,而這個屬性指向了prototype,從而實作物件的擴展(例如繼承等操作),

63、Javascript創建物件的幾種方式?
javascript是一種基于prototype的面向物件語言 ,與java有非常大的區別,無法通過類來創建物件,那么,既然是面象物件的,如何來創建物件呢?
一、通過”字面量“方式創建,
方法:將成員資訊寫到{}中,并賦值給一個變數,此時這個變數就是一個物件,
例如:

 var person = (name:'dongjc', work:function() {console.log('write coding')});  

如果{}中為空,則將創建一個空物件:

 var person = {} //創建空物件 

演示代碼:

<script>
        var person = {
            name: "dongjc",
            age: 32,
            Introduce: function () {
                alert("My name is " + this.name + ".I'm " + this.age)
            }
        }; 
        person.Introduce();   
</script>

我們還可以給物件豐富成員資訊,
  物件.成員名稱 = 值;
  物件[成員名稱] = 值;
也可以獲取物件的成員資訊,
  物件.成員名稱;
  物件[成員名稱];

    <script type="text/javascript">
        var person = {
            name: "dongjc",
            age: 32,
            Introduce: function () { alert("My name is " + this.name + ".I'm " + this.age); }
        };
        person.worker = 'coding'; //豐富成員資訊 
    </script>

二、通過”建構式“方式創建,
 方法:

 var obj = new 函式名(); 

這與通過類創建物件有本質的區別,通過該方法創建物件時,會自動執行該函式,這點類似于php通過創建對像時,會自動呼叫建構式,因此該方法稱為通過"建構式“方式創建物件,

    <script type="text/javascript"> function Person() {
            this.name = "dongjc";    //通過this關鍵字設定默認成員      
            var worker = 'coding';    //沒有this關鍵字,物件創建后,該變數為非成員      
            this.age = 32;
            this.Introduce = function () { alert("My name is " + this.name + ".I'm " + this.age); }; alert("My name is " + this.name + ".I'm " + this.age);
        }; var person = new Person();
        person.Introduce(); 
    </script>

此代碼一共會兩次跳出對話框,原因在于創建物件是自動執行了該函式,
注意:this關鍵字的使用,這里的this與php中話法意思類似,指呼叫該函式的物件,這里指的是person,

三、通過object方式創建,
方法:先通過object構造器new一個物件,再往里豐富成員資訊,

 var obj = new Object(); 

實體代碼:

<script type="text/javascript">
        var person = new Object();
        person.name = "dongjc";
        person.age = 32;
        person.Introduce = function () {
            alert("My name is " + this.name + ".I'm " + this.age);
        };
        person.Introduce(); 
    </script>

64、Javascript作用鏈域?
JavaScript中所有的量都是存在于某一個作用域中的
除了全域作用域, 每一個作用域都是存在於某個作用域中的
在試圖訪問一個變數時JS引擎會從當前作用域開始向上查找直到Global全域作用域停止
例如

var A;//全域作用域
function B()
{
    var C;//C位于B函式的作用域
    function D()
    {
        var E;//E位于D函式的作用域
        alert(A)
    }
}

當alert(A)時, JS引擎沿著D的作用域, B的作用域, 全域作用域的順序進行查找.
這三個作用域組成的有序集合就成為作用域鏈
至于為什么叫鏈, 你可以理解和鏈表有相似之處, 深層的作用域會能夠訪問到上層作用域, 就如同鏈表中兩個連續節點能夠單向訪問一樣

65、什么是window物件? 什么是document物件?
簡單來說,document是window的一個物件屬性,
Window 物件表示瀏覽器中打開的視窗,
如果檔案包含框架(frame 或 iframe 標簽),瀏覽器會為 HTML 檔案創建一個 window 物件,并為每個框架創建一個額外的 window 物件,
所有的全域函式和物件都屬于Window 物件的屬性和方法,
document 對 Document 物件的只讀參考,
[window物件]

它是一個頂層物件,而不是另一個物件的屬性,即瀏覽器的視窗,

屬性

defaultStatus 預設的狀態條訊息

document 當前顯示的檔案(該屬性本身也是一個物件)

frame 視窗里的一個框架((FRAME>)(該屬性本身也是一個物件)

frames array 列舉視窗的框架物件的陣列,按照這些物件在檔案中出現的順序列出(該屬性本身也是一個物件)

history 視窗的歷史串列(該屬性本身也是一個物件)

length 視窗內的框架數

location 視窗所顯示檔案的完整(絕對)URL(該屬性本身也是一個物件)不要把它與如document.location混淆,后者是當前顯示檔案的URL,用戶可以改變window.location(用另一個檔案取代當前檔案),但卻不能改變document.location (因為這是當前顯示檔案的位置)

name 視窗打開時,賦予該視窗的名字

opener 代表使用window.open打開當前視窗的腳本所在的視窗(這是Netscape Navigator 3.0beta 3所引入的一個新屬性)

parent 包含當前框架的視窗的同義詞,frame和window物件的一個屬性

self 當前視窗或框架的同義詞

status 狀態條中的訊息

top 包含當前框架的最頂層瀏覽器視窗的同義詞

window 當前視窗或框架的同義詞,與self相同

方法

alert() 打開一個Alert訊息框

clearTimeout() 用來終止setTimeout方法的作業

close() 關閉視窗

confirm() 打開一個Confirm訊息框,用戶可以選擇OK或Cancel,如果用戶單擊OK,該方法回傳true,單擊Cancel回傳false

blur() 把焦點從指定視窗移開(這是Netscape Navigator 3.0 beta 3引入的新方法)

focus() 把指定的視窗帶到前臺(另一個新方法)

open() 打開一個新視窗

prompt() 打開一個Prompt對話框,用戶可向該框鍵入文本,并把鍵入的文本回傳到腳本

setTimeout() 等待一段指定的毫秒數時間,然后運行指令事件處理程式事件處理程式

Onload() 頁面載入時觸發

Onunload() 頁面關閉時觸發

[document 物件]

該物件是window和frames物件的一個屬性,是顯示于視窗或框架內的一個檔案,

屬性

alinkColor 活動鏈接的顏色(ALINK)

anchor 一個HTMI錨點,使用<A NAME=>標記創建(該屬性本身也是一個物件)

anchors array 列出檔案錨點物件的陣列(<A NAME=>)(該屬性本身也是一個物件)

bgColor 檔案的背景顏色(BGCOLOR)

cookie 存盤于cookie.txt檔案內的一段資訊,它是該檔案物件的一個屬性

fgColor 檔案的文本顏色(標記里的TEXT特性)

form 檔案中的一個表單()(該屬性本身也是一個物件)

forms anay 按照其出現在檔案中的順序列出表單物件的一個陣列(該屬性本身也是一個物件)

lastModified 檔案最后的修改日期

linkColor 檔案的鏈接的顏色,即標記中的LINK特性(鏈接到用戶沒有觀察到的檔案)

link 檔案中的一個<A HREF=>標記(該屬性本身也是一個物件)

links array 檔案中link物件的一個陣列,按照它們出現在檔案中的順序排列(該屬性本身也是一個物件)

location 當前顯示檔案的URL,用戶不能改變document.location(因為這是當前顯示檔案的位置),但是,可以改變 window.location (用其它檔案取代當前檔案)window.location本身也是一個物件,而document.location不是物件

referrer 包含鏈接的檔案的URL,用戶單擊該鏈接可到達當前檔案

title 檔案的標題((TITLE>)

vlinkColor 指向用戶已觀察過的檔案的鏈接文本顏色,即標記的VLINK特性

方法

clear 清除指定檔案的內容

close 關閉檔案流

open 打開檔案流

write 把文本寫入檔案

writeln 把文本寫入檔案,并以換行符結尾
區別:
1、window 指表單,document指頁面,document是window的一個子物件,
2、用戶不能改變 document.location(因為這是當前顯示檔案的位置),但是,可以改變window.location (用其它檔案取代當前檔案)window.location本身也是一個物件,而document.location不是物件

66、寫一個通用的事件偵聽器函式

1. markyun.Event = {  
2.      // 頁面加載完成后  
3.      readyEvent : function(fn) {  
4.          if (fn==null) {  
5.              fn=document;  
6.          }  
7.          var oldonload = window.onload;  
8.          if (typeof window.onload != 'function') {  
9.              window.onload = fn;  
10.          } else {  
11.              window.onload = function() {  
12.                  oldonload();  
13.                  fn();  
14.              };  
15.          }  
16.      },  
17.      // 視能力分別使用dom0||dom2||IE方式 來系結事件  
18.      // 引數: 操作的元素,事件名稱 ,事件處理程式  
19.      addEvent : function(element, type, handler) {  
20.          if (element.addEventListener) {  
21.              //事件型別、需要執行的函式、是否捕捉  
22.              element.addEventListener(type, handler, false);  
23.          } else if (element.attachEvent) {  
24.              element.attachEvent('on' + type, function() {  
25.                  handler.call(element);  
26.              });  
27.          } else {  
28.              element['on' + type] = handler;  
29.          }  
30.      },  
31.      // 移除事件  
32.      removeEvent : function(element, type, handler) {  
33.          if (element.removeEnentListener) {  
34.              element.removeEnentListener(type, handler, false);  
35.          } else if (element.datachEvent) {  
36.              element.detachEvent('on' + type, handler);  
37.          } else {  
38.              element['on' + type] = null;  
39.          }  
40.      },   
41.      // 阻止事件 (主要是事件冒泡,因為IE不支持事件捕獲)  
42.      stopPropagation : function(ev) {  
43.          if (ev.stopPropagation) {  
44.              ev.stopPropagation();  
45.          } else {  
46.              ev.cancelBubble = true;  
47.          }  
48.      },  
49.      // 取消事件的默認行為  
50.      preventDefault : function(event) {  
51.          if (event.preventDefault) {  
52.              event.preventDefault();  
53.          } else {  
54.              event.returnValue = false;  
55.          }  
56.      },  
57.      // 獲取事件目標  
58.      getTarget : function(event) {  
59.          return event.target || event.srcElement;  
60.      },  
61.      // 獲取event物件的參考,取到事件的所有資訊,確保隨時能使用event;  
62.      getEvent : function(e) {  
63.          var ev = e || window.event;  
64.          if (!ev) {  
65.              var c = this.getEvent.caller;  
66.              while (c) {  
67.                  ev = c.arguments[0];  
68.                  if (ev && Event == ev.constructor) {  
69.                      break;  
70.                  }  
71.                  c = c.caller;  
72.              }  
73.          }  
74.          return ev;  
75.      }  
76.  };  

67、[“1”, “2”, “3”].map(parseInt) 答案是多少?
[1,NaN,NaN]

68、關于事件,IE與火狐的事件機制有什么區別? 如何阻止冒泡?
我們在網頁中的某個操作(有的操作對應多個事件),例如:當我們點擊一個按鈕就會產生一個事件,是可以被 JavaScript 偵測到的行為,
事件處理機制:IE是事件冒泡、火狐是 事件捕獲;
ie:event.cancelBubble = true 或者 return false
火狐: event.stopPropagation() 或者 return false

69、什么是閉包(closure),為什么要用它?
閉包是指有權訪問另一個函式作用域中變數的函式,創建閉包的最常見的方式就是在一個函式內創建另一個函式,通過另一個函式訪問這個函式的區域變數,利用閉包可以突破作用鏈域,將函式內部的變數和方法傳遞到外部,
閉包的特性:
(1)函式內再嵌套函式
(2)內部函式可以參考外層的引數和變數
(3)引數和變數不會被垃圾回識訓制回收

HTML:

<!-- li節點的onclick事件都能正確的彈出當前被點擊的li索引 -->
<ul id="testUL">
  <li> index = 0</li>
  <li> index = 1</li>
  <li> index = 2</li>
  <li> index = 3</li>
</ul>

JS:

<script type="text/javascript">
  var nodes = document.getElementsByTagName("li");
  for(i = 0;i<nodes.length;i+= 1){
    nodes[i].onclick = (function(i){
      return function() {
        console.log(i);
      } //不用閉包的話,值每次都是4    })(i);
  }
</script>

然后我們看看下面的一段代碼,這是對閉包作用的非常直白的描述:

function say667() {// Local variable that ends up within closure
  var num = 666;
  var sayAlert = function() {
    alert(num);
  }
  num++;
  return sayAlert;
}
var sayAlert = say667();
sayAlert()//執行結果應該彈出的667

執行say667()后,say667()閉包內部變數會存在,而閉包內部函式的內部變數不會存在
使得Javascript的垃圾回識訓制GC不會識訓say667()所占用的資源
因為say667()的內部函式的執行需要依賴say667()中的變數

70、javascript 代碼中的"use strict";是什么意思 ? 使用它區別是什么?
除了正常運行模式,ECMAscript 5添加了第二種運行模式:“嚴格模式”(strict mode),
顧名思義,這種模式使得Javascript在更嚴格的條件下運行,
為什么用嚴格模式

  • 消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為;
  • 消除代碼運行的一些不安全之處,保證代碼運行的安全;
  • 提高編譯器效率,增加運行速度;
  • 為未來新版本的Javascript做好鋪墊,
    "嚴格模式"體現了Javascript更合理、更安全、更嚴謹的發展方向,包括IE 10在內的主流瀏覽器,都已經支持它,許多大專案已經開始全面擁抱它,
    另一方面,同樣的代碼,在"嚴格模式"中,可能會有不一樣的運行結果;一些在"正常模式"下可以運行的陳述句,在"嚴格模式"下將不能運行,掌握這些內容,有助于更細致深入地理解Javascript,讓你變成一個更好的程式員,

進入標志

"use strict";

如何呼叫
(1)針對單個腳本

 <script>
    "use strict";
    console.log("這是嚴格模式,");
  </script>

(2)針對單個函式

function strict(){
    "use strict";
    return "這是嚴格模式,";
  }
  function notStrict() {
    return "這是正常模式,";
  }

語法與行為改變
嚴格模式對Javascript的語法和行為,都做了一些改變,
5.1 全域變數顯式宣告
在正常模式中,如果一個變數沒有宣告就賦值,默認是全域變數,嚴格模式禁止這種用法,全域變數必須顯式宣告,

"use strict";
  v = 1; // 報錯,v未宣告
  for(i = 0; i < 2; i++) { // 報錯,i未宣告
  }

因此,嚴格模式下,變數都必須先用var命令宣告,然后再使用, 禁止this關鍵字指向全域物件

function f(){
    return !this;
  } 
  // 回傳false,因為"this"指向全域物件,"!this"就是false
  function f(){ 
    "use strict";
    return !this;
  } 
  // 回傳true,因為嚴格模式下,this的值為undefined,所以"!this"為true,
//因此,使用建構式時,如果忘了加new,this不再指向全域物件,而是報錯,
function f(){
    "use strict";
    this.a = 1;
  };
  f();// 報錯,this未定義
 

禁止洗掉變數
嚴格模式下無法洗掉變數,只有configurable設定為true的物件屬性,才能被洗掉,

"use strict";
  var x;
  delete x; // 語法錯誤
  var o = Object.create(null, {'x': {
      value: 1,
      configurable: true
  }});
  delete o.x; // 洗掉成功

物件不能有重名的屬性
正常模式下,如果物件有多個重名屬性,最后賦值的那個屬性會覆寫前面的值,嚴格模式下,這屬于語法錯誤,

"use strict";
  var o = {
    p: 1,
    p: 2
  }; // 語法錯誤

函式不能有重名的引數
正常模式下,如果函式有多個重名的引數,可以用arguments[i]讀取,嚴格模式下,這屬于語法錯誤,

 "use strict";
  function f(a, a, b) { // 語法錯誤
    return ;
}

71、如何判斷一個物件是否屬于某個類?
javascript中檢測物件的型別的運算子有:typeof、constructor、instanceof
typeof:typeof是一個一元運算子,回傳結果是一個說明運算元型別的字串,如:“number”,“string”,“boolean”,“object”,“function”,“undefined”(可用于判斷變數是否存在), 但 typeof 的能力有限,其對于Date、RegExp、Array型別回傳的都是"object",所以它只在區別物件和原始型別的時候才有用,要區一種物件型別和另一種物件型別,必須使用其他的方法,

instanceof 運算子:instanceof 運算子要求其左邊的運算元是一個物件,右邊的運算元是物件類的名字或建構式,如果 object 是 class 或建構式的實體,則 instanceof 運算子回傳 true,如果 object 不是指定類或函式的實體,或者 object 為 null,則回傳 false,instanceof方法可以判斷變數是否是陣列型別,但是只限同一全域環境之內,在一個頁面有多個iframe的情況下,instanceof失效,

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);

console.log(auto instanceof Car);
// expected output: true

console.log(auto instanceof Object);
// expected output: true

constructor 屬性: JavaScript中,每個物件都有一個constructor屬性,它參考了初始化該物件的建構式,常用于判斷未知物件的型別,如給定一個求知的值 通過typeof運算子來判斷它是原始的值還是物件,如果是物件,就可以使用constructor屬性來判斷其型別,

<script type="text/javascript">

var test=new Array();

if (test.constructor==Array)
{
document.write("This is an Array");
}
if (test.constructor==Boolean)
{
document.write("This is a Boolean");
}
if (test.constructor==Date)
{
document.write("This is a Date");
}
if (test.constructor==String)
{
document.write("This is a String");
}

/輸出
This is an Array
</script>

Object.prototype.toString.call():該方法是目前為止發現的判斷一個物件型別的最好的辦法,

72、Javascript中,有一個函式,執行時物件查找時,永遠不會去查找原型,這個函式是?
hasOwnProperty

74、js延遲加載的方式有哪些?
js的延遲加載有助與提高頁面的加載速度,以下是延遲加載的幾種方法:
(1)使用setTimeout延遲方法的加載時間
延遲加載js代碼,給網頁加載留出更多時間

<script type="text/javascript" >
    function A(){
        $.post("/lord/login",{name:username,pwd:password},function(){
            alert("Hello");
        });
    }
    $(function (){
        setTimeout('A()', 1000); //延遲1秒
    })</script>

(2)讓js最后加載
例如引入外部js腳本檔案時,如果放入html的head中,則頁面加載前該js腳本就會被加載入頁面,而放入body中,則會按照頁面從上倒下的加載順序來運行javascript的代碼~~~ 所以我們可以把js外部引入的檔案放到頁面底部,來讓js最后引入,從而加快頁面加載速度

(3)上述方法2也會偶爾讓你收到Google頁面速度測驗工具的“延遲加載javascript”警告,所以這里的解決方案將是來自Google幫助頁面的推薦方案,
//這些代碼應被放置在</body>標簽前(接近HTML檔案底部)

<script type="text/javascript">
    function downloadJSAtOnload() {
        var element = document.createElement("script");
        element.src = "defer.js";
        document.body.appendChild(element);
    }
    if (window.addEventListener)
        window.addEventListener("load", downloadJSAtOnload, false);
    else if (window.attachEvent)
        window.attachEvent("onload", downloadJSAtOnload);
    else window.onload = downloadJSAtOnload;
    </script>

這段代碼意思是等到整個檔案加載完后,再加載外部檔案“defer.js”,
使用此段代碼的步驟:
1).復制上面代碼
2).粘貼代碼到HTML的標簽前 (靠近HTML檔案底部)
3).修改“defer.js”為你的外部JS檔案名
4).確保你檔案路徑是正確的,例如:如果你僅輸入“defer.js”,那么“defer.js”檔案一定與HTML檔案在同一檔案夾下,
注意:這段代碼直到檔案加載完才會加載指定的外部js檔案,因此,不應該把那些頁面正常加載需要依賴的javascript代碼放在這里,而應該將JavaScript代碼分成兩組,一組是因頁面需要而立即加載的javascript代碼,另外一組是在頁面加載后進行操作的javascript代碼(例如添加click事件或其他東西),這些需等到頁面加載后再執行的JavaScript代碼,應放在一個外部檔案,然后再引進來,

75、同步和異步的區別?
同步
同步的思想是:所有的操作都做完,才回傳給用戶,這樣用戶在線等待的時間太長,給用戶一種卡死了的感覺(就是系統遷移中,點擊了遷移,界面就不動了,但是程式還在執行,卡死了的感覺),這種情況下,用戶不能關閉界面,如果關閉了,即遷移程式就中斷了,

異步
將用戶請求放入訊息佇列,并反饋給用戶,系統遷移程式已經啟動,你可以關閉瀏覽器了,然后程式再慢慢地去寫入資料庫去,這就是異步,但是用戶沒有卡死的感覺,會告訴你,你的請求系統已經回應了,你可以關閉界面了,

同步,是所有的操作都做完,才回傳給用戶結果,即寫完資料庫之后,在相應用戶,用戶體驗不好,
異步,不用等所有操作等做完,就相應用戶請求,即先相應用戶請求,然后慢慢去寫資料庫,用戶體驗較好,

異步操作例子:
為了避免短時間大量的資料庫操作,就使用快取機制,也就是訊息佇列,先將資料放入訊息佇列,然后再慢慢寫入資料庫,

引入訊息佇列機制,雖然可以保證用戶請求的快速回應,但是并沒有使得我資料遷移的時間變短(即80萬條資料寫入mysql需要1個小時,用了redis之后,還是需要1個小時,只是保證用戶的請求的快速回應,用戶輸入完http url請求之后,就可以把瀏覽器關閉了,干別的去了,如果不用redis,瀏覽器不能關閉),

同步就沒有任何價值了嗎?
銀行的轉賬功能, 哈哈哈哈哈 不轉完你放得下心嗎?

后續還在陸續更新~~~

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/225363.html

標籤:其他

上一篇:Javascripe問題

下一篇:如何用java代碼生成Word檔案和簽字以及匯出pdf檔案

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more