JS笔记(长期更新的js杂七杂八)

阅读更多

1.使用window.crypto.getRandomValues方法生成随机数组

crypto.getRandomValues接受一个参数typedArray,typedArray的值可以是如下对象的实例:

Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array

 

例如要生成6个0~256的随机整数组成的数组可以这样做:

var array = new Uint8Array(6);
window.crypto.getRandomValues(array);

2.使用字面量重写构造函数prototype属性时constructor指向问题的解决

function Demo(){}
Demo.prototype={}
var pp=new Demo;
pp.constructor;//Object.....(我们期望的值是Demo,但是由于pp.__proto__.__proto__.constructor是Object,最终使得此处为Object)

//解决办法,使用Object.defineProperty为构造函数的prototype手动添加constructor属性并指向Demo
Object.defineProperty(Demo.prototype,"constructor",{
 value:Demo,
 enumerable:false //因为默认是可枚举的,所以此处必须设置
});
Demo.prototype.propertyIsEnumerable("constructor");//false
//如果不设置enumerable像下面这样
Demo.prototype.constructor=Demo;
//那么constructor是可以被枚举的
Demo.prototype.propertyIsEnumerable("constructor");//true
//测试
var ii=new Demo;
ii.constructor;//Demo

 3.两个变量A和B交换值的3种方法:

  1. 使用中间变量C
    C=A; A=B; B=C;
  2. 使用加减法运算(数值)
    A=A+B; B=A-B; A=A-B;
  3. 使用异或运算(数值)
    A=A^B; B=A^B; A=A^B;

4.一个有关函数作用域与全局变量赋值的问题

    var addCount;

    function rr() {
        var count = 0;
        addCount = function () {
            count++;
        }

        function r2() {
            console.log(count);
        }
        return r2;
    }
    var res1 = rr();
    var res2 = rr();
    addCount();

    res1(); //0
    res2(); //1

   分析:

       为什么第一次执行res1输出0,而第二次是1;

       此处的关键在于addCount变量,它是一个全局变量,只有一个;

       当对res1赋值成功时,addCount被赋值成功,但是,当res2被赋值成功时,addCount又被重新赋值,所以最终addCount是在res2里面被赋值成功的,也在res2里面形成了闭包,而与res1已经断了关系;

      理解了上面这个,那么下面的这种情况也就不难理解了,和上面是同样的道理:

    var addCount;

    function rr() {
        var count = 0;
        addCount = function () {
            count++;
        }

        function r2() {
            console.log(count);
        }
        return r2;
    }
    var res1 = rr();
    addCount();
    addCount();
    var res2 = rr();
    addCount();
    var res3 = rr();
    addCount();

    res1(); //2
    res2(); //1
    res3(); //1

 5.文字超出部分显示省略号

.text {
 text-overflow: ellipsis;
 white-space: nowrap; 
 overflow: hidden;
}

 6.关于parseInt方法的一个需要注意的地方

["1","2","3"].map(parseInt);//[1,NaN,NaN]

  这里稍不注意就会以为是输出[1,2,3],而忽略了parseInt其实是可以有两个参数的,所以实际执行的时候应该是这样的:

//会将item和index两个参数都传入进去,因为对于parseInt来说这样是允许的
parseInt("1",0);
parseInt("2",1);
parseInt("3",2); 

如果换成诸如Number或parseFloat这种只允许一个参数的方法则是正常的

7.永久修改npm源

#编辑文件~/.npmrc(如果没有此文件,创建即可)
vi ~/.npmrc
#在文件中加入以下配置
registry = https://registry.npm.taobao.org
#保存退出
#使用命令npm config list查看是否生效

 8.含中文的字符串验证小例子

//限制字节长度
function navigatorId(id){
   //双字节字符(这里只匹配了中文)都换成两个a字母
   var newId=id.replace(/[\u4e00-\u9fa5]/g,"aa");
   return /^\w{0,20}$/.test(newId);
}

 9.mouseout和mousemove的事件冒泡带来的问题,解决方法

结合mouseenter和mouseleave来做,或者直接代替

10.去掉页面滚动条

 

/***两个方向都隐藏****/
html{
  overflow:hidden;
}
/***隐藏垂直方向滚动条****/
html{
  overflow-y:hidden;
}
/***隐藏水平方向滚动条****/
html{
  overflow-x:hidden;
}

 11.只用css实现div盒子高度根据父容器宽度的变化自适应

 

 #box{
    width:25%;//会相对于父容器
    height:0;
    padding-bottom:25%;//会相对于父容器
}
/**** box里面可以放任意的东西 ****/

 

 12.ElementObj.getBoundingClientRect()

    其中包含某个元素相对于视窗的位置集合,集合中有top, right, bottom, left等属性,兼容IE6

 

var box=document.getElementById('box');         // 获取某个元素

box.getBoundingClientRect().top;         // 元素上边距离页面上边的距离

box.getBoundingClientRect().right;       // 元素右边距离页面左边的距离

box.getBoundingClientRect().bottom;      // 元素下边距离页面上边的距离

box.getBoundingClientRect().left;        // 元素左边距离页面左边的距离

 13.字符串比较

 

a.localeCompare(b);//1或-1

 

 14.通过ele或document获取window

var doc = ele.ownerDocument;
var win = doc.defaultView;

 

你可能感兴趣的:(javascript,web,html,css)