原生js 小知识点
#eval 接受一個字符串,并將其內容視為好像原先就寫成了代碼一樣。
function foo(str){
? ? "use strict";
? ? eval(str);
? ? console.log(a);//3
}
foo("var a = 3;");
?
但是在嚴格模式下,eval會自己增加一個作用域。結果如下:
function foo(str){
? ? "use strict";
? ? eval(str);
? ? console.log(a);//Uncaught ReferenceError: a is not defined
}
foo("var a = 3;");
?
#立即執行表達式
(function foo(num){
? ? console.log(3,num);
})(45);
也可以寫成
(function foo(num){
? ? console.log(3,num);
}(45));
?
#'use strict'; ?
規范js的代碼格式,建議每個js文件都用之
?
#var?”變量提升“現象,只是聲明的提升,定義或者賦值不提升
// var 的情況 console.log(foo); // 輸出undefined var foo = 2; // let 的情況 console.log(bar); // 報錯ReferenceError let bar = 2;PS:const用法:
const PI = 3.14;
?
# ==與===區別
? ? ===需要參數類型相同,==則不需要類型相同
?
#js的循環
(1)of? in區別
? ?of: 遍歷集合本身,in則遍歷每一個鍵值對;即,in的范圍要大一些。
var a = ['A', 'B', 'C']; a.name = 'Hello';? ? of包含:A B C;in包含了A B C name
? ?XXX
(1)forEach
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]); m.forEach(function (value, key, map) { console.log(""+key+"-"+value); });?
#數組的高階函數
? ? (1)map? :每一個元素做操作
? ? ? var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
? ? ? var results = arr.map((x)=>{return x^2;}); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
? ? ? console.log(results);
? ? ?(2)reduce:每2個元素操作,不斷迭代
效果:[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)? ? ? var arr = [1, 3, 5, 7, 9];
? ? ? arr.reduce(function (x, y) {
? ? ? ? ? return x * 10 + y;
? ? ? }); // 13579
? ? ?(3)filter函數:過濾一些元素
var arr = [1, 2, 4, 5, 6, 9, 10, 15]; var r = arr.filter(function (x) { return x % 2 !== 0; }); r; // [1, 5, 9, 15]? ? ?(4)sort:排序
var arr = [10, 20, 1, 2]; arr.sort(function (x, y) { if (x < y) { return 1; } if (x > y) { return -1; } return 0; }); // [20, 10, 2, 1]?
#閉包:閉包經常用于創建含有隱藏數據的函數,閉包就是能夠讀取其他函數內部變量的函數。
? ? ?參看鏈接https://kb.cnblogs.com/page/110782/。
? ? ? http://www.ruanyifeng.com/blog/
?
?
#閉包中的this
https://www.cnblogs.com/nuanriqingfeng/p/5789003.html
?
#call apply
所有函數都有call apply這2個方法。如果不適用他們,那么就需要給函數 顯式傳入一個上下文對象,略顯麻煩。
method.call(obj);//method為方法名,obj為執行此方法的對象。
?????????????? function sayHello() {? alert(this.name);? }
?????????????? let me = {"name":"leo","age":22};
??????????????sayHello.call(me);
?
call和apply的第一個參數都是對象,call后續的參數是傳入的參數序列(不是數組),apply的第二個參數是一個數組。? call(obj,p1,p2,p3);????????? apply(obj,[p1,p2,p3]);
?? ?function add(c,d){
??????? return this.a + this.b + c + d;
??? }
??? var s = {a:1, b:2};
??? console.log(add.call(s,3,4)); // 1+2+3+4 = 10
??? console.log(add.apply(s,[5,6])); // 1+2+5+6 = 14
#對象屬性配置
var myObject = {a:2};
Object.getOwnPropertyDescriptor(myOjbect,"a");? //獲取屬性的配置
Object.defineProperty(myOjbect,"a",{?? //設定屬性的配置
????value:2,
??? writable:true,
????configurable:true,
??? enumerable:true
});
//value :2??????????????? 值??????????【好理解】
//writable:true???????? 可寫???????【好理解】
//enumerable:true? 可枚舉?????【如果設置為false,那么對象(含數組)的for in循環將獲取不到該屬性,】
//configurable:true?? 可配置???【 把configurable 修改成false 是單向操作,無法撤銷!】
?
PS:通過configurable和writable可以添加一個常量屬性。
?
#取消鏈接的href
? href="javacript:void(0);"
?
?
#XXXX
XXX
? ?XXX
XXX
?
#XXXX
XXX
? ?XXX
XXX
?
#XXXX
XXX
? ?XXX
XXX
?
#XXXX
XXX
? ?XXX
XXX
?
#XXXX
XXX
? ?XXX
XXX
?
#XXXX
XXX
? ?XXX
XXX
?
#XXXX
XXX
? ?XXX
XXX
?
?轉載于:https://www.cnblogs.com/dongfangchun/p/8995486.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: spring boot自定义配置文件
- 下一篇: mybatis(mapper映射文件)