总结一些 js 函数原理,手写
JavaScript
是什么
- 脚本编程语言
- 弱类型语言
变量可以被隐式转换成另一个类型。- 二元运算
+
会把两个操作数转换成字符串,除非两个操作数都是数字类型 - 二元操作符
-
会把两个操作数转换成数字类型 - 操作符,包括
+
和-
,会把操作数转换成数字。
- 二元运算
- 动态类型
变量可以赋值不同类型的值 - 单线程
- 单线程 - JavaScript 需要与用户交互,操作 DOM,如果多线程的话会带来复杂的同步问题。比如一个线程删除节点,一个线程添加内容,浏览器不知道以哪个线程为准。
- 解释型语言 - 会将代码一句一句直接运行,不需要像编译型语言(Compiled language)一样,经过编译器先行编译为机器代码,之后再运行。
具有良好的跨平台性 - 可以在 Windows、Linux、Android、IOS 等平台运行。
JavaScript 和 ECMAScript 的区别,以及和 DOM 、BOM 的关系
- ECMAScript
JavaScript 的语法和基本对象,是 JavaScript 的规范, - DOM
文档对象模型,提供了与网页内容交互的方法
和接口
- BOM
浏览器对象模型,提供了与浏览器交互的方法
和接口
为什么函数被称为一等公民
在 JS 中,函数可以像传统函数一样声明和调用,也可以像简单值一样:
- 赋值 var fun=function(){}
- 传参 function fun(a,callback){callback()}
- 返回 function(){return function(){}}
不仅如此,JavaScript 中的函数还充当了类的构造函数的作用,同时又是一个 Function 类的实例(instance)。
手写 call、apply、bind 函数
非严格模式:
- 不传入第一个参数,上下文默认为
window
- 改变
this
指向,让新的对象可以执行该函数,并能接受参数
call
1 | function mySymbol(obj) { |
验证
1 | let Person = { |
apply
1 | Function.prototype.myApply = function (context) { |
bind
- 函数调用,改变 this
- 返回一个绑定 this 的函数
- 接收多个参数
- 支持柯里化形式传参 fn(1)(2)
1 | Function.prototype.myBind = function (context) { |
instanceof 的原理
1 | //判断left是不是right的实例 |
Object.create 实现原理
1 | function create(prototype,props){ |
实现数组的 Map,filter,reduce 方法
1 | Array.prototype.myMap = function (fn) { |