js小知识

274 阅读6分钟

概念

    1、基本数据类型 (值类型) 
        string number boolean null undefined 
       引用数据类型
        {} [] function 正则  Date ...  

        基本数据类型操作值,引用数据类型操作地址
    
    2、typeof    Object.prototype.toString.call()  constructor  instanceof 
        typeof --一般用于检测解基本数据类型
        Object.prototype.toString.call() --
    
    3、 var let const 
        var 可以重复声明
        let const 都是不可以重复声明
    
    4、parseFloat  从左向右查看,只要碰到非数字即停,若首个字符就是非数字,结果就是NaN
        NaN == NaN //  自己跟自己都不相等
        isNaN   先用Number把xx强制转换为数字类型,然后再判断 
    
    5、for循环中的 
        continue 结束本次循环,接着进行下一次循环
        break  结束整个循环,有点类似于函数中的return;

    6、向数组末尾添加数据
        ary.push(100);
            ary.splice(n,m,x,y,z...) //从索引n,删除m个,用x y z ... 替换删除的m项;
            ary.splice(ary.length-1,0,100) //这么写是在最后一项的前面添加了100这个数
        ary.splice(ary.length,0,100)  //所以要写length
        ary[ary.length] = 100;

    7、排序 sort sort返回值 是  改变后  的   原有   数组 :因为它按unicode编码排序,所以不传参数时只能排10以内的数字
       reverse 反转  返回值 是  改变后  的   原有   数组 
        sort 排序
        ary.sort((a,b) => a-b) //升序
        ary.sort((a,b) => b-a) //降序

    8、返回一个新的数组
        第n项 索引 : n-1
       第m项  索引:m-1
       ary.slice(n-1,m)
       ary.slice() --> 复制一个新数组
       ary.slice(0) -->复制一个新数组  ary.slice(n)//从索引n拷贝到最后一项,包含最后一项
    
    9、replace 的用法
        let time = '2017-10-20';
        time.replace(/-/g,'/') //正则
        time.replace('-',/).replace('-',/)
    
    10、
        Math.round(Math.random()*91+2)

        //数组中的最大值  //1 先排序,再取值  2 假设法  3 扩展运算符
        Math.max(...ary)
    
    11、不是字符串的和undefined相加都是NaN 
        字符串和任何别的相加都是字符串
        - * / % 先用Number把符号两边的内容转成数字,然后再进行运算
        ! 
    
    12、三元运算符  条件?条件成立执行的代码:条件不成立执行的代码
        三元运算符是有返回值的,返回值就是执行代码后的结果

        0 NaN '' null undefined :这五个转成布尔值是 false 其他全是true
    
    13、获取dom元素
        document.getElementById('id名')
        document.getElementsByClassName('box')[0]
        document.querySelector('#box')
        document.querySelectorAll('.box')[0]
    
    14、
        document.body  获取body元素
        var oDiv = document.createElement('div');
        oDiv.className = 'box';
        oDiv.innerHTML = '好好学习 天天向上';
        document.body.appendChild(oDiv);
    
    15、 
        b['n']  等价于 b.n
        b[n]  这里的n是个变量,需要给变量赋值
    
    16、数据类型的比较
        []  == []  //引用数据类型和引用数据类型的比较,永远是比较地址
        ![]  == []  //  false == []  都转换成数字, -->  0 == 0  
        '' == []  //true 字符串和引用数据类型比较的时候,我们把  引用数据类型   使用toString转成   字符串 ,然后再进行比较
        1 == [1]  //true   数字和引用数据类型进行比较,我们把   引用数据类型  先用toString转成字符串  再用Number转成   数字   ,然后再进行比较
    
    17、定时器
        var timer = setTimeout //只执行一次
        setInterval //不停的执行
        clearTimeout()
        clearInterval()
        怎么结合setTimeout和递归实现 setInterval
    
    19、复制数组
        ary.slice()
        ary.slice(0)
        ary.concat([])
        for 
        forEach
        ary.map(...ary)  ary.map(a => a)

        //虽然forEach map 不改变原有数组,但是如果数组中的数据是引用数据类型,那么数组中的每一项都指向一个地址,当改变每一项时,就会改变地址中的东西,也就改变得了原有数组
    
    20、 ||  &&
        a || b  前边成立给前边  前边不成立给后边
        a && b  前边成立给后边  前边不成立给前边
    
*/

function getType (a) {
    var str = Object.prototype.toString.call(a); //获取数据类型字符串
    //再从字符串中,截取我们要的字符串
    var str2 = str.slice(8,str.length - 1);//首字母都是大写,需要变成小写
    return str2.toLowerCase();
}
getType ('');  //如果不传实参,形参默认是undefined,所以输出的就是undefined

function myIsNaN (n) {
    var m = Number(n); //先用number强制转换为数字类型,
    if (m + '' === 'NaN') {  //将m 转为字符串类型,与字符串包裹的NaN 全等比较
        return true
    }
    return false;//return 有打断函数执行的特点,所以我们这里没写else
}

// function f() {
//     console.log(666);
//     setTimeout(() =>f(),1000);
// }
// f() //用setTimeout和递归实现setInterval 

var a = [1,2,3,4,5,6]
let c = a.map((item,index) => {return index = 3})
console.log(c); //  [3,3,3,3,3,3]  

/*
    1、不定项求和

*/
function sum () {
    //arguments   实参集合
    var total = 0;
    for (var i = 0; i < arguments.length; i++) {
        var temp = arguments[i];
        // if (!isNaN(temp)) {
        //     //转换为数字,不是NaN的项,才能够被累加
        if (typeof temp === 'number' && !isNaN(temp)) {
            //必须是个数字,而且还不能是NaN
            total += temp;
        }
    }
    return total
}
let total = sum (10,20,'30','珠峰','40');
console.log(total);

/*
  获取url上的参数
*/
function queryURLParameter (url) {
    //先用?把字符串切成两部分,前一部分不要,后一部分要,索引是1
    var atr = url.split('?')[1];
    var ary = str.split('#');
    var hash = ary[1];
    var str2 = ary[0];
    var ary2 = str2.split('&');
    var obj = {};
    ary2.forEach(item =>{
        var a = item.split('=');
        obj[a[0]] = a[1];
    })
    obj.HASH = hash;
    return obj;
}

/*
  验证码:考点  随机  元素的操作
  //先有一个大的字符串,里面包含大小写字母 和数字   62个字符;
  //随机数的范围是 0-61  把获取到的数字当作大字符串的索引用
  //之后再字符串拼接 
  //把拼接好的字符串显示到页面上
*/
function getStr () {
    var str = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789';
    //Math.round(Math.random()*61)
    var s = '';
    while (s.length <4) {
        // debugger;
        var n = Math.round(Math.random()*61);
        if (s.indexof(str[n] == -1)) {
            s += str[n];
        }
    }
    // for (var i = 0; i < 4) {
    //     var n = Math.round(Math.random()*61);
    //     if (s.indexof(str[n] == -1)) {
    //         s += str[n];
    //         i++
    //     }
    // }
    return s
}
var oDiv = document.getElementById('box');
oDiv.onclick = function () {
    oDiv.innerText = getStr();
}
console.log(getStr());

/*
    隔行变色
*/
        var oLis = document.getElementsByTagName('li');
    for (var i = 0; i < oLis.length; i++) {
        var str = i%2 ? 'salmon' : 'seagreen';
        oLis[i].myIndex = i;
        oLis[i].style.background = str;
        oLis[i].mybg = str
        oLis[i].onmouseenter = function () {
            this.style.background = 'gold';
        }
        oLis[i].onmouseleave = function () {
            this.style.background = this.mybg;
        }
        oLis[i].onclick = function () {
            alert(`我是第${this.myIndex+1}个元素`)
        }
    }

git

    svn git  都是版本管理器
    svn 属于集中式的管理 所有版本都在中央服务器上存储
    git 属于分布式管理  每一个电脑都有所有的对应版本

    git的相关命令

    git 把仓库分成了三个区    工作区   暂存区(缓存区)   历史区   
        平时的编写代码都是在  工作区  进行的

    git init  :把本地的一个文件夹  初始化成 一个 git  仓库

    git status :查看当前的仓库状态  (工作区)   
                红色代表当前工作区的修改
                绿色代表工作区的修改已经被提交到了暂存区
    
    git add   可以写 文件名 但是 一般都写成  git add .  这个.代表所有的文件  这个命令代表把所有工作区的修改都提交到了暂存区

    git commit -m '备注'    把  缓存区  的内容提交到  历史区  备注是是字符串,单引号,双引号都可以

    git 工具的三个远程服务器   :  gitHub  gitLab 码云     ; 工作中基本都是gitLab
    
    git push  : 把本机的历史区代码提交到远程仓库
    初次提交时,需要执行 git push --set-upstream origin master  (会提示给你)

    把本地仓库和远程仓库建立链接  : git remote add  桥梁名 远程仓库地址  ;  桥梁名一般默认 origin 

    git config --list :查看本机的git信息

    git config --global user.name '用户名'  初始化本机的 git 用户名
    git config --global user.email '用户邮箱'  初始化本机的 git 邮箱

    以下三个常用
    git add .                把工作区内容提交到缓存区
    git commit -m '备注'     把缓存区内容提交到历史区
    git                      push 把历史区的内容提交到远程仓库

    git clone 别人的仓库地址   :把别人的仓库复制 (克隆) 一份到自己的电脑

    git pull :把远程仓库里的内容更新到本地