一共有哪些数据类型
8种: null
,undefined
,boolean
,number
,string
,Object
,Symbol
,BigInt
Symbol 表示独一无二的值
Symbol
接收一个参数表示对Symbol
值的一种描述,const s1 = Symbol('foo')
,传入相同的参数,生成的
Symbol
也不同const s2 = Symbol.for('foo')
方法会检测上文中是否已存在相同参数创建的Symbol
,存在则返回该Symbol
,不存在则新建
最常见是在开源库内作为常量,比如用来自定义一个类型 比如 react源码内的 const REACT_ELEMENT = Symbol.for('react.element')
或者是作为开源库内的 对象属性, Object.keys
和Object.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()
返回 SymbolObject.keys()
非继承,可枚举Object.getOwnPropertyNames()
非继承,可枚举,不可枚举Reflect.ownKeys()
非继承,可枚举,不可枚举,Symbolfor ... 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,
上述两个方法都不能阻止异步任务的继续执行