(1)不同的瀏覽器有不同的滾輪事件姥闭。主要是有兩種门怪,onmousewheel(firefox不支持)和DOMMouseScroll(只有firefox支持)
if(document.addEventListener){
document.addEventListener('DOMMouseScroll',scrollFunc,false);
}//W3C firefox
window.onmousewheel=document.onmousewheel=scrollFunc;//IE/Opera/Chrome
(2)創(chuàng)建對象酿傍,并保持原型鏈
var O = function(obj) {
function T() {}
T.prototype = obj;
return new T();
};
var obj = {name: 'obj', age: 0 },
obj1 = O(obj),
obj2 = O(obj1);
// 更改原型鏈的一處魄鸦,所有原型鏈都會更改
obj.name = 'superclass';
console.log(obj1.name); // 'superclass'
console.log(obj2.name); // 'superclass'
// 每一層可單獨處理
obj1.name = 100;
console.log(obj1.name); //100
delete obj1.name; //暴漏原型鏈
console.log(obj1.name); // 'superclass'
(來源于Rain Man博客)
(3)return false用在什么地方; 如果是初學(xué)者蠢熄,可能也一頭霧水
1.阻止瀏覽器默認(rèn)事件,如點擊元素,阻止向上冒泡
2.判斷表單填寫錯誤時碳竟,阻止提交
3.滿足條件時煤禽,跳出jq的eack遍歷
(4)prototype中的一些細(xì)節(jié)
函數(shù)實例.__proto__ == 構(gòu)造器.prototype
function phone(name){
//this.name = "mi";
this.name = name;
this.price = function(){
console.log("2000");
}
}
phone.prototype = {
name:"meizu",
price:function(){
console.log("2500");
}
}
var buy = new phone('mi');
console.log(buy.name);
buy.price();
在這個問題上丹诀,完全當(dāng)了個白癡,竟然還覺得查找屬性和方法枚荣,要先查找構(gòu)造器函數(shù),明明是先在對象實例上找屬性和方法蛮原,如果沒有笋籽,再通過__proto__去構(gòu)造器.prototype上查找(在markdown上輸下劃線還要用 \ 轉(zhuǎn)義)
(5)Array.protptype.sort()
對于數(shù)組元素為數(shù)字字符的,直接用sort()數(shù)字0-9內(nèi)還好,兩位以上就不適用了,因為會先將數(shù)字轉(zhuǎn)換為字符串
(6) 使用reduce()實現(xiàn)二維數(shù)組的扁平化
<script>
var matrix = [
[1,2],
[3,4],
[5,6],
];
var flatten = matrix.reduce(function(pre,cur){
return pre.concat(cur);
})
console.log(flatten); //Array [ 1, 2, 3, 4, 5, 6 ]
(來源于張鑫旭大神博客)
另一種數(shù)組扁平化
var arrprimary = new Array();
arrprimary[0] = new Array('one','two');
arrprimary[1] = new Array('three','four');
arrprimary[2] = new Array('five','six');
arrprimary[3] = new Array('seven','eight');
console.log(arrprimary[0].concat(arrprimary[1],arrprimary[2],arrprimary[3]));
Array對象concat方法接受一個或多個數(shù)組翰灾,并且將數(shù)組元素附加到用來調(diào)用該方法的父數(shù)組的的內(nèi)容的末尾侈沪。合并的數(shù)組作為新數(shù)組返回
(7)柯里化可是函數(shù)式編程中的一個技巧
(8)自執(zhí)行函數(shù)中的變量提升
(9)循環(huán)中中的setTimeout()
for(var i = 0;i < 3;i++){
setTimeout(function(){
console.log(i);
},0);
console.log(i);
}
打印的結(jié)果是: 0 1 2 3 3 3
我還很奇怪為什么是333,確實循環(huán)結(jié)束的時候 i 的值為3,所以在還在等待執(zhí)行的3個setTimeout函數(shù)都引用了現(xiàn)在的i
(當(dāng)i = 2進行了比較后,i++了一次歧沪,所以當(dāng)前為3,但是比較不成立了,循環(huán)結(jié)束)
如果循環(huán)外面還有循環(huán)应役,例如
for (var j = 0;j < 4;j++) {
console.log(j);
}
for (var k = 0;k < 4;++k) {
console.log(k);
}
setTimeout在最后面執(zhí)行!T锟辍箩祥!
(10)js中括號操作對象屬性
<script type="text/javascript">
var obj = {
somevalues:"hehe",
methods:function(){
alert("haha"); /*控制臺中會看到第二個為undefined
因為沒指定return*/
},
'8':"weidapao"
}
console.log(obj['some'+'values']); //拼接也是可以的
console.log(obj['methods']());
console.log(obj[2+6]); //會把數(shù)字轉(zhuǎn)換為字符串
</script>
(11)ascii碼的轉(zhuǎn)換
很笨實現(xiàn)這么個效果
<script>
var str1 ="",str2 = "";
for (var i = 97;i<=122;i++) {
if(i > 109){
str2 += String.fromCharCode(i);
}else{
str1 += String.fromCharCode(i);
}
}
console.log(str1);
console.log(str2);
/*abcdefghijklm
nopqrstuvwxyz
*/
(12)用函數(shù)實現(xiàn)數(shù)組push()
function PushToArr(arr,item){
arr[arr.length] = item;
return arr;
}
var array1 = [1,2,3];
var result = PushToArr(array1,8);
var result2 = PushToArr(array1,5);
var result3 = PushToArr(array1,7); //1,2,3,8,5,7
console.log(result3);
總感覺在哪本書上看過?
(13)[ ] == " " //true
(14)二維數(shù)組
var outarr = new Array(3);
for (var i = 0;i < outarr.length;i++){
outarr[i] = new Array(3);
}
outarr[0][0] = 1;
outarr[0][1] = 2;
outarr[0][2] = 3;
outarr[1][0] = 4;
outarr[1][1] = 5;
outarr[1][2] = 6;
outarr[2][0] = 7;
outarr[2][1] = 8;
outarr[2][2] = 9;
也可以使用字面量
(15)換個行
document.write("<br>");
(16)關(guān)于函數(shù)名稱
當(dāng)你發(fā)現(xiàn)在最簡單的情況下肆氓,函數(shù)也不能被綁定在標(biāo)簽上的事件觸發(fā)袍祖,明明是沒錯的情況下,很有可能是與window對象的屬性方法重名了,對于數(shù)組谢揪,對象蕉陋,函數(shù)的命名都不能與window上的屬性沖突
<input type="button" value="Dosomething" onclick="size()"/>
function size(){
alert(1);
}
還有close,name
要想隨意寫變量名,不用擔(dān)心與window的屬性沖突键耕,可以用自執(zhí)行函數(shù)進行包裹
(17)如果控制臺提示某個選擇器返回的結(jié)果是null寺滚,很有可能是因為domready的問題,切記切記屈雄,經(jīng)驗慘痛
(18)兩種路徑
require('./index.js') //相對路徑
require('d:/web_project_all/node學(xué)習(xí)/index.js') //絕對路徑
命令行使用的是反斜線,js文件使用的是斜線
(19)函數(shù)為全局變量取值
var boy;
function test(){
boy = 200;
}
test();
console.log(boy); //200
//函數(shù)必須被執(zhí)行
function test(){
var boy = 200;
return function(){
return boy;
}
}
console.log(test()()); //可以通過函數(shù)返回值拿到boy
console.log(boy); //但是無法在全局進行訪問
(20)前端路由的優(yōu)缺點
優(yōu)點:用戶體驗好官套,不需要每次從服務(wù)器拉取頁面
缺點: 不利于SEO
使用瀏覽器的前進酒奶,后退會重新發(fā)起請求蚁孔,沒合理利用緩存
單頁面無法記住滾輪滾動的位置