js基础

作者: 看到这朵小fa了么 | 来源:发表于2020-03-31 23:24 被阅读0次

    遍历

    可枚举的(enumerable:true),基本类型没有可枚举属性,一般来说原型上的属性是不可枚举的(JSON.stringify()返回的是可枚举属性)
    forEach 基于普通for循环 无法结合break return; 无法初始化索引;无法对数组增删、
    遍历:

    • for...in:遍历对象的每一个可枚举属性,包括原型链上面的可枚举属性;
    • Object.keys():只遍历自身的可枚举属性,不可以遍历原型链上的可枚举属性;
    • hasownproperty() 返回自身的所有属性,用于区分属性是否在实例或原型上;
    • getOwnPropertyNames():遍历自身所有属性(不论是否是可枚举的),不包括原型链。

    for in 和for of的区别:for in是遍历的是原型和自身的可枚举属性,一般用于对象的遍历,遍历出key,有时按照索引的顺序,所以不用于数组的遍历;for of用于具有迭代器属性的对象遍历,常用于遍历数组,遍历对象的话需要结合Object.keys()

    for(var key of Object.keys(student)){
        //使用Object.keys()方法获取对象key的数组
        console.log(key+": "+student[key]);
    }
    
    

    JSON.parse进行深拷贝的缺点:通过转化字符串进行还原,里面的Function、undefined 空对象会丢失,对原型的引用会丢失,对RexExp、typeError对象会返回空对象;NaN、Infinity和-Infinity会变成null;对于循环引用会以$ref标记

    日期转换

    1、new Date('2020/02/02').getTime()
    2、new Date(1580572800000).toDateString()

    字符串相关方法

    indexOf() 查找 接受第二个参数为起始位置 返回出现的位置或-1
    search() 一个参数 接受正则表达式进行查找 但是会忽略-g全局查找 忽略lastIndex 总是从第一个开始查找
    slice() 字符串切割 负数+长度处理
    substring() 同上不接受负值 0处理
    substr() 第二个参数为截取长度 负数+长度处理
    String() 对于null undefined返回他们的字符串格式"null" "undefined"

    js精度的问题

    js使用了IEEE754双精度浮点数的规范,共有64位第一个是符号位S,中间11位M是指数位([-1074, 971]),最后52位E是尾数位(还有一位是隐藏位),精确整数为Math.pow(2,53)-1 超出这个范围则会丢失精度,在计算中将舍弃离结果远的、同样距离则舍弃末位为奇数的数

    // 能精确表示的尾数范围上限,S为1个0,E为11个0,M为52个1

    • Math.pow(2, 53) - 1 === Number.MAX_SAFE_INTEGER // true
      // 能精确表示的尾数范围下限,S为1个1,E为11个0,M为52个1
    • -(Math.pow(2, 53) - 1) === Number.MIN_SAFE_INTEGER // true
      // 能表示的最大数字,S为1个0,E为971,M为52个1
    • (Math.pow(2, 53) - 1) * Math.pow(2, 971) === Number.MAX_VALUE // true
      // 能表示的最接近于0的正数,S为1个0,E为-1074,M为1
    • Math.pow(2, -1074) === Number.MIN_VALUE // true

    二进制移动 >>无符号右移,保留符号位;>>>有符号右移,以符号位填充补位,且负数在计算机中以其绝对值的二进制的补码标示(补码=反码+1),所以有符号的右移将会使数字变大。

    js中二进制浮点数0.1+0.2 = 0.3....

    js存储是通过转化为二进制进行处理,64 位双精度浮点数的小数部分最多支持53位二进制位,由于浮点数的精度限制,浮点数小数位的限制而截断的二进制数字,再转换为十进制。
    解决方案:Number.EPSILON可以用来设置“能够接受的误差范围”。比如,误差范围设为 2 的-50 次方(即Number.EPSILON * Math.pow(2, 2)),即如果两个浮点数的差小于这个值,我们就认为这两个浮点数相等。

    Number类型转化

    • Number() 会识别基数(8进制es5后不识别),空字符串返回0,null返回0,true返回1, false返回0,undefined或包含非数字类型值返回NaN
    • parseInt() 会识别基数,识别开头的数字截取,忽略小数点,空字符串或非字符串(true false null undefined)返回NaN
    • parseFloat() 无基数,识别开头数字加一位小数点,空字符串或非字符串返回NaN
    • +操作符跟Number转化同理,-操作符也是 最终转化为负值

    在页面中选中一段文字

    var oBtn = document.getElementById("button");
    oBtn.onclick = function() {
        var userSelection;
        if (window.getSelection) { //现代浏览器
            userSelection = window.getSelection();
        } else if (document.selection) { //IE浏览器 考虑到Opera,应该放在后面
            userSelection = document.selection.createRange();
        }
        if (userSelection.getRangeAt) {
            alert(userSelection.getRangeAt(0));
        } else {
            alert("当前浏览器不支持getRangeAt");
        }
    };
    

    函数

    • 函数传参,之所以我们可以传任意的参数而不被限制,是由于函数接受参数时是接受的arguments类数组结构,在非严格模式下,命名传参和arguments的参数会保持同步,即使实际上他们并不是指向同一个地址;在严格模式下则不允许修改arguments数值,代码将不会被执行
    • 使用var声明变量会被添加到最近的作用域中,这里是指函数作用域或者全局作用域,如果忘记使用var声明,则会被挂到全局,每次进入一个执行环境就创建一个作用域链,用于查找变量和内存回收
    • 垃圾清除:
      1、标记清除,原理在于,进入一个环境添加标记,出环境则取消标记,给所有内存中的变量添加标记,给所有在环境当中以及被环境引用的变量翻转标记,剩下的则是需要被清除的变量
      2、引用计数,原理在于,对于引用对象,被引用一次则标记为1,又被引用标记为2,引用它的指针指向了别人则引用标记-1,当引用为0时意味着它无法被获取,可以被清除,为了避免循环引用我们需要将对象置空

    Number Boolean String

    使用构造函数创造出来的基本对象,会返回构造出来的实例,typeof为object,Boolean转化为true


    image.png

    数字

    toFiexed() 指定小数位
    toExponential()指定数字和指数位
    toPercision() 指定数字位

    字符串

    slice() 所有负值都与length想加
    substr() 第一个负值与length想加,第二个负数转为0
    substring() 所有负数转为0

    属性标识

    特性只能设置和获取当前实例对象,常规定义的对象属性,初始属性为true,可写writable 可读enumerable 可配置configurable,修改属性标识用Object.defineProperty(),使用该方法时不填写属性标识默认为false

    • configurable 不可配置 标识不可修改读写 配置三个属性,且不能修改访问器属性,不可逆
    let name = {age: 12}
    let descriptor = Object.getOwnPropertyDescriptor(name, 'age')
    descriptor // {value: 12, writable: true, enumerable: true, configurable: true}
    Object.defineProperty(obj, propertyName, descriptor) 
    Object.defineProperties(obj, {})  // 支持多属性
    

    访问器属性

    与普通属性不同,访问器属性拥有getter setter enumerable configurable 属性标识,通过getter setter来实现属性的获取和设置,一个属性只能为两种属性其一,通过访问器属性可以控制,其中set和get可以只设置一个,未设置则无效

    • Object.keys() 获取对象自身可枚举属性,不包括Symbol属性
    • Object.ownKeys() 获取对象自身的所有属性,包括Symbol属性
    • Object.getOwnPropertyNames() 获取自身的所有属性,不包括Symbol属性
    • Object.getOwnPropertySymbols() 获取自身的Symbol属性列表

    相关文章

      网友评论

          本文标题:js基础

          本文链接:https://www.haomeiwen.com/subject/bnrnuhtx.html