(1)不同的浏览器有不同的滚轮事件。主要是有两种,onmousewheel(firefox不支持)和DOMMouseScroll(只有firefox支持)
if(document.addEventListener){
document.addEventListener('DOMMouseScroll',scrollFunc,false);
}//W3C firefox
window.onmousewheel=document.onmousewheel=scrollFunc;//IE/Opera/Chrome
(2)创建对象,并保持原型链
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用在什么地方; 如果是初学者,可能也一头雾水
1.阻止浏览器默认事件,如点击元素,阻止向上冒泡
2.判断表单填写错误时,阻止提交
3.满足条件时,跳出jq的eack遍历
(4)prototype中的一些细节
函数实例.__proto__ == 构造器.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();
在这个问题上,完全当了个白痴,竟然还觉得查找属性和方法,要先查找构造器函数,明明是先在对象实例上找属性和方法,如果没有,再通过__proto__去构造器.prototype上查找(在markdown上输下划线还要用 \ 转义)
(5)Array.protptype.sort()
对于数组元素为数字字符的,直接用sort()数字0-9内还好,两位以上就不适用了,因为会先将数字转换为字符串
(6) 使用reduce()实现二维数组的扁平化
<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 ]
(来源于张鑫旭大神博客)
另一种数组扁平化
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方法接受一个或多个数组,并且将数组元素附加到用来调用该方法的父数组的的内容的末尾。合并的数组作为新数组返回
(7)柯里化可是函数式编程中的一个技巧
(8)自执行函数中的变量提升
(9)循环中中的setTimeout()
for(var i = 0;i < 3;i++){
setTimeout(function(){
console.log(i);
},0);
console.log(i);
}
打印的结果是: 0 1 2 3 3 3
我还很奇怪为什么是333,确实循环结束的时候 i 的值为3,所以在还在等待执行的3个setTimeout函数都引用了现在的i
(当i = 2进行了比较后,i++了一次,所以当前为3,但是比较不成立了,循环结束)
如果循环外面还有循环,例如
for (var j = 0;j < 4;j++) {
console.log(j);
}
for (var k = 0;k < 4;++k) {
console.log(k);
}
setTimeout在最后面执行!!!
(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]); //会把数字转换为字符串
</script>
(11)ascii码的转换
很笨实现这么个效果
<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)用函数实现数组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)二维数组
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)关于函数名称
当你发现在最简单的情况下,函数也不能被绑定在标签上的事件触发,明明是没错的情况下,很有可能是与window对象的属性方法重名了,对于数组,对象,函数的命名都不能与window上的属性冲突
<input type="button" value="Dosomething" onclick="size()"/>
function size(){
alert(1);
}
还有close,name
要想随意写变量名,不用担心与window的属性冲突,可以用自执行函数进行包裹
(17)如果控制台提示某个选择器返回的结果是null,很有可能是因为domready的问题,切记切记,经验惨痛
(18)两种路径
require('./index.js') //相对路径
require('d:/web_project_all/node学习/index.js') //绝对路径
命令行使用的是反斜线,js文件使用的是斜线
(19)函数为全局变量取值
var boy;
function test(){
boy = 200;
}
test();
console.log(boy); //200
//函数必须被执行
function test(){
var boy = 200;
return function(){
return boy;
}
}
console.log(test()()); //可以通过函数返回值拿到boy
console.log(boy); //但是无法在全局进行访问
(20)前端路由的优缺点
优点:用户体验好,不需要每次从服务器拉取页面
缺点: 不利于SEO
使用浏览器的前进,后退会重新发起请求,没合理利用缓存
单页面无法记住滚轮滚动的位置