JS易用常用知识点攒集(陆续更新)

2017-12-28  本文已影响0人  木A木

由于JS中很多对象继承toString()被重写了,为了能正确调用toString()版本,必须间接调用Function.call()方法

    function classOf(o){
        if(o === null)  return 'Null';
        if(o === undefined) return 'Undefined';
        return Object.prototype.toString.call(o).slice(8,-1);
    }

测试一下:

    classOf({}); //==>"Object"
    classOf(''); //==>"String"
    classOf(2); //==>"Number"
    classOf([]); //==>"Array"
    classOf(null); //==>"Null"
    classOf(/./); //==>"Regexp"
    classOf(new Date()); //==>"Date"
    classOf(false) //==>"Boolean"

js必须牢记的6个蛋蛋: 请你一定要记住:在js逻辑运算中,0、""(空字符)、null、false、undefined、NaN都会判为false,其他都为true,这个一定要记住,不然应用 || 和 && 就会出现问题。

var a;
var b=!!a;

a默认是undefined。!a是true,!!a则是false,所以b的值是false,而不再是undefined,也非其它值,主要是为后续判断提供便利。
!!的作用是把一个其他类型的变量转成的bool类型。

var a = {b:a}  //=>由于var变量提升,在对a进行打印的时候 {b:undefined}
let a = {b:a} //=>let关键字不会造成变量提升,在这样去定义a变量的时候会报错 a is not defined

加上括号是执行的意思,添加事件的回调函数应该就是给相应的事件属性赋值,而很明显需要把一个函数赋值给这个事件属性,而不是函数的调用结果。所以在js中的绑定是直接赋值。
而在标签内的事件属性的值是由引号包裹的,代表的是当点击该元素时,执行引号内的代码,直接把引号内的代码拿出来跑,如果你不加括号,那就不会调用那个函数。

<a herf="javascript:;" onclick="fn" /> //=> ƒ fn(){console.log('test')}
<a herf="javascript:;" onclick="fn()" /> //=> test

funciton fn(){
  console.log('test')
}

这两个标签执行时相当于在相应的事件里执行eval("..."),第一个标签点击时等价于eval("fn"),输出函数fn的函数体ƒ fn(){console.log('test')},也就是说用户点击时并没有得到想要的结果;第二个标签点击时等价于eval("fn()"),输出test,可以得到目的结果,所以在html标签上的事件属性的值如果是要调用function就一定要加()来保证点击后可以得到目的结果。

~ 按位取反运算符

表达式 二进制值 结果
5 0000 0101 5
~5 1111 1010 -6

换算的过程如下:

步骤 数值 描述
0000 0101
按位取反 1111 1010 发现最高位是1,代表符号-负数
除符号位外按位取反 1000 0101
末位加1求其补码 +             1
结果 1000 0110 转换成十进制为-6
上一篇 下一篇

猜你喜欢

热点阅读