今天学习了JavaScript相关知识:
1.
大概理解了一下变量,值,类型:
值:数值
类型:数据类型区别辨明
变量:可变化的量
值通过类型区别,变量可以赋值
2.
重温了let,var,const区别:
let必须先声明后使用,否则报错
var可以先使用后声明,输出为undefined(变量提升)
const与let此特性相同
let声明的变量,会被限制在所在的作用域内
var声明的变量,是全局变量
const与let此特性相同
let不可声明同名变量,否则报错
var可声明同名变量,后者覆盖前者
const同let
const不可做修改,所以const声明同时必须初始化,否则报错
特别 :const声明的变量虽然不可改变,但声明的对象可以改变属性内容。原因是const锁定的是该变量的地址,而非该变量本身。const声明的对象不可改变所指的对象,但是可以改变所指对象内容。
3.
了解了Js的基础类型和引用类型:
基础类型:undefined、Null、String、Number、Boolean
引用类型:Object、Regexp、Array、Data、Function
引用类型的含义:变量所指的都是真实数据的引用,操作的是引用。但是修改数值的时候,操作的则是实际的对象。
4.
undefined和Null的区别:
undefined是指该变量被声明但未初始化,此时该变量为undefined类型且值为undefined。
undefined类型仅有一个值,即为undefined。
Null则代表该变量未被声明,既无此对象。
5.
Js中this指向
this的设计目的是为了指向该对象所在的环境
绑定默认情况:
严格模式:不将window作为this默认绑定,this指向undefined
非严格模式:默认指向全局变量
隐式绑定情况:
当通过对象属性执行函数时,会将this绑定到对象身上
函数传参也是一种隐式赋值,此时在回调函数中会丢失this绑定。
显式绑定情况:
通过 call apply bind函数绑定
function foo() {
console.log(this.name);
}
var obj = {
name: 'Heternally',
}
var obj1 = {
name: 'Heternally1'
}
var name = 'zl';
foo.call(obj); // Heternally 调用call方法后强行将foo函数的this指向来obj对象上
foo.call(obj).call(obj1); // Heternally 多次调用call方法,以第一次为准
foo.call(obj1).call(obj); // Heternally1
foo.call();// zl 没有传入指定对象,所以this默认指向全局对象
该代码选自https://lucifer.ren/fe-interview/#/topics/js/this
new绑定情况:
可理解为通过构造函数创建一个新对象时,会默认将this指向该对象所创造的作用域。
用new绑定时,需要判断函数返回的值是否为一个对象,如果是对象,那么this会绑定到返回的对象上。
(个人理解,有错的话会回来进行修改)
ES6的箭头函数绑定情况:
当使用箭头函数时,以上4种情况会失灵
箭头函数的this指向即为外层作用域
绑定优先级:new > 显式 > 隐式 > 默认
6.
堆内存和栈内存的基础了解
函数的运行顺序会存放在栈中,然后以先入后出的机制进行函数的运行。
因为存在结构,所以运行效率很高。
数据的存放都随意存放在堆中,没有规则。
7.
Js的原型链机制初了解
所有Js实例在创建后
let exam = new Object();
exam.__ proto __ == window.Object.prototype
原型的作用是,可以让创建的实例拥有一些自带属性,就好像一些富二代和官二代出生就拥有一定的资本和财产一样(雾)。省去不少代码。
8.
Js的函数柯里化
curry函数,高阶函数的一个用法
通过嵌套,将一个本接受多参数的函数简化为一个只需要接受一个参数的函数(最初函数的第一个参数)。并且返回接受余下的参数而且返回结果的新函数的技术。
function sum(x,y)
{
return x+y;
}//原函数
function sum1(x)
{
return function(y)
{
return x+y;
}
}//curry后的函数
sum(1,2);//原
sum1(1)(2);//改后