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属性列表

相关文章

  • React-Native 随笔

    学习基础: js的基础知识, rect.js基础 JSX语法基础 FlexBox布局 安装 安装node.js下载...

  • 最新web前端相关课程学习链接

    js基础篇 js进阶篇 js高级篇 vue基础篇 vue高级篇 react基础 react高级 Nodejs基础 ...

  • web前端 -- Day23 js高级

    js基础 JavaScript简称:JS JS分三个部分: ECMAScript标准---基础的语法 DOM D...

  • 前端JavaScript面试技巧

    1-1 课程概述 要做什么?——讲解前端 JS 基础面试题 哪些部分?——JS 基础,JS-WEB-API,JS ...

  • 4/07day28_js基础

    day28_js基础 回顾 JS基础语法 JS运算符 JS流程控制语句 条件语句 JS的条件语句和Java语法基本...

  • 2018-12-20

    1.01.尚硅谷_JS基础_JS简介(1) 10.10.尚硅谷_JS基础_Null和Undefined(10) 1...

  • JS基础和WebAPIs的关联性

    学习ECMAscript标准规定的基本语法掌握JS基础语法只学习JS基础做不了网页交互效果学习JS基础语法是为了后...

  • 2019-07-27 前端面试题

    1.js的基础类型 js的基础类型包括 Undefined , Null , String ,Number ,...

  • 网络编程(十九) JavaScript(9)

    一、 JS的组成 1.1 JS基础阶段以及Web APIs阶段 【1】JS基础阶段 我们学习的生死ECMAScri...

  • 发现•分享—2019-01-17

    文章 JS JS 异步编程六种方案 JS基础—原型对象的那些事(一) JS基础—原型对象的那些事(二) CSS 综...

网友评论

      本文标题:js基础

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