javascript
javascript 常用知识点
1:瀏覽器是有緩存的,開發中可以通過快捷鍵繞過緩存
對于Windows驅動的系統:Ctrl + F5
對于Mac驅動的系統:Command + Shift + R.
2:精度問題 (符點和大數字可能會導致精度出現問題)
0.1 + 0.2 == 0.3;? ? // false? 判斷符點的==時需注意
? ? ? 99999999999999999 === 100000000000000000? ? // true? ?大整數丟失精度
? ? ?12.235.toFixed(2)? ?// 12.23 難道是我概念理解錯了?
3:Promise (Promise是個承諾.? new Promise(function(resolve, reject){})? 一言即出,四馬難追.)
4:閉包函數. (函數創建的時候,scope就確定了)
var a = 0;function addCount() {a++;}// 修改下使之成為一個閉包function addCount() {var a = 0;return function() {a++;} }5: 箭頭函數. (箭頭函數對懶人來說很有用,看上去清晰多了 )
? ? const add = x => y => x + y;
? ? add(10)(1);
6: 判斷相等.? (判斷是值的判斷,對像和對像判斷是判斷地址,對象和原始數據判斷是,是先把對象轉化原始數據)
? ?console.log(null == 0);? ? ? ? ? ? ? // false
? ?console.log(Boolean("0"));? ? ? ? // true
? ?console.log([] == 0);? ? ? ? ? ? ? ? ?// true.? 對象與基本數據判斷的時候,對象會先轉化為基本數據
? ?console.log({valueOf:()=>5} == 5);? ?// ture
? ?console.log(Boolan([]));? ? ? ? ? ? // true;
7:let 與 var的區別
//------ 全局變量a由var命令聲明,所以它是頂層對象的屬性;全局變量b由let命令聲明,所以它不是頂層對象的屬性 var a = 1; console.log(window.a); // 1 let b = 1; console.log(window.b); // undefined// ------let 自帶作用域-------------------------------------------------------------------------- let name1 = "hong"; (function(){let name1 = "honghong" })(); console.log(name1); // honghongvar name = "hong"; (function() {name = "honghong"; })(); console.log(name); // honghong//---------------------------------------------------------與閉包相關---------------------------- // 用let實現閉包 var array = []; for (let i = 0; i < 5; i++) {array.push(function(){console.log("i:", i)}); } array[2](); // 輸出2// 用var array = []; for (var j = 0; j < 5; j++) {array.push(function(){console.log("i:", j);}); } array[2](); // 輸出5// 用閉包實現 array = []; for (var j = 0; j < 5; j++) {array.push((function(index){return function() {console.log("i", index);}})(j)); } console.log(array[2]()); // 輸出28:二進制 ArrayBuffer, TypedBuffer,? DataView
? ArrayBuffer代表儲存二進制數據的一段內存.不能直接用來讀寫。只能被TypeArray或DataView"包裝"后,方才能讀寫
? TypedBuffer用來讀寫簡單的二進制數據(參數 arraybuffer, 起始位置,? 長度 | 普通數組 | count )
? DataView用來讀寫復雜的二進制數據(參數 arraybuffer, 起始位置,count )
? const buffer = new ArrayBuffer(24);
? const uint32Array = new Uint32Array(buffer, 0, 1);
? const uint3Array = new Uint8Array(buffer, 4, 16);
? const float32Array = new Float32Array(buffer, 20, 1);
? 上面代碼將一個 24 字節長度的ArrayBuffer對象,分成三個部分:
- 字節 0 到字節 3:1 個 32 位無符號整數
- 字節 4 到字節 19:16 個 8 位整數
- 字節 20 到字節 23:1 個 32 位浮點數
9:async返回一個Promise. async函數內部return語句返回的值會成為then方法回調函數的參數
async function f() {return 'hello world'; } f().then(v => console.log(v))10:正則表達式
(x)? ? ?匹配 'x'?并且記住匹配項? ? ? ? 例? ?'bar foo'.replace( /(bar) (foo)/, '$2 $1');? ? // foo bar
? (?:x)? ?匹配?'x'?并且不記住匹配項
? x(?=y)?匹配?'x'并且后面跟著y
? x(!=y)?匹配?'x'并且后面不跟著y
? \b? ? ? 匹配一個詞的邊界
11:webgl用的是右手坐標系
12:symbol 是原始數據,可表示唯一的值. Symbol("bar) == Symbol("bar") // false? ? Symbol.from("bar") == Symbol.from("bar") // true
13:Iterator 接口的目的,就是為所有數據結構,提供了一種統一的訪問機制
14:VO|AO (聽起來很高大上,理解下,裝裝逼)
? ? ? EC的建立分兩階段
進入上下文階段:發生在函數調用時,但是在執行具體代碼之前(比如,對函數參數進行具體化之前)
? ? ? ? ? ? 執行代碼階段:變量賦值,函數引用,執行其他代碼。
AO示例:function test(a, b) {var c = 10;function d() {}var e = function _e() {};(function x() {}); }test(10); // call 當進入test(10)的執行上下文時,它的AO為:testEC={AO:{arguments:{callee:testlength:1,0:10},a:10,c:undefined,d:<reference to FunctionDeclaration "d">,e:undefined} }; 由此可見,在建立階段,VO除了arguments,函數的聲明,以及參數被賦予了具體的屬性值,其它的變量屬性默認的都是undefined。函數表達式不會對VO造成影響,因此,(function x() {})并不會存在于VO中。當執行test(10)時,它的AO為:testEC={AO:{arguments:{callee:test,length:1,0:10},a:10,c:10,d:<reference to FunctionDeclaration "d">,e:<reference to FunctionDeclaration "e">} }; 可見,只有在這個階段,變量屬性才會被賦具體的值。15:知識概念 舉例說明?
// 填充VO的順序是: 函數的形參 -> 函數申明 -> 變量申明。當變量申明遇到VO中已經有同名的時候,不會影響已經存在的屬性
function a(x) {return x * 2; } var a; console.log(a); // 活動對象是在進入函數上下文時刻被創建的,它通過函數的arguments屬性初始化
function b(x, y, a) {
arguments[2] = 10;
console.log(a);
}
b(1, 2);
// __proto__ 指向原型對象
function A(){};
A.prototype.getName = function(){return console.log("honghong")};
var a = new A();
a.getName(); // honghong
a.__proto__ = null;
console.log(a instanceof A); // 檢查a是否是A的原型 false
a.getName(); // 指向的原型為空,所以報錯
// 構造函數動態傳參
function People(a, b, c) {
this.a = a;
this.b = b;
this.c = c;
}
People.prototype.say = function() {
console.log("say hello");
}
var obj = {};
People.apply(obj, [1,2,3]);
obj.__proto__ = People.prototype;
console.log(obj.a,obj.b,obj.c);
console.log(obj.say);
16:防盜鏈的實現可以通過設置HTTP Header中的Referer實現
? ? base標簽很有用,可以本地看線上的一些效果
? ? xml一般只在瀏覽器會有支持,像nodejs,小游戲等不支持xml,這時就需要把xml轉化成json,或使用?window.DOMParser = require("./xmldom/xmldom.js").DOMParser
17:es6寫法
? ?var obj1 = {}, var obj2 = {...obj1}, 淺復制的另一種寫法
轉載于:https://www.cnblogs.com/honghong87/p/9800479.html
總結
以上是生活随笔為你收集整理的javascript 常用知识点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: fiddler 看懂瀑布图Timelin
- 下一篇: 图书管理系统之外键的增删改查