日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Javascript中的奇葩知識,你知道嗎?

瀏覽:219日期:2023-10-05 09:29:25

久經沙場的前輩們,寫了無數代碼,踩了無數的坑。但有些坑,可能一輩子也踩不到摸不著,因為根本不會發生在業務代碼里~~

1

Function.prototype 竟然是個函數類型。而自定義函數的原型卻是對象類型。

typeof Function.prototype === ’function’; // truefunction People() {}typeof People.prototype === ’object’; // true

所以我們設置空函數可以這么做:

// OK const noop = Function.prototype;// OKconst noop = () => {};2

一個變量真的會不等于自身嗎?

const x = NaN;x !== x // true

這是目前為止js語言中唯一的一個不等于自己的數據。為什么?因為NaN代表的是一個范圍,而不是一個具體的數值。在早期的 isNaN() 函數中,即使傳入字符串,也會返回true,這個問題已經在es6中修復。

isNaN(’abc’); // trueNumber.isNaN(’abc’) // false

所以如果您想兼容舊瀏覽器,用 x !== x 來判斷是不是NaN,是一個不錯的方案。

3

構造函數如果return了新的數據

// 不返回function People() {}const people = new People(); // People {}// 返回數字function People() { return 1;}const people = new People(); // People {}// 返回新對象function Animal() { return { hello: ’world’, };}const animal = new Animal(); // { hello: ’world’ }

在實例化構造函數時,返回非對象類型將不生效

4

.call.call 到底在為誰瘋狂打call?

function fn1() { console.log(1);}function fn2() { console.log(2);}fn1.call.call(fn2); // 2

所以 fn1.call.call(fn2) 等效于 fn2.call(undefined)。而且無論您加多少個 .call,效果也是一樣的。

5

實例后的對象也能再次實例嗎?

function People() {}const lili = new People(); // People {}const lucy = new lili.constructor(); // People {}

因為lili的原型鏈指向了People的原型,所以通過向上尋找特性,最終在 Peopel.prototype 上找到了構造器即 People自身

6

setTimeout 嵌套會發生什么奇怪的事情?

console.log(0, Date.now());setTimeout(() => { console.log(1, Date.now()); setTimeout(() => { console.log(2, Date.now()); setTimeout(() => { console.log(3, Date.now()); setTimeout(() => { console.log(4, Date.now()); setTimeout(() => { console.log(5, Date.now()); setTimeout(() => { console.log(6, Date.now()); }); }); }); }); });});

在0-4層,setTimeout的間隔是1ms,而到第5層時,間隔至少是4ms。

7

es6函數帶默認參數時將生成聲明作用域

var x = 10;function fn(x = 2, y = function () { return x + 1 }) { var x = 5; return y();}fn(); // 38

函數表達式(非函數聲明)中的函數名不可覆蓋

const c = function CC() { CC = 123; return CC;};c(); // Function

當然,如果設置var CC = 123,加聲明關鍵詞是可以覆蓋的。

9

嚴格模式下,函數的this是undefined而不是Window

// 非嚴格function fn1() { return this;}fn1(); // Window// 嚴格function fn2() { ’use strict’; return this;}fn2(); // undefined

對于模塊化的經過webpack打包的代碼,基本都是嚴格模式的代碼。

10

取整操作也可以用按位操作

var x = 1.23 | 0; // 1

因為按位操作只支持32位的整型,所以小數點部分全部都被拋棄

11

indexOf() 不需要再比較數字

const arr = [1, 2, 3];// 存在,等效于 > -1if (~arr.indexOf(1)) {}// 不存在,等效于 === -1!~arr.indexOf(1);

按位操作效率高點,代碼也簡潔一些。也可以使用es6的includes()。但寫開源庫需要考慮兼容性的道友還是用indexOf比較好

12

getter/setter 也可以動態設置嗎?

class Hello { _name = ’lucy’; getName() { return this._name; } // 靜態的getter get id() { return 1; }}const hel = new Hello();hel.name; // undefinedhel.getName(); // lucy// 動態的getterHello.prototype.__defineGetter__(’name’, function() { return this._name;});Hello.prototype.__defineSetter__(’name’, function(value) { this._name = value;});hel.name; // lucyhel.getName(); // lucyhel.name = ’jimi’;hel.name; // jimihel.getName(); // jimi13

0.3 - 0.2 !== 0.1 // true

浮點操作不精確,老生常談了,不過可以接受誤差

0.3 - 0.2 - 0.1 <= Number.EPSILON // true14

class語法糖到底是怎么繼承的?

function Super() { this.a = 1;}function Child() { // 屬性繼承 Super.call(this); this.b = 2;}// 原型繼承Child.prototype = new Super();const child = new Child();child.a; // 1

正式代碼的原型繼承,不會直接實例父類,而是實例一個空函數,避免重復聲明動態屬性

const extends = (Child, Super) => { const fn = function () {}; fn.prototype = Super.prototype; Child.prototype = new fn(); Child.prototype.constructor = Child;};15

es6居然可以重復解構對象

const obj = { a: { b: 1 }, c: 2};const { a: { b }, a } = obj;

一行代碼同時獲取a和a.b。在a和b都要多次用到的情況下,普通人的邏輯就是先解構出a,再在下一行解構出b。

16

判斷代碼是否壓縮居然也這么秀

function CustomFn() {}const isCrashed = typeof CustomFn.name === ’string’ && CustomFn.name === ’CustomFn’;17

對象===比較的是內存地址,而>=將比較轉換后的值

{} === {} // false// 隱式轉換 toString(){} >= {} // true18

intanceof 的判斷方式是原型是否在當前對象的原型鏈上面

function People() {}function Man() {}Man.prototype = new People();Man.prototype.constructor = Man;const man = new Man();man instanceof People; // true// 替換People的原型People.prototype = {};man instanceof People; // false

如果您用es6的class的話,prototype原型是不允許被重新定義的,所以不會出現上述情況

19

Object.prototype.__proto__ === null; // true

這是原型鏈向上查找的最頂層,一個null

20

parseInt太小的數字會產生bug

parseInt(0.00000000454); // 4parseInt(10.23); // 1021

1 + null // 11 + undefined // NaNNumber(null) // 0Number(undefined) // NaN22

實參arguments和形參會保持同步關系

function test(a, b, c) { console.log(a, b, c); // 2, 3, undefined arguments[0] = 100; arguments[1] = 200; arguments[2] = 300; console.log(a, b, c); // 100, 200, undefined}test(2, 3);

如果實參傳的個數不足,那么同步關系也會失效。您也可以用use strict嚴格模式來避免這一行為,這樣arguments就只是個副本了。

23

void是個固執的老頭

void 0 === undefined // truevoid 1 === undefined // truevoid {} === undefined // truevoid ’hello’ === undefined // truevoid void 0 === undefined // true

跟誰都不沾親~~

24

try/catch/finally也有特定的執行順序

function fn1() { console.log(’fn1’); return 1;}function fn2() { console.log(’fn2’); return 2;}function getData() { try { throw new Error(’’); } catch (e) { return fn1(); } finally { return fn2(); }}console.log(getData());// 打印順序: ’fn1’, ’fn2’, 2

在try/catch代碼塊中,如果碰到return xxyyzz;關鍵詞,那么xxyyzz會先執行并把值放在臨時變量里,接著去執行finally代碼塊的內容后再返回該臨時變量。如果finally中也有return aabbcc,那么會立即返回新的數據aabbcc。

25

是否存在這樣的變量x,使得它等于多個數字?

const x = { value: 0, toString() { return ++this.value; }}x == 1 && x == 2 && x == 3; // true

通過隱式轉換,這樣不是什么難的事情。

26

clearTimeout 和 clearInterval 可以互換使用嗎

var timeout = setTimeout(() => console.log(1), 1000);var interval = setInterval(() => console.log(2), 800);clearInterval(timeout);clearTimeout(interval);

答案是:YES。大部分瀏覽器都支持互相清理定時器,但是建議使用對應的清理函數。

27

下面的打印順序是?

setTimeout(() => { console.log(1);}, 0);new Promise((resolve) => { console.log(2); resolve();}).then(() => console.log(3));function callMe() { console.log(4);}(async () => { await callMe(); console.log(5);})();

答案是:2, 4, 3, 5, 1

主線任務:2,4微任務:3,5宏任務:1

28

null是object類型,但又不是繼承于Object,它更像一個歷史遺留的bug。鑒于太多人在用這個特性,修復它反而會導致成千上萬的程序出錯。

typeof null === ’object’; // trueObject.prototype.toString.call(null); // [object Null]null instanceof Object;// false29

基本類型(null和undefined除外)在操作的時候,引擎會自動為數據包裝成對象,操作完就銷毀對象。

’abc’.substr(1);(123).toFixed(2);

所以增加任何數據上去都會被銷毀,除非修改原型鏈

const data = ’abc’;data.x = ’y’;console.log(data.x); // undefineddata.__proto__.x = ’z’;console.log(data.x); // ’z’30

數據超過了安全值就變得不安全了

Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true// 等價于2 ** 53 === 2 ** 53 + 1; // true31

函數形參帶默認值時,會改變一些認知

function test(a, b = 1) { // 別名同步,非嚴格模式預期可以同步 arguments[0] = 20; console.log(a); // 2}// 檢測函數的形參個數,預期值為:2console.log(test.length); // 1test(123);32

數字都是浮點類型。位運算操作時,js會先把數字轉換到int類型。相對于其他語言,這算是一筆額外的性能開銷。

1 | 0 // 11.234 | 0 // 11.234 | 0.6 // 11 & 1 // 11.23 & 1.456 // 1~1 // -2~1.234 // -233

賦值給location可以直接跳轉

location = ’http://baidu.com’;34

你知道new的另一個用法嗎?

function Test() { console.log(new.target === Test); // true}new Test();

如果實例了子類,那么new.target就不是Test了,通過這個方法可以實現abstract class的效果

35

+0 和 -0 是有區別的

1/+0 === Infinity1/-0 === -Infinity

以上就是Javascript中的奇葩知識,你知道嗎?的詳細內容,更多關于JavaScript 奇葩知識的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品片aa在线观看| 亚洲高清激情| 丝袜美腿一区二区三区| 亚洲高清av| 欧美特黄一区| 视频一区二区中文字幕| 天堂成人免费av电影一区| 99精品小视频| 1000部精品久久久久久久久| 自拍日韩欧美| 亚洲视频电影在线| 日韩精品三级| 国产精品久久久久久妇女| 国产精品视频一区二区三区综合| 国产精品天天看天天狠| 麻豆久久久久久| 高清日韩中文字幕| 久久亚洲成人| 免费观看在线综合| 91在线成人| 日本久久综合| 婷婷成人在线| 亚洲精品国产偷自在线观看| 久久亚洲影院| 欧美日本精品| 国产不卡精品| 韩日一区二区三区| 亚洲欧美网站在线观看| 奇米狠狠一区二区三区| 成人午夜在线| 国产一区日韩一区| 亚洲无线观看| 国产精品一区二区三区美女 | 中文一区一区三区免费在线观 | 亚洲性色av| 在线视频精品| 日本va欧美va精品发布| 久久av电影| 久久九九精品| 丝袜国产日韩另类美女| 欧美三级第一页| 国产精品色在线网站| 国产资源在线观看入口av| 亚洲女同一区| 国产精品一级在线观看| 人在线成免费视频| 视频一区欧美日韩| 精品一区二区三区中文字幕视频 | 激情91久久| 日本伊人久久| 国产欧洲在线| 视频一区二区欧美| 欧美国产亚洲精品| 激情五月综合| 日韩不卡手机在线v区| 国产一区二区三区不卡视频网站 | 国产一区二区久久久久| 黄色日韩在线| 欧美国产中文高清| 欧美日韩国产一区精品一区| 国产精品网站在线看| 婷婷综合社区| 69堂免费精品视频在线播放| 日韩伦理一区| 性色一区二区| 久久精品网址| 免费在线观看精品| 美女一区网站| 日韩国产一二三区| 久久免费高清| 国产欧美日韩在线一区二区| 婷婷综合激情| 成人污污视频| 午夜亚洲福利| 精品一区毛片| 国产aa精品| 日本va欧美va欧美va精品| 亚洲特级毛片| 国产精品成人一区二区不卡| 国产亚洲精品久久久久婷婷瑜伽| 精品久久精品| 日本欧美一区| 日韩一级欧洲| 亚洲精品永久免费视频| 国产无遮挡裸体免费久久| 亚洲欧美久久| 久久精品导航| 国产一区二区三区亚洲综合| 日本精品国产| 精品理论电影在线| 色婷婷精品视频| 久久高清免费观看| 日韩福利视频网| 欧美国产另类| 精品高清久久| 国产精品99一区二区三| 鲁大师成人一区二区三区| 亚洲一区欧美二区| 久久蜜桃精品| 免费在线观看不卡| 国产成人精品一区二区三区视频| 欧美性感美女一区二区| 99久精品视频在线观看视频| 六月丁香综合| 亚洲成人va| 一区二区三区午夜视频| 国产成人精品亚洲线观看| 久久xxxx精品视频| 老牛国内精品亚洲成av人片 | 日本伊人午夜精品| 久久精品国产99国产| 国产精品一区三区在线观看| 亚洲五月综合| 欧美一级二级三级视频| 欧美午夜网站| 久久的色偷偷| 国产欧美日韩影院| 欧美中文一区| 国产精品视频3p| 欧美成人高清| 欧美日韩国产观看视频| 日韩欧美不卡| 麻豆91在线播放| 欧美日韩午夜| 日本精品国产| 香蕉久久99| 国产一区二区三区自拍| 久久超级碰碰| 国产欧美啪啪| 免费一级欧美片在线观看网站| 日本va欧美va瓶| 日本va欧美va瓶| 青草国产精品久久久久久| 日韩区一区二| 亚洲麻豆一区| 欧美日本不卡| 日本一区二区中文字幕| 亚洲欧美网站在线观看| 日韩精品一二区| 伊人国产精品| 日韩av影院| 免费日韩一区二区三区| 欧美成人精品一级| 精品视频黄色| 精精国产xxxx视频在线播放| 大香伊人久久精品一区二区| 日韩欧美一区二区三区在线视频 | 久久精品凹凸全集| 精品中文在线| 99久久精品网站| 久久国产电影| 老牛国产精品一区的观看方式| 亚洲精品影视| 久久不卡国产精品一区二区| 久久久久久色| 欧美精品不卡| 国产一区二区三区不卡视频网站| 毛片在线网站| 99久久久久久中文字幕一区| 国产亚洲精品自拍| 欧美亚洲综合视频| 国产91在线精品| 欧美日韩国产一区精品一区| 天堂久久一区| 国产一区二区三区黄网站 | 久久香蕉网站| 伊人久久大香线蕉av不卡| 免费日韩视频| 久久99影视| 一区二区小说| 日韩av网站在线观看| 在线看片福利| 亚洲一二av| 麻豆视频久久| 少妇久久久久| 日韩国产一区二| 日韩欧美自拍| 一区二区国产在线| 一级欧美视频| 国产成人77亚洲精品www| 国产一区白浆| 麻豆精品久久| 中文在线一区| 久久一区视频| 欧美日韩水蜜桃| 国产精品亚洲成在人线| 久久精品电影| 久久国产人妖系列| 私拍精品福利视频在线一区| 日韩在线成人| 超级白嫩亚洲国产第一| 亚洲精品精选| 日韩欧美一区二区三区免费看| 美女网站一区| 国产精品亚洲产品| 蜜臀久久99精品久久久画质超高清 | 亚洲精品黄色| 欧美69视频| 国产精品一区二区精品| 亚洲男女av一区二区|