整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          18個基本的JavaScript面試問題及答案(都是

          18個基本的JavaScript面試問題及答案(都是實用技巧)附源碼

          介:1.使用 typeof bar==="object" 來確定 bar 是否是對象的潛在陷阱是什么?如何避免這個陷阱?盡管 typeof bar==="object" 是檢查 bar 是否對象的可靠方法,令人驚訝的是在JavaScript中 null 也被認為是對 ...


          思想觀念的筆記本電腦


          1.使用 typeof bar==="object" 來確定 bar 是否是對象的潛在陷阱是什么?如何避免這個陷阱?盡管 typeof bar==="object" 是檢查 bar 是否對象的可靠方法,令人驚訝的是在JavaScript中 null 也被認為是對象!因此,令大多數開發人員驚訝的是,下面的代碼將輸出 true (而不是false) 到控制臺:

          var bar=null;
          console.log(typeof bar==="object"); // logs true!

          只要清楚這一點,同時檢查 bar 是否為 null,就可以很容易地避免問題:

          console.log((bar !==null) && (typeof bar==="object")); // logs false

          要答全問題,還有其他兩件事情值得注意:首先,上述解決方案將返回 false,當 bar 是一個函數的時候。在大多數情況下,這是期望行為,但當你也想對函數返回 true 的話,你可以修改上面的解決方案為:

          console.log((bar !==null) && ((typeof bar==="object") || (typeof bar==="function")));

          第二,上述解決方案將返回 true,當 bar 是一個數組(例如,當 var bar=[];)的時候。在大多數情況下,這是期望行為,因為數組是真正的對象,但當你也想對數組返回 false 時,你可以修改上面的解決方案為:

          console.log((bar !==null) && (typeof bar==="object") && (toString.call(bar) !=="[object Array]"));

          或者,如果你使用jQuery的話:

          console.log((bar !==null) && (typeof bar==="object") && (! $.isArray(bar)));

          2.下面的代碼將輸出什么到控制臺,為什么?

          (function(){
           var a=b=3;
          })();
          console.log("a defined? " + (typeof a !=='undefined'));
          console.log("b defined? " + (typeof b !=='undefined'));

          由于 a 和 b 都定義在函數的封閉范圍內,并且都始于 var關鍵字,大多數JavaScript開發人員期望 typeof a 和 typeof b 在上面的例子中都是undefined。然而,事實并非如此。這里的問題是,大多數開發人員將語句 var a=b=3; 錯誤地理解為是以下聲明的簡寫:

          var b=3;
          var a=b;

          但事實上,var a=b=3; 實際是以下聲明的簡寫:

          b=3;
          var a=b;

          因此(如果你不使用嚴格模式的話),該代碼段的輸出是:

          a defined? false
          b defined? true

          但是, b 如何才能被定義在封閉函數的范圍之外呢?是的,既然語句 var a=b=3; 是語句 b=3; 和 var a=b;的簡寫, b 最終成為了一個全局變量(因為它沒有前綴 var 關鍵字),因此仍然在范圍內甚至封閉函數之外。需要注意的是,在嚴格模式下(即使用 use strict),語句var a=b=3; 將生成ReferenceError: b is not defined的運行時錯誤,從而避免任何否則可能會導致的headfakes /bug。 (還是你為什么應該理所當然地在代碼中使用 use strict 的最好例子!)3.下面的代碼將輸出什么到控制臺,為什么?

          var myObject={
           foo: "bar",
           func: function() {
           var self=this;
           console.log("outer func: this.foo=" + this.foo);
           console.log("outer func: self.foo=" + self.foo);
           (function() {
           console.log("inner func: this.foo=" + this.foo);
           console.log("inner func: self.foo=" + self.foo);
           }());
           }
          };
          myObject.func();

          上面的代碼將輸出以下內容到控制臺:

          outer func: this.foo=bar
          outer func: self.foo=bar
          inner func: this.foo=undefined
          inner func: self.foo=bar

          在外部函數中, this 和self 兩者都指向了 myObject,因此兩者都可以正確地引用和訪問 foo。在內部函數中, this 不再指向 myObject。其結果是,this.foo 沒有在內部函數中被定義,相反,指向到本地的變量self 保持在范圍內,并且可以訪問。 (在ECMA 5之前,在內部函數中的this 將指向全局的 window 對象;反之,因為作為ECMA 5,內部函數中的功能this 是未定義的。)4.封裝JavaScript源文件的全部內容到一個函數塊有什么意義及理由?這是一個越來越普遍的做法,被許多流行的JavaScript庫(jQuery,Node.js等)采用。這種技術創建了一個圍繞文件全部內容的閉包,也許是最重要的是,創建了一個私有的命名空間,從而有助于避免不同JavaScript模塊和庫之間潛在的名稱沖突。這種技術的另一個特點是,允許一個易于引用的(假設更短的)別名用于全局變量。這通常用于,例如,jQuery插件中。jQuery允許你使用jQuery.noConflict(),來禁用 $ 引用到jQuery命名空間。在完成這項工作之后,你的代碼仍然可以使用$ 利用這種閉包技術,如下所示:

          (function($) { /* jQuery plugin code referencing $ */ } )(jQuery);

          5.在JavaScript源文件的開頭包含 use strict 有什么意義和好處?對于這個問題,既簡要又最重要的答案是,use strict 是一種在JavaScript代碼運行時自動實行更嚴格解析和錯誤處理的方法。那些被忽略或默默失敗了的代碼錯誤,會產生錯誤或拋出異常。通常而言,這是一個很好的做法。嚴格模式的一些主要優點包括:

          • 使調試更加容易。那些被忽略或默默失敗了的代碼錯誤,會產生錯誤或拋出異常,因此盡早提醒你代碼中的問題,你才能更快地指引到它們的源代碼。
          • 防止意外的全局變量。如果沒有嚴格模式,將值分配給一個未聲明的變量會自動創建該名稱的全局變量。這是JavaScript中最常見的錯誤之一。在嚴格模式下,這樣做的話會拋出錯誤。
          • 消除 this 強制。如果沒有嚴格模式,引用null或未定義的值到 this 值會自動強制到全局變量。這可能會導致許多令人頭痛的問題和讓人恨不得拔自己頭發的bug。在嚴格模式下,引用 null或未定義的 this 值會拋出錯誤。
          • 不允許重復的屬性名稱或參數值。當檢測到對象(例如,var object={foo: "bar", foo: "baz"};)中重復命名的屬性,或檢測到函數中(例如,function foo(val1, val2, val1){})重復命名的參數時,嚴格模式會拋出錯誤,因此捕捉幾乎可以肯定是代碼中的bug可以避免浪費大量的跟蹤時間。
          • 使eval() 更安全。在嚴格模式和非嚴格模式下,eval() 的行為方式有所不同。最顯而易見的是,在嚴格模式下,變量和聲明在 eval() 語句內部的函數不會在包含范圍內創建(它們會在非嚴格模式下的包含范圍中被創建,這也是一個常見的問題源)。
          • 在 delete使用無效時拋出錯誤。delete操作符(用于從對象中刪除屬性)不能用在對象不可配置的屬性上。當試圖刪除一個不可配置的屬性時,非嚴格代碼將默默地失敗,而嚴格模式將在這樣的情況下拋出異常。

          6.考慮以下兩個函數。它們會返回相同的東西嗎? 為什么相同或為什么不相同?

          function foo1()
          {
           return {
           bar: "hello"
           };
          }
          function foo2()
          {
           return
           {
           bar: "hello"
           };
          }

          出人意料的是,這兩個函數返回的內容并不相同。更確切地說是:

          console.log("foo1 returns:");
          console.log(foo1());
          console.log("foo2 returns:");
          console.log(foo2());

          將產生:

          foo1 returns:
          Object {bar: "hello"}
          foo2 returns:
          undefined

          這不僅是令人驚訝,而且特別讓人困惑的是, foo2()返回undefined卻沒有任何錯誤拋出。原因與這樣一個事實有關,即分號在JavaScript中是一個可選項(盡管省略它們通常是非常糟糕的形式)。其結果就是,當碰到 foo2()中包含 return語句的代碼行(代碼行上沒有其他任何代碼),分號會立即自動插入到返回語句之后。也不會拋出錯誤,因為代碼的其余部分是完全有效的,即使它沒有得到調用或做任何事情(相當于它就是是一個未使用的代碼塊,定義了等同于字符串 "hello"的屬性 bar)。這種行為也支持放置左括號于JavaScript代碼行的末尾,而不是新代碼行開頭的約定。正如這里所示,這不僅僅只是JavaScript中的一個風格偏好。7. NaN 是什么?它的類型是什么?你如何可靠地測試一個值是否等于 NaN ?NaN 屬性代表一個“不是數字”的值。這個特殊的值是因為運算不能執行而導致的,不能執行的原因要么是因為其中的運算對象之一非數字(例如, "abc" / 4),要么是因為運算的結果非數字(例如,除數為零)。雖然這看上去很簡單,但 NaN 有一些令人驚訝的特點,如果你不知道它們的話,可能會導致令人頭痛的bug。首先,雖然 NaN 意味著“不是數字”,但是它的類型,不管你信不信,是 Number:

          console.log(typeof NaN==="number"); // logs "true"

          此外, NaN 和任何東西比較——甚至是它自己本身!——結果是false:

          console.log(NaN===NaN); // logs "false"

          一種半可靠的方法來測試一個數字是否等于 NaN,是使用內置函數 isNaN(),但即使使用 isNaN() 依然并非是一個完美的解決方案。一個更好的解決辦法是使用 value !==value,如果值等于NaN,只會產生true。另外,ES6提供了一個新的 Number.isNaN() 函數,這是一個不同的函數,并且比老的全局 isNaN() 函數更可靠。8.下列代碼將輸出什么?并解釋原因。

          console.log(0.1 + 0.2);
          console.log(0.1 + 0.2==0.3);

          一個稍微有點編程基礎的回答是:“你不能確定。可能會輸出“0.3”和“true”,也可能不會。JavaScript中的數字和浮點精度的處理相同,因此,可能不會總是產生預期的結果。“以上所提供的例子就是一個演示了這個問題的典型例子。但出人意料的是,它會輸出:

          0.30000000000000004
          false

          9.討論寫函數 isInteger(x) 的可能方法,用于確定x是否是整數。這可能聽起來是小菜一碟,但事實上,這很瑣碎,因為ECMAScript 6引入了一個新的正以此為目的 Number.isInteger() 函數。然而,之前的ECMAScript 6,會更復雜一點,因為沒有提供類似的 Number.isInteger() 方法。問題是,在ECMAScript規格說明中,整數只概念上存在:即,數字值總是存儲為浮點值。考慮到這一點,最簡單又最干凈的ECMAScript6之前的解決方法(同時也非常穩健地返回 false ,即使一個非數字的值,如字符串或 null ,被傳遞給函數)如下:

          function isInteger(x) { return (x^0)===x; }

          下面的解決方法也是可行的,雖然不如上面那個方法優雅:

          function isInteger(x) { return Math.round(x)===x; }

          請注意 Math.ceil() 和 Math.floor() 在上面的實現中等同于 Math.round()。或:

          function isInteger(x) { return (typeof x==='number') && (x % 1===0);

          相當普遍的一個不正確的解決方案是:

          function isInteger(x) { return parseInt(x, 10)===x; }

          雖然這個以 parseInt函數為基礎的方法在 x 取許多值時都能工作良好,但一旦 x 取值相當大的時候,就會無法正常工作。問題在于 parseInt() 在解析數字之前強制其第一個參數到字符串。因此,一旦數目變得足夠大,它的字符串就會表達為指數形式(例如, 1e+21)。因此,parseInt() 函數就會去解析 1e+21,但當到達 e字符串的時候,就會停止解析,因此只會返回值 1。注意:

          > String(1000000000000000000000)
          '1e+21'
          > parseInt(1000000000000000000000, 10)
          1
          > parseInt(1000000000000000000000, 10)===1000000000000000000000
          false

          10.下列代碼行1-4如何排序,使之能夠在執行代碼時輸出到控制臺? 為什么?

          (function() {
           console.log(1); 
           setTimeout(function(){console.log(2)}, 1000); 
           setTimeout(function(){console.log(3)}, 0); 
           console.log(4);
          })();

          序號如下:

          1
          4
          3
          2

          讓我們先來解釋比較明顯而易見的那部分:

          • 1 和 4之所以放在前面,是因為它們是通過簡單調用 console.log() 而沒有任何延遲輸出的
          • 2 之所以放在 3的后面,是因為 2 是延遲了1000毫秒(即,1秒)之后輸出的,而 3 是延遲了0毫秒之后輸出的。

          好的。但是,既然 3 是0毫秒延遲之后輸出的,那么是否意味著它是立即輸出的呢?如果是的話,那么它是不是應該在 4 之前輸出,既然 4 是在第二行輸出的?要回答這個問題,你需要正確理解JavaScript的事件和時間設置。瀏覽器有一個事件循環,會檢查事件隊列和處理未完成的事件。例如,如果時間發生在后臺(例如,腳本的 onload 事件)時,瀏覽器正忙(例如,處理一個 onclick),那么事件會添加到隊列中。當onclick處理程序完成后,檢查隊列,然后處理該事件(例如,執行 onload 腳本)。同樣的, setTimeout() 也會把其引用的函數的執行放到事件隊列中,如果瀏覽器正忙的話。當setTimeout()的第二個參數為0的時候,它的意思是“盡快”執行指定的函數。具體而言,函數的執行會放置在事件隊列的下一個計時器開始。但是請注意,這不是立即執行:函數不會被執行除非下一個計時器開始。這就是為什么在上述的例子中,調用 console.log(4) 發生在調用 console.log(3) 之前(因為調用 console.log(3) 是通過setTimeout被調用的,因此會稍微延遲)。11.寫一個簡單的函數(少于80個字符),要求返回一個布爾值指明字符串是否為回文結構。下面這個函數在 str 是回文結構的時候返回true,否則,返回false。

          function isPalindrome(str) {
           str=str.replace(/\W/g, '').toLowerCase();
           return (str==str.split('').reverse().join(''));
          }

          例如:

          console.log(isPalindrome("level")); // logs 'true'
          console.log(isPalindrome("levels")); // logs 'false'
          console.log(isPalindrome("A car, a man, a maraca")); // logs 'true'

          12.寫一個 sum方法,在使用下面任一語法調用時,都可以正常工作。

          console.log(sum(2,3)); // Outputs 5
          console.log(sum(2)(3)); // Outputs 5

          (至少)有兩種方法可以做到:方法1

          function sum(x) {
           if (arguments.length==2) {
           return arguments[0] + arguments[1];
           } else {
           return function(y) { return x + y; };
           }
          }

          在JavaScript中,函數可以提供到 arguments 對象的訪問,arguments 對象提供傳遞到函數的實際參數的訪問。這使我們能夠使用 length 屬性來確定在運行時傳遞給函數的參數數量。如果傳遞兩個參數,那么只需加在一起,并返回。否則,我們假設它被以 sum(2)(3)這樣的形式調用,所以我們返回一個匿名函數,這個匿名函數合并了傳遞到 sum()的參數和傳遞給匿名函數的參數。方法2

          function sum(x, y) {
           if (y !==undefined) {
           return x + y;
           } else {
           return function(y) { return x + y; };
           }
          }

          當調用一個函數的時候,JavaScript不要求參數的數目匹配函數定義中的參數數量。如果傳遞的參數數量大于函數定義中參數數量,那么多余參數將簡單地被忽略。另一方面,如果傳遞的參數數量小于函數定義中的參數數量,那么缺少的參數在函數中被引用時將會給一個 undefined值。所以,在上面的例子中,簡單地檢查第2個參數是否未定義,就可以相應地確定函數被調用以及進行的方式。13.請看下面的代碼片段:

          for (var i=0; i < 5; i++) {
           var btn=document.createElement('button');
           btn.appendChild(document.createTextNode('Button ' + i));
           btn.addEventListener('click', function(){ console.log(i); });
           document.body.appendChild(btn);
          }

          (a)當用戶點擊“Button 4”的時候會輸出什么到控制臺,為什么?(b)提供一個或多個備用的可按預期工作的實現方案。(a)無論用戶點擊什么按鈕,數字5將總會輸出到控制臺。這是因為,當 onclick 方法被調用(對于任何按鈕)的時候, for 循環已經結束,變量 i 已經獲得了5的值。(面試者如果能夠談一談有關如何執行上下文,可變對象,激活對象和內部“范圍”屬性貢有助于閉包行為,則可以加分)。(b)要讓代碼工作的關鍵是,通過傳遞到一個新創建的函數對象,在每次傳遞通過 for 循環時,捕捉到 i 值。下面是三種可能實現的方法:

          for (var i=0; i < 5; i++) {
           var btn=document.createElement('button');
           btn.appendChild(document.createTextNode('Button ' + i));
           btn.addEventListener('click', (function(i) {
           return function() { console.log(i); };
           })(i));
           document.body.appendChild(btn);
          }

          或者,你可以封裝全部調用到在新匿名函數中的 btn.addEventListener :

          for (var i=0; i < 5; i++) {
           var btn=document.createElement('button');
           btn.appendChild(document.createTextNode('Button ' + i));
           (function (i) {
           btn.addEventListener('click', function() { console.log(i); });
           })(i);
           document.body.appendChild(btn);
          }

          也可以調用數組對象的本地 forEach 方法來替代 for 循環:

          ['a', 'b', 'c', 'd', 'e'].forEach(function (value, i) {
           var btn=document.createElement('button');
           btn.appendChild(document.createTextNode('Button ' + i));
           btn.addEventListener('click', function() { console.log(i); });
           document.body.appendChild(btn);
          });

          14.下面的代碼將輸出什么到控制臺,為什么?

          var arr1="john".split('');
          var arr2=arr1.reverse();
          var arr3="jones".split('');
          arr2.push(arr3);
          console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));
          console.log("array 2: length=" + arr2.length + " last=" + arr2.slice(-1));

          輸出結果是:

          "array 1: length=5 last=j,o,n,e,s"
          "array 2: length=5 last=j,o,n,e,s"

          arr1 和 arr2 在上述代碼執行之后,兩者相同了,原因是:

          • 調用數組對象的 reverse() 方法并不只返回反順序的陣列,它也反轉了數組本身的順序(即,在這種情況下,指的是 arr1)。
          • reverse() 方法返回一個到數組本身的引用(在這種情況下即,arr1)。其結果為,arr2 僅僅是一個到 arr1的引用(而不是副本)。因此,當對 arr2做了任何事情(即當我們調用 arr2.push(arr3);)時,arr1 也會受到影響,因為 arr1 和 arr2 引用的是同一個對象。

          這里有幾個側面點有時候會讓你在回答這個問題時,陰溝里翻船:傳遞數組到另一個數組的 push() 方法會讓整個數組作為單個元素映射到數組的末端。其結果是,語句 arr2.push(arr3); 在其整體中添加 arr3 作為一個單一的元素到 arr2 的末端(也就是說,它并沒有連接兩個數組,連接數組是 concat() 方法的目的)。和Python一樣,JavaScript標榜數組方法調用中的負數下標,例如 slice() 可作為引用數組末尾元素的方法:例如,-1下標表示數組中的最后一個元素,等等。15.下面的代碼將輸出什么到控制臺,為什么?

          console.log(1 + "2" + "2");
          console.log(1 + +"2" + "2");
          console.log(1 + -"1" + "2");
          console.log(+"1" + "1" + "2");
          console.log( "A" - "B" + "2");
          console.log( "A" - "B" + 2);

          上面的代碼將輸出以下內容到控制臺:

          "122"
          "32"
          "02"
          "112"
          "NaN2"
          NaN

          原因是…這里的根本問題是,JavaScript(ECMAScript)是一種弱類型語言,它可對值進行自動類型轉換,以適應正在執行的操作。讓我們通過上面的例子來說明這是如何做到的。例1:1 + "2" + "2" 輸出:"122" 說明: 1 + "2" 是執行的第一個操作。由于其中一個運算對象("2")是字符串,JavaScript會假設它需要執行字符串連接,因此,會將 1 的類型轉換為 "1", 1 + "2"結果就是 "12"。然后, "12" + "2" 就是 "122"。例2: 1 + +"2" + "2" 輸出: "32" 說明:根據運算的順序,要執行的第一個運算是 +"2"(第一個 "2" 前面的額外 + 被視為一元運算符)。因此,JavaScript將 "2" 的類型轉換為數字,然后應用一元 + 號(即,將其視為一個正數)。其結果是,接下來的運算就是 1 + 2 ,這當然是 3。然后我們需要在一個數字和一個字符串之間進行運算(即, 3 和 "2"),同樣的,JavaScript會將數值類型轉換為字符串,并執行字符串的連接,產生 "32"。例3: 1 + -"1" + "2" 輸出: "02" 說明:這里的解釋和前一個例子相同,除了此處的一元運算符是 - 而不是 +。先是 "1" 變為 1,然后當應用 - 時又變為了 -1 ,然后將其與 1相加,結果為 0,再將其轉換為字符串,連接最后的 "2" 運算對象,得到 "02"。例4: +"1" + "1" + "2" 輸出: "112" 說明:雖然第一個運算對象 "1"因為前綴的一元 + 運算符類型轉換為數值,但又立即轉換回字符串,當連接到第二個運算對象 "1" 的時候,然后又和最后的運算對象"2" 連接,產生了字符串 "112"。例5: "A" - "B" + "2" 輸出: "NaN2" 說明:由于運算符 - 不能被應用于字符串,并且 "A" 和 "B" 都不能轉換成數值,因此,"A" - "B"的結果是 NaN,然后再和字符串 "2" 連接,得到 "NaN2" 。例6: "A" - "B" + 2 輸出: NaN 說明:參見前一個例子, "A" - "B" 結果為 NaN。但是,應用任何運算符到NaN與其他任何的數字運算對象,結果仍然是 NaN。16.下面的遞歸代碼在數組列表偏大的情況下會導致堆棧溢出。在保留遞歸模式的基礎上,你怎么解決這個問題?

          var list=readHugeList();
          var nextListItem=function() {
           var item=list.pop();
           if (item) {
           // process the list item...
           nextListItem();
           }
          };

          潛在的堆棧溢出可以通過修改nextListItem 函數避免:

          var list=readHugeList();
          var nextListItem=function() {
           var item=list.pop();
           if (item) {
           // process the list item...
           setTimeout( nextListItem, 0);
           }
          };

          堆棧溢出之所以會被消除,是因為事件循環操縱了遞歸,而不是調用堆棧。當 nextListItem 運行時,如果 item不為空,timeout函數(nextListItem)就會被推到事件隊列,該函數退出,因此就清空調用堆棧。當事件隊列運行其timeout事件,且進行到下一個 item 時,定時器被設置為再次調用 nextListItem。因此,該方法從頭到尾都沒有直接的遞歸調用,所以無論迭代次數的多少,調用堆棧保持清空的狀態。17.JavaScript中的“閉包”是什么?請舉一個例子。閉包是一個可以訪問外部(封閉)函數作用域鏈中的變量的內部函數。閉包可以訪問三種范圍中的變量:這三個范圍具體為:(1)自己范圍內的變量,(2)封閉函數范圍內的變量,以及(3)全局變量。下面是一個簡單的例子:

          var globalVar="xyz";
          (function outerFunc(outerArg) {
           var outerVar='a';
           (function innerFunc(innerArg) {
           var innerVar='b';
           console.log(
           "outerArg=" + outerArg + "\n" +
           "innerArg=" + innerArg + "\n" +
           "outerVar=" + outerVar + "\n" +
           "innerVar=" + innerVar + "\n" +
           "globalVar=" + globalVar);
           })(456);
          })(123);

          在上面的例子中,來自于 innerFunc, outerFunc和全局命名空間的變量都在 innerFunc的范圍內。因此,上面的代碼將輸出如下:

          outerArg=123
          innerArg=456
          outerVar=a
          innerVar=b
          globalVar=xyz

          18.下面的代碼將輸出什么:

          for (var i=0; i < 5; i++) {
           setTimeout(function() { console.log(i); }, i * 1000 );
          }

          解釋你的答案。閉包在這里能起什么作用?上面的代碼不會按預期顯示值0,1,2,3,和4,而是會顯示5,5,5,5,和5。原因是,在循環中執行的每個函數將整個循環完成之后被執行,因此,將會引用存儲在 i中的最后一個值,那就是5。閉包可以通過為每次迭代創建一個唯一的范圍,存儲范圍內變量的每個唯一的值,來防止這個問題,如下:

          for (var i=0; i < 5; i++) {
          	(function(x) {
           	setTimeout(function() { console.log(x); }, x * 1000 );
           })(i);
          }

          這就會按預期輸出0,1,2,3,和4到控制臺。19.以下代碼行將輸出什么到控制臺?

          console.log("0 || 1="+(0 || 1));
          console.log("1 || 2="+(1 || 2));
          console.log("0 && 1="+(0 && 1));
          console.log("1 && 2="+(1 && 2));

          并解釋。該代碼將輸出:

          0 || 1=1
          1 || 2=1
          0 && 1=0
          1 && 2=2

          在JavaScript中, || 和 &&都是邏輯運算符,用于在從左至右計算時,返回第一個可完全確定的“邏輯值”。或( || )運算符。在形如 X||Y的表達式中,首先計算X 并將其解釋執行為一個布爾值。如果這個布爾值true,那么返回true(1),不再計算 Y,因為“或”的條件已經滿足。如果這個布爾值為false,那么我們仍然不能知道 X||Y是真是假,直到我們計算 Y,并且也把它解釋執行為一個布爾值。因此, 0 || 1 的計算結果為true(1),同理計算1 || 2。與( &&)運算符。在形如 X&&Y的表達式中,首先計算 X并將其解釋執行為一個布爾值。如果這個布爾值為 false,那么返回 false(0),不再計算 Y,因為“與”的條件已經失敗。如果這個布爾值為true,但是,我們仍然不知道 X&&Y 是真是假,直到我們去計算 Y,并且也把它解釋執行為一個布爾值。不過,關于 &&運算符有趣的地方在于,當一個表達式計算為“true”的時候,那么就返回表達式本身。這很好,雖然它在邏輯表達式方面計算為“真”,但如果你希望的話也可用于返回該值。這就解釋了為什么,有些令人奇怪的是, 1 && 2返回 2(而不是你以為的可能返回 true 或 1)。20.執行下面的代碼時將輸出什么?請解釋。

          console.log(false=='0')
          console.log(false==='0')

          代碼將輸出:

          true
          false

          在JavaScript中,有兩種等式運算符。三個等于運算符===的作用類似傳統的等于運算符:如果兩側的表達式有著相同的類型和相同的值,那么計算結果為true。而雙等于運算符,會只強制比較它們的值。因此,總體上而言,使用===而不是==的做法更好。 !==vs !=亦是同理

          需要觀看python? java? web 資料的:

          老規矩:轉發+關注,私信小編“資料”免費分享資料給你!

          日,濱州醫學院發布公告,現面向社會公開招聘100多名工作人員,學校已經通過山東省人力資源和社會保障廳網站(http://hrss.shandong.gov.cn/)和濱州醫學院網站(http://www.bzmc.edu.cn/)面向社會發布招聘信息。

          根據崗位信息,此次招聘只招聘碩士以上學位的人才。根據要求,應聘初級崗位人員年齡應在40周歲以下(1979年4月16日以后出生);應聘中級崗位人員年齡應在45周歲以下(1974年4月16日以后出生);應聘副高級崗位人員年齡應在50周歲以下(1969年4月16日以后出生);應聘正高級崗位人員年齡應在55周歲以下(1964年4月16日以后出生)。

          應聘人員可登錄學校人力資源處網站(http://rsc.bzmc.edu.cn/)點擊浮窗(2020年省屬事業單位公開招聘專欄)或直接登錄網址(http://122.51.154.70:18080/)進行報名,按要求注冊并如實填寫、提交個人信息資料。每人限報一個崗位。報名人員在審核前可修改報名信息,后一次自動替換前一次信息。審核通過后,報名信息不能更改。本次招聘各類通知均通過報名系統或學校人力資源處網站(http://rsc.bzmc.edu.cn/)發布,不再進行電話通知,請考生自行關注查詢,因個人原因未及時查看通知消息而影響考試,后果自負。應聘人員務必于報名截止日17:00前電話確認,確認電話同《省屬事業單位公開招聘工作人員崗位匯總表》咨詢電話。

          在報名時間安排方面,初級崗位報名時間自信息發布之日起至2020年5月9日17:00止。面向高級專業技術人員和博士的崗位為長期招聘崗位,自簡章發布之日起10個工作日后,學校根據崗位報名情況,不定期啟動招聘程序(疫情期間實行網絡招聘),崗位招滿即止,未招滿的崗位報名有效期至2020年11月30日。學校將于每月月初在學校人力資源處網站及報名系統通報崗位空余情況,供應聘人員參考。面試、考察、體檢結果會在學校人力資源處網站及報名系統及時公布,接受社會監督。

          (齊魯晚報·齊魯壹點記者 尹明亮)

          找記者、求報道、求幫助,各大應用市場下載“齊魯壹點”APP或搜索微信小程序“壹點情報站”,全省600多位主流媒體記者在線等你來報料! 我要報料

          太原市晉源區2021年

          公開招聘事業單位工作人員公告

          根據中共山西省委組織部、山西省人力資源和社會保障廳《關于事業單位新進人員全面實行公開招聘的通知》(晉人社廳發〔2012〕53號)、《關于進一步改進和加強事業單位公開招聘工作的意見》(晉人社廳發〔2017〕35號)及《關于做好2021年全省事業單位公開招聘工作的通知》(晉人社廳發〔2021〕17號)文件的有關規定,結合我區實際,決定為晉源區公開招聘事業單位工作人員40名。現公告如下:

          一、招聘原則

          按照德才兼備的標準及“優化結構、合理配置、瞄準需求、科學設崗”要求,堅持“公開、平等、競爭、擇優”的原則。

          二、招聘崗位及名額

          招聘事業單位工作人員40人,具體崗位條件及名額見《太原市晉源區2021年事業單位招聘崗位一覽表》(以下簡稱《崗位一覽表》)(附件1)。

          三、招聘條件

          (一)基本條件

          1.具有中華人民共和國國籍,且年滿18周歲;

          2.遵守中華人民共和國憲法、法律和法規;

          3.具有良好的品行;

          4.身心健康,具有正常履行職責的身體條件;

          5.具有崗位所需的年齡、專業知識、職業資格、工作能力,以及國家認可的學歷;

          6.具備報考崗位所要求的其他資格條件。

          有下列情形之一的不得報考

          1.現役軍人,不能報考;

          2.在讀的非應屆畢業生不能報考(非2021年應屆畢業的在讀全日制專升本人員、研究生人員不得以原取得的學歷學位報考);

          3.因犯罪受過刑事處罰的、被開除中國共產黨黨籍或公職的;有犯罪嫌疑尚未查清的、正在接受紀律審查的或未解除黨紀、政務處分的人員,不能報考;

          4.各級公務員招考和事業單位招聘中被認定有舞弊等嚴重違反考錄、招聘紀律行為的人員,不能報考;

          5.試用期內的公務員、參照公務員法管理的事業單位工作人員和試用期內的事業單位工作人員,不能報考;

          6.招聘為事業單位工作人員有服務年限規定且服務期未滿的,不能報考;

          7.公務員、參照公務員法管理的事業單位工作人員和事業單位工作人員被辭退未滿5年的,不能報考;

          8.被依法列為失信聯合懲戒對象以及法律、法規規定不符合本次公開招聘要求的人員,不能報考;

          9.出現重大醫療事故或被吊銷醫師執照的人員,不能報考;

          10.報考人員不能報考聘用后即構成回避關系的崗位;

          11.在報名之后、聘用之前,應聘者已成為試用期內的公務員、參照公務員法管理的事業單位工作人員或已被聘用為事業單位工作人員的,不予聘用;

          12.國家法律法規規定不得聘用的其他情形人員。

          (二)資格條件

          1.學歷要求:符合所報考崗位的學歷要求。

          2.專業要求:所學專業必須符合報考崗位專業要求,應聘者報名表所填寫的所學專業名稱須與本人取得高校畢業證書上所標明的專業一致。崗位專業要求按具體專業名稱設置的,報考人員畢業證所學專業須與崗位要求的專業名稱一致。

          各崗位具體專業要求以《崗位一覽表》為準。專業參照教育部“普通高等學校本(專)科專業目錄”和“中國研究生招生信息網”專業庫設置。

          3.年齡要求:要求35周歲及以下(即1985年12月30日及以后出生)。個別崗位可放寬到40周歲及以下(即1980年12月30日及以后出生)。

          4.已就業人員報考時,須征得本單位同意(公務員、參照公務員法管理的事業單位工作人員和事業單位工作人員還需征得主管部門以及具有人事管理權限部門的同意);定向、委培畢業生,須征得定向、委培單位同意。

          (三)高校應屆畢業生崗位

          “高校應屆畢業生專門崗位”的招聘對象為:2021年全國普通高等院校應屆畢業生(不含委培、定向生)。2019年、2020年國家統一招生的普通高校畢業生未落實工作單位,其戶口、檔案、組織關系仍保留在原畢業學校,或保留在各級畢業生就業主管部門(畢業生就業指導服務中心)、各級人才交流服務機構和各級公共就業服務機構的畢業生視同為2021年高校應屆畢業生。

          2019年1月1日至資格復審前取得國(境)外學位并完成教育部門學歷學位認證且未落實工作單位的留學回國人員,可以報考應屆畢業生崗位。參加服務基層項目前無工作經歷,服務期滿后未落實工作單位的人員,服務期滿且考核合格后2年內,可以報考應屆畢業生崗位。

          (四)服務基層項目人員專門崗位

          “服務基層項目人員專門崗位”的招聘對象為:服務期滿且考核合格的山西省大學生村官(不含2018年以后錄用的選調生)、農村義務教育階段特設崗位教師、“三支一扶”人員、大學生志愿服務西部計劃人員(含晉西北計劃)、農業技術推廣服務特設崗位五類人員。

          在軍隊服役5年(含)以上的山西籍高校畢業生退役軍人以及勞動合同期滿,持有《政府購買基層公共服務崗位終止勞動合同證明書》和《山西省政府購買基層公共服務崗位人員考核合格證書》的省政府購買基層公共服務崗位人員,可按服務基層項目人員對待,報考“服務基層項目人員專門崗位”。

          以上服務(服役)期滿截止時間均為2021年12月。

          (五)其它條件要求

          其它條件以《崗位一覽表》為準。

          上述招聘條件審查貫穿招聘全過程,報考人員報名時提交的信息和提供的有關材料必須真實有效。凡發現報考者與擬聘用崗位所要求的資格條件不符、提供虛假材料的,即取消其考試、聘用資格。

          四、聘用人員待遇

          聘用人員納入全區事業單位編制管理,享受相應事業單位人員待遇。

          五、招聘程序

          (一)發布招聘公告

          招聘公告在晉源區人民政府網站

          (http://www.jinyuan.gov.cn)予以發布。招聘公告發布后,其他相關事宜將在晉源區人民政府網站予以發布。

          (二)報名及資格初審

          本次招聘采取網上報名的方式進行。報名網址:http://47.93.192.66/sxjinyuan/info/index.html,網上報名按以下程序進行:

          1.提交報名申請

          報名時間:2022年1月17日9:00至1月21日17:00。

          登陸

          http://47.93.192.66/sxjinyuan/info/index.html,提交報名申請,填寫《太原市晉源區2021年事業單位招聘人員報名登記表》并按要求上傳近期藍底免冠正面數碼照片(jpg格式,30KB以下)。報考人員只能選擇一個單位的一個崗位進行報名,所學專業必須符合所報崗位專業的要求,報名必須使用有效身份證,且與考試時使用的身份證一致。提交的報考信息應當真實、準確(其中報考人員報名登記表所填寫的資格證、專業應當與報考人員本人取得資格證書上、高校畢業證書上所載明的內容一致)。凡因信息填報有誤、不全導致未通過資格審查的,后果由報考人員自行負責。提供虛假或不實報名信息的,一經查實,即取消報考資格。對偽造、變造有關證件或材料騙取報考資格的,取消考試成績,并按有關規定予以嚴肅處理。

          2.資格初審和結果查詢

          資格初審時間:2022年1月17日9:00至1月23日17:00

          報考人員請在提交報考申請1個工作日后,登錄原報名網站查詢資格審查結果。通過資格初審的,不能再修改報名信息或報考其它崗位;1月21日17:00前尚未審查或未通過資格初審的,可以修改信息或改報其它崗位。1月21日17:00至1月23日17:00期間報考申請未通過資格初審的,不能再提交資格初審、修改報考信息或報考其它崗位。請報考人員認真填寫信息,以免因填報信息不準影響資格初審結果。

          資格審查貫穿招聘工作全過程,凡出現報考人員弄虛作假的,與招聘崗位不符的查實后立即取消考試資格或聘用資格。

          本次招聘考試實際報名繳費人數與崗位擬招聘人數比例應達3:1,報名繳費人數不達該比例的招聘崗位,按規定的比例相應核減崗位,如減少到1名仍達不到3:1,則取消該崗位。如被核減或取消的崗位為服務基層項目人員專門崗位或部分高校應屆畢業生專門崗位,調整的崗位數將合并到同崗位(非服務基層項目人員專門崗位或非高校應屆畢業生專門崗位),并視同其他報考人員平等競爭,不再另行改報。

          對于專業較偏、人員緊缺且報名人數少、確實難以形成競爭的特殊崗位,可根據報名情況由招聘工作領導小組批準后降低或取消比例進行招聘,但擬招聘人員考試總成績須達到65分及以上。

          報考人員報考崗位被取消的,可改報其他崗位。改報時間為2022年1月26日9:00至1月26日17:00。改報崗位資格審查時間:2022年1月26日9:00至1月27日12:00。資格審查結果可于2022年1月27日18:00前查詢。報考人員報考崗位被取消,未改報其他崗位或改報其他崗位未通過資格初審的,報名費將通過原報名渠道如數退還。

          3.繳納考試費用

          通過資格初審的報考人員按網上提示的繳費辦法進行網上繳費。繳費截止到2022年1月24日17:00。根據山西省發展和改革委員會、山西省財政廳《關于重新核發人力資源和社會保障部門行政事業性收費標準及有關問題的通知》(晉發改價格發〔2016〕467號)規定,本次考試收取考試費50元。未按期繳納考試費用的,視為自動放棄考試。

          建檔立卡貧困家庭人員、城市低保人員和農村低保人員可享受減免考試費政策。建檔立卡貧困家庭人員提供貧困家庭基本情況檔案卡和鄉村振興部門出具的證明;城市低保人員和農村低保人員提供低保證和所在地的縣級民政部門出具的證明,于2022年1月26日17:00前,前往晉源區人社局人事工資股(太原市晉源區景福北路8號2層240室)辦理減免考務費用的手續。

          4.打印準考證

          通過資格初審并按規定繳納費用的報考人員,可登陸原報名網站自行下載打印準考證,打印時間另行通知,請報考者密切關注晉源區人民政府網發布的通知。報考人員須認真閱讀準考證相關內容及注意事項,提前做好考試準備。

          報考人員請妥善保管好自己的準考證,參加筆試、資格復審和面試等各個環節均需攜帶準考證和有效身份證。

          (三)筆試

          1.筆試時間、地點:

          報考人員按照準考證上確定的時間、地點參加筆試。參加筆試時,報考人員須同時攜帶準考證和有效身份證。

          2.筆試內容:

          其他崗位筆試內容為公共基礎知識,包括政治理論、法律法規、時事政治、公文寫作、科技人文知識等。

          衛生系統崗位筆試內容包括政策理論、法律法規、衛生職業道德、突發公共衛生事件應急條例、中華人民共和國傳染病防治法、公共防疫等相關知識。

          3.筆試形式:筆試采取閉卷形式,總分100分,時間120分鐘。

          4.成績查詢:

          筆試閱卷結束后,筆試成績可在原報名網站查詢或在晉源區人民政府網予以公布。

          (四)資格復審

          1.資格復審人選的確定

          各崗位根據筆試成績從高分到低分的順序,按3﹕1的比例確定進入資格復審人選,人數未達3﹕1的按實有人數確定。如進入資格復審最后一名筆試成績并列,并列人員全部進入資格復審。

          2.資格復審

          進入資格復審人員名單和資格復審時間、地點將在晉源區人民政府網站公布。

          資格復審時,報考人員須提供以下材料:

          (1)本人有效居民身份證。

          (2)筆試準考證。

          (3)境內高校畢業生提供畢業證及有效期內的《教育部學歷證書電子注冊備案表》;留學回國人員應提供教育部中國留學服務中心出具的《國(境)外學歷學位認證書》;崗位有學位要求的,需提供報名所用學歷對應的學位證及教育部學位與研究生教育發展中心出具的《認證報告》;報考應屆畢業生崗位的,還需要提供與報名所用學歷對應的《就業報到證》或《就業協議書》;報考崗位要求的資格證書(已通過考試但資格證書還未下發的,可提供資格考核合格成績單或考試組織部門的證明)等相關證件(證明)。

          (4)已就業報考人員需出具單位同意報考證明(公務員、參照公務員法管理的事業單位工作人員和事業單位工作人員還需出具主管部門以及具有人事管理權限部門的同意報考意見)。

          (5)未就業且檔案在各級公共就業和人才交流服務中心、就業服務機構代理的報考人員,須提供檔案托管部門證明。

          (6)報考服務基層項目專門崗位人員,除攜帶上述材料外,還須下載打印《服務基層項目人員審核表》(附件2),按照要求填寫并加蓋公章確認。

          大學生村官由市、縣兩級組織部門審核蓋章;農村義務教育階段特設崗位教師由省教育廳蓋章;2010年以前的“三支一扶”項目人員由團省委蓋章,2010年(含)以后已領取《高校畢業生“三支一扶”服務證書》的直接攜帶證書參加資格復審,未領取《高校畢業生“三支一扶”服務證書》的,由省人社廳蓋章;“西部計劃”“晉西北計劃”項目人員由團省委蓋章;參加“農業技術推廣服務特設崗位”計劃項目人員由市縣兩級農業部門審核蓋章。

          在軍隊服役5年(含)以上的山西籍高校畢業生退役軍人報考服務基層項目人員專門崗位的,除攜帶上述材料外,還須提供戶口簿(印有本人戶口信息的戶口簿頁和戶主主頁)、退伍證和當地退役軍人事務部門出具的相關證明;省政府購買基層公共服務崗位人員須提供《政府購買基層公共服務崗位終止勞動合同證明書》和《山西省政府購買基層公共服務崗位人員考核合格證書》。

          服務基層項目人員報考“應屆畢業生崗位”的,還需承諾在參加服務基層項目前無工作經歷。

          (7)崗位有“中共黨員(含預備黨員)”要求的,需提供所在黨支部或上級黨組織出具的黨組織關系證明,并注明入黨時間。

          (8)崗位有職業資格、研究方向、工作經歷等其他要求的,需提供相關證件(證明)。

          以上材料須提供原件及復印件,屬于證件類的驗原件留復印件,屬于證明類的留原件。

          資格復審時,發現應試者材料信息不實的,將取消其參加面試的資格。逾期不到的,視為自動放棄面試資格。若資格復審過程中有人放棄或未通過,按筆試成績從高分到低分順次遞補,如遞補人員成績并列,則全部參加資格復審;如參加筆試的報考人員中已無遞補對象,則按資格復審合格的實有人員進入面試。資格復審結束后,按資格復審合格的實際人數確定參加面試人選。參加資格復審人員因個人原因放棄面試資格,應盡早提出放棄面試申明,確認參加資格復審人員需填寫誠信承諾書,無故放棄面試將按有關規定被記入誠信檔案。

          證件(證明)不全或所提供的證件(證明)與報考崗位要求的資格條件不符以及主要信息不實的,資格復審不合格,后果由報考人員承擔,涉及違紀的按有關違紀處理規定予以查處。

          (五)面試

          1.面試時間地點:

          進入面試人員名單和面試時間、地點以晉源區人民政府網站公告的信息為準。

          2.面試方式:

          面試采取結構化面試的方式,考查報考人員的(綜合分析能力、言語表達能力、應急應變能力、基層服務意識及能力、自我情緒控制能力和舉止儀表等)。面試采取百分制,成績60分為合格(含60分),不合格者不予聘用,若招聘崗位參加面試人員不能形成競爭的,報考人員面試成績必須達到70分及以上,否則不予聘用。

          3.體檢人員的確定

          面試結束后,按考試總成績(考試總成績=筆試成績×60%+面試成績×40%)從高到低的順序,按招聘崗位計劃聘用人數等額確定參加體檢人選。如考試總成績相同則按筆試成績從高到低的順序確定參加體檢人選,如筆試成績也相同則加一場面試,按面試加試成績從高到低的順序確定參加體檢人選。

          面試成績、考試總成績、體檢名單將在晉源區人民政府網站予以公示。

          (六)體檢

          體檢標準參照《關于修訂〈公務員錄用體檢通用標準(試行)>》,體檢具體事宜另行通知,體檢費用由報考人員承擔。因不按規定的時間、地點參加體檢的人員,視作自動放棄體檢,取消其進入考察對象資格,所空缺的崗位按綜合成績順次遞補。進入體檢人員對體檢結果有異議的,可在接到體檢結論通知起3個工作日內書面提出復檢申請,招聘領導組在收到復檢申請的10個工作日內組織復檢,復檢只進行一次,體檢結果以復檢結論為準。體檢合格者確定為考察對象,體檢不合格所空缺的崗位按綜合成績順次遞補。

          (七)考察

          考察內容主要包括應聘者的政治思想、道德品質、遵紀守法、誠實守信、自律意識、能力素質、工作態度、學習及工作表現以及需要回避的情況等,并對報考者提供的學歷、資格等信息進行再次復核。不按規定參加考察或考察不合格者取消其擬聘用資格,所空缺的崗位不再遞補。

          (八)公示

          根據考試、體檢、考察結果,確定擬聘用人員,擬聘用人員名單在晉源區人民政府網站予以公示,公示期為7個工作日。廣泛接受社會群眾的監督,對反映有影響聘用的問題并查實的,取消其擬聘用資格,不再遞補。

          (九)審批聘用

          1.擬聘用人員公示期滿無異議,經領導組審核并報區委、區政府同意后,由區委組織部和區人社局按規定辦理聘用手續。

          2.聘用人員在晉源區的最低服務期限為五年,與用人單位簽訂聘用合同,試用期為一年,試用期包含在服務期內。服務期內不得調離本區,不得辦理辭職等手續(用人單位解除聘用合同的情況除外)。

          3.試用期滿考核合格的予以辦理轉正手續,考核不合格的,用人單位與其解除聘用合同,不再遞補。

          4.聘用人員在試用期內發現患有癲癇、精神病等體檢中不易查出的疾病及其他不能勝任本職工作的疾病,予以解聘,不再遞補。

          六、咨詢與監督

          報名咨詢:其 他 崗 位:0351--6592372

          衛生系統崗位:0351--6592802

          監督舉報電話:0351--6812380

          (僅限工作時間)

          七、防疫要求

          為做好疫情防控常態化下的公開招聘考試工作,保證考務安全,考務人員及報考人員須按照省、市、區新冠肺炎疫情防控要求,做好參加招聘的防疫工作。

          八、招聘紀律

          (一)嚴格執行事業單位公開招聘有關政策規定,切實做到公開、公平、公正。

          (二)嚴格執行事業單位公開招聘工作程序,嚴肅工作紀律,嚴守工作秘密,嚴格實行回避制度。

          (三)應聘人員以不正當手段(如偽造、涂改證件、證明等)獲取應聘資格或在筆試、面試、體檢、考察過程中出現作弊等違紀違規行為,一經發現,立即取消資格。

          特別提示

          (一)在招聘過程中,所有公示信息、通知、公告等全部通過晉源區人民政府網站公布,不再另行電話通知,請報考人員及時關注網站信息。如報考人員因自身原因未能及時獲取招聘信息或從其他渠道獲取錯誤信息而延誤、影響招聘的,其后果由報考人員自行負擔。

          (二)本次公開招聘考試不指定考試輔導用書,不舉辦也不委托任何機構或個人舉辦考試輔導培訓班。凡社會上舉辦的各類事業單位招聘培訓輔導班和發行的出版物等,均與本次公開招聘無關。敬請廣大報考人員提高警惕,切勿上當受騙。

          本公告由晉源區2021年事業單位公開招聘工作領導組辦公室負責解釋。

          附件1太原市晉源區2021年事業單位招聘崗位一覽表.xlsx


          附件2晉源區2021年公開招聘事業單位工作人員服務基層項目人員審核表.xls


          晉源區2021年事業單位

          公開招聘工作領導組

          2021年12月30日



          監制|上官小鵬 趙紅

          編輯|李文涵

          來源|山西省人社廳


          主站蜘蛛池模板: 无码人妻精品一区二区三区蜜桃| 亚洲成AV人片一区二区密柚| 国产裸体歌舞一区二区| 欧洲精品码一区二区三区免费看 | 国产小仙女视频一区二区三区| 国产AV午夜精品一区二区三| 伦精品一区二区三区视频| 免费一区二区无码东京热| 国产在线精品一区二区在线看| 日韩中文字幕精品免费一区| 国产在线无码一区二区三区视频 | 亚洲中文字幕丝袜制服一区| 亚洲精品色播一区二区| 日本伊人精品一区二区三区| 亚洲日韩精品无码一区二区三区| 一区二区三区免费在线视频| 国产成人精品一区二区三在线观看| 无码人妻精品一区二区三区蜜桃| 麻豆一区二区三区精品视频| 无码精品黑人一区二区三区| 鲁丝片一区二区三区免费| 中文字幕一区二区三区永久| 国产在线精品一区二区三区不卡| 中文字幕一区二区三区精华液 | 国产精品成人一区无码| 性色av无码免费一区二区三区 | 国产一区二区三区在线2021 | aⅴ一区二区三区无卡无码| 国产伦精品一区三区视频| 国产伦精品一区二区三区免.费| 精品一区中文字幕| 乱人伦一区二区三区| 精品人妻少妇一区二区| 一区二区在线视频免费观看| 超清无码一区二区三区| 亚洲AV综合色区无码一区| 亚洲一区二区三区久久| 精品国产亚洲一区二区三区在线观看| 精品久久久中文字幕一区| V一区无码内射国产| 性色A码一区二区三区天美传媒|