undefind,string,number,boolean,function,object
特别说明的是对象, 数组, null 都是 object(函数虽是引用类型, 但能识别), 因为 typeof 没法区分引用类型
何时使用'==='何时使用'=='
双等会自动强制转换, 有风险.
jQuery 源码中推荐使用三等, 我个人也是这么写的. 双等可用于判断布尔值
JS 变量按照存储方式区分为那些类型, 并描述其特点
值类型
引用类型
如何判断一个变量是数组类型
可以用 instanceof 关键字
举个栗子:
- var arr = []
- consoe.log(arr instanceof Array) //true
写一个继承的例子
- // 构造函数方式
- function Animal { this.name = 'pig' }
- function Animal2 { Animal.call(this); this.age = 18 }
- console.log(new Animal2())
- // 缺点: 无法继承 Animal 的原型对象
- // 原型链方式
- function Animal { this.name = 'pig' }
- function Animal2 { this.age = 18 }
- Animal2.prototype = new Animal();
- console.log(new Animal2())
- // 缺点: 实际上是共享, 修改原型对象里的内容, 其它继承的类也会同步修改
- // 组合方式
- function Animal { this.name = 'pig' }
- function Animal2 { Animal.call(this); this.age = 18 }
- Animal2.prototype = Animal.prototype;
- console.log(new Animal2())
- // 缺点: 由于引用同一个原型对象, 无法区分对象是由谁实例化的
- // 最终方式
- function Animal { this.name = 'pig' }
- function Animal2 { Animal.call(this); this.age = 18 }
- Animal2.prototype = Obiect.create(Animal.prototype);
- Animal2.prototype.constructor = Animal2;
- console.log(new Animal2())
- // 解释: 通过创建新的对象, 不再是同一个, 再指定构造函数属性为自己
创建对象的几种方式
字面量
object 对象
构造函数
object create
描述 new 一个对象的过程
创建空对象, 并继承原型对象
执行构造函数, this 指向这个空对象
如果返回值是 object 则返回新对象, 否则返回 object
你对变量提升的理解
在执行代码时, 变量和函数的声明会被提升到作用域的顶部(此时变量的值为 undefined)
如果是全局, 会被提升到脚本的最前面
如果是函数内, 会被提升到函数内最前面, this 也是
PS: 注意函数表达式 (匿名函数) 的情况
说明 this 几种不同的使用场景
作为构造函数执行
作为对象属性执行
作为普通函数执行
call apply bind
创建 10 个 a 标签, 点击弹出对应序号
- for(var i=0;i<10;i++){
- (function(i){
- var a = document.createElement('a');
- a.innerhtml=i+'<br>';
- a.onclick=function(e){
- e.preventDefault();
- alert(i)
- }
- document.body.appendChild(a)
- })(i)
- }
如何理解作用域
只有函数作用域和全局作用域, ES6 中新增块级作用域那是后话
函数外声明的变量为全局作用域, 函数内可以使用
函数内声明的变量为函数作用域, 函数外不可以使用
作用域链: 一个自由变量一直往上寻找 (定义时的) 父级作用域内的变量的过程.
自由变量: 当前作用域没有定义的变量
补充: 花括号内声明的变量为块级作用域, 只能内部使用, 减少全局污染
实际开发中闭包的应用
闭包: 用一个函数去访问另一个函数内的内部变量的方式
使用场景: 函数作为返回值. 函数作为参数传递
同步和异步的区别?
同步会阻塞代码执行, 异步不会
前端使用异步的场景?
定时任务: setTimeout setInverval
网络请求: ajax 请求, 动态加载
事件绑定
JS 运行机制
单线程;
任务队列;
event loop 事件循环;
进程和线程
进程: 正在运行的应用程序, 是应用程序的一个运行环境
线程: 用于执行代码
获取随机数, 要求是长度一致的字符串格式
- var random = Math.random();
- var random = random+'00000000';
- var random = random.slice(0,10);
写一个能遍历对象和数组的通用 forEach 函数
- function foreach(obj,fn){
- var key;
- if(obj instanceof Array){
- obj.forEach(function(item,index){
- fn(index,item)
- })
- }else{
- for(key in obj){
- fn(key,obj[key])
- }
- }
- }
JavaScript 中如何获取当前的时间戳
- Date.now()
- new Date().getTime()
- new Date()
来源: https://www.thinksaas.cn/group/topic/839578/