(2)onmouseenter与onmouseover的区别
onmouseover与onmouseenter 事件在鼠标指针进入 div 元素时都会触发,唯一的区别是 onmouseenter 事件不支持冒泡 ,作用在子元素上时不会触发
- onmouseover对应onmouseout
- onmouseenter对应onmouseleave
(4)正则去字符串两边空格
function totrim(str){
return str.replace(/(^\s*)|(\s*$)/g,"");
}
String.prototype.trim = function(){
return this.replace(/(^\s*)|(\s*$)/g,"");
} //为字符串原型上添加trim方法去除两端空格
var des = " cool ";
var end = "haha";
var start = "mynameis";
var connect = start + des + end;
console.log(connect); //mynameis cool haha
var connect1 = start + totrim(des) + end;
console.log(connect1); //mynameiscoolhaha
一定要加上g,不然只会去掉字符串前面的空格,进行全局匹配
(7)原始值:布尔,数字,字符串,null,undefined
原始值与复杂值(对象)的区别是每个对象有唯一的标识
var obj = {name:"weiwei"};
var obj2 = {name:"weiwei"};
console.log(obj === obj2); //false
原始值的属性不能被改变,添加移除
var str1 = "wei";
str1.length = 1;
console.log(str1.length); //3
(8)特殊的变量arguments
function params(){ return arguments};
var args = params('w','e','i');
args.length //3
args[2] //'i'
(9)将arguments转换为数组
function get_args(){
return toArray(arguments);
}
function toArray(likeArray){
return Array.prototype.slice.call(likeArray); //slice?
}
console.log(get_args('wei','da','pao','haha'));
//Array [ "wei", "da", "pao", "haha" ]
(11)map和parseInt的坑
console.log([1,2,3].map(parseInt)) //Array [ 1, NaN, NaN ]
parseInt接收两个参数,第一个是需要转换的值,第二个是参数参考的进制
任何数的零进制表示这个数本身,高于进制位所能表示的最大值数返回NaN(not a number),例如2的一进制返回NaN,因为一进制只能表示0和1
map方法里面接收一个函数,函数可以有三个参数,第一个参数是需要遍历的值,第二个参数是索引,第三个数组本身,
因此可以理解为
parseInt('1',0); //1
parseInt('2',1); //NaN
parseInt('3',2); //NaN
但是有一些情况会非常难受
console.log(parseInt(10,9)); //9
console.log(parseInt(15,14)); //19
parseInt(15,14); 将15拆成1加5,1的十四进值是14,而5表示5,14+5=19
(14)对象方法中的函数,导致的this丢失问题
var people = {
name:"bang",
classmates:['joe','john','flank'],
count:function(){
this.classmates.forEach(function(value){
console.log(this.name + " say hello to " + value);
},this)
}
}
people.count();
//bangsay hello to joe
//bangsay hello to john
//bangsay hello to flank
嵌套函数内部不能去访问方法中的this变量
var girl = {
face:"beauty",
assess:function(){
var that = this;
return function(){
console.log('girl is '+ that.face);
}
}
}
girl.assess()();
Array.prototype.forEach(callback(currentValue, index, array){
// do something
}[,thisArg]);
(16)有权访问另一个函数作用域内变量的函数都是闭包
定义在一个函数内部的函数
闭包最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
(17)闭包一个
<script>
var myarr = [];
for(var i = 0;i < 7;i++){
myarr.push(console.log.bind(null,i));
}
myarr[0](); //0
myarr[2](); //2
/*****************************/
var myarr1 = [];
for(let j = 0;j < 7;j++){
myarr1.push(function(){
console.log(j);
})
}
myarr1[2](); //2
myarr1[5](); //5
</script>
还没搞懂为什么用let和bind()
(19)Array.isArray([])
鲜为人知的事实:其实 Array.prototype 也是一个数组。
Array.isArray(Array.prototype) // true