js基础

遍历

可枚举的(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属性列表
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容