js细枝末节(1)

(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

(20)严格模式
struct.PNG
(21)getBoundingClientRect
image.png
(22)load与domcontentloaded
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容