阅读杂记JS


一共有哪些数据类型

8种: nullundefinedbooleannumberstringObjectSymbolBigInt

Symbol 表示独一无二的值

  1. Symbol 接收一个参数表示对Symbol值的一种描述,const s1 = Symbol('foo')

  2. 传入相同的参数,生成的Symbol也不同

  3. const s2 = Symbol.for('foo')方法会检测上文中是否已存在相同参数创建的Symbol,存在则返回该Symbol,不存在则新建

最常见是在开源库内作为常量,比如用来自定义一个类型 比如 react源码内的 const REACT_ELEMENT = Symbol.for('react.element')

或者是作为开源库内的 对象属性, Object.keysObject.getOwnPropertyNames 均不会返回Symbol

Object.getOwnPropertySymbols可以返回对象所有Symbol属性

BigInt 用来表示大于 2^53-1 的整数

BigInt 真没怎么用过,只知道是用来表示 大于 2^53-1 的数的,末尾加n就行

JS所有数字均以 双精度64位浮点格式 表示.

null 和 undefined区别

null 表示值就是空,如原型链的终点

undefined 表示尚未被赋值,却尝试读取,如变量声明,函数无返回值

如何判断数据类型

typeof instanceof toString

typeof 能判断8种基本类型 function

typeof 能判断8种基本类型,及function类型,Object的衍生类型都只能返回object(全部小写字符串)

instanceof 能判断 实例 的 对象类型

instanceof 能判断实例的对象类型,不能判断8种基本数据类型,原理是顺着原型链找,也就是prototype

console.log(people1 instanceof People); // true

Object.prototype.toString.call() 能判断所有内置类型

Object.prototype.toString.call([]); // [object Array](类型首字母大写)

const Xxx = {}
Object.defineProperty(Xxx, Symbol.toStringTag, { value: 'Xxx' })
Object.prototype.toString.call(Xxx); // [object Xxx]
Xxx.toString() // [object Xxx]

如何判断变量为数组

const arr = []
Array.isArray(arr); // true
arr.__proto__ === Array.prototype; // true
arr instanceof Array; // true
Object.prototype.toString.call([]).slice(8,-1) === 'Array' // true

如何遍历对象属性

for/in返回 原型链属性,仅 Reflect.ownKeys()返回 Symbol
Object.keys() 非继承,可枚举
Object.getOwnPropertyNames() 非继承,可枚举,不可枚举
Reflect.ownKeys() 非继承,可枚举,不可枚举,Symbol
for ... in ... 继承,可枚举

不可枚举: 在Object.defineProperty()方法中 enumerable 键值默认为 false

js的内置方法和属性几乎都不可枚举

如何判断两个对象是否相等

=== 与 == 的区别 : == 类型不同时会发生类型的自动转换,转换为相同的类型后再做比较

事件循环/宏任务和微任务

异步的一些 API,比如 setTimeout,setInterval,requestIdleCallback 和 requestAnimationFrame 还有 Promise,这几个有什么区别?

浏览器和node的

什么是闭包

导致js里this指向混乱的原因是什么?

0.1 + 0.2 !== 0.3,如何解决

写一个发布订阅模型

如何定位哪行js代码导致了页面刷新?

0.1 + 0.2 是否等于 0.3,如何解决?

数组的 sort 默认是按什么排序的?使用的什么算法?

如何终止JS程序的执行

JS由于其特殊的 JS运行机制 事件循环机制 ,没有设置exit函数,

但是存在中断函数运行的方法,

可以将整个脚本包裹为自执行函数,再 throw 或 return,

上述两个方法都不能阻止异步任务的继续执行

如何优化一个网站的性能

如何在前一个页面对下一个页面进行优化

JS常见手写

原型-作用域-this

Promise题

call-apply-bind-new


文章作者: 罗紫宇
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 罗紫宇 !
  目录