1.js基础用法

1.变量

1. 变量就是一个用来存储数据的容器
2. 声明变量使用var关键字
3. 变量的声明
 var name = `右侧叫表达式`
 var 是声明变量的关键字
 name 是变量的名字
 = 赋值运算符
 等号=右边叫表达式

4. var提升变量,只是把变量提升到作用域的最顶层,变量的赋值不会提升,依然保留原始位置。

2. 内存分配

1. 内存中的栈【有序存储】:存储基础数据类型的数据【字符串,数字,布尔值】
2. 内存中的堆【无序存储】:存储的是复杂/引用类型的数据【对象,数组】

3.变量命名规范

1. 【重点】变量名不可以是js的关键字或保留字
2. 变量的名字不可以用数字开头,更不能是纯数字和其他非英文字母的字符,虽然可以用中文,做变量名字,但一般不这么写
3. 变量可以使用`$`、`_`、以及英文字母做变量名
4. 命名的时候应该遵循语义化规则:让变量有实际的含义,实在不行可以使用拼音【不推荐】
5. 对于多个单词拼接的变量名应该使用驼峰命名法:
 - 大驼峰命名法:myname=>MyName;每个单词的首字母大写
 - 小驼峰命名法:myname=>myName;除了第一个单词,剩下的单词首字母大写
 6. 变量的首字母应该对应着数据类型
 - 字符串:`var s_name`
 - 数字:`var n_name`

4. 作用域

- 定义:程序生效的空间
 - 全局的作用域:script【脚本】
   - 顶级对象:window、document
   - window又叫BOM
   - document又叫DOM
   - BOM包含着DOM
 - 局部的作用域:function【函数】、module【es6】
   - 顶级对象:this
   - 内部声明的变量
   - 声明在局部作用域中的变量不可以在外部使用,但是如果不使用关键字声明变量,否则会背提升到全局作用域中
   - 函数天生有返回值,返回默认是undefined

5.数据类型

1. 基本数据类型【内存的栈里面存储】

   - 数字
   - 字符串
   - 布尔值
   - 空值 null
   - 未定义 undefined
   - 不是数字 nan
 2.引用数据类型

   - 对象
   - 数组
   - 函数
   - 正则

6.基本数据类型和引用数据类型区别

- 基本数据类型在赋值的时候是在栈里面开一个新的空间,多个变量使用同一个值,也是对值的深拷贝,每个值拥有独立的空间
   - 引用数据类型在赋值的时候是在堆里面开一个空间,把存储空间的标识码赋给了变量,多个变量赋值同为一个对象的时候,只是简单地复用了标识码的引用,俗称浅拷贝。
 

7.类型转换

   1. 字符串->数组
   2. 字符串->数组
   3. 所有的数据互相之间都可以转换
 

8. 显示转换

   很直观的从代码上可以看出来是在转换数据类型
  1. 使用数据的构造函数:String()
  2. 使用方法,比如转成字符串可以使用toString方法
    隐式转换
  1. if的表达式可以隐式转换
  2. +任何值和字符串,都会被转成字符串
  3. 除了+,其他的减乘除都是尝试把数据转换成数字进行计算
  4. 逻辑运算符也会隐式转换数据

9.数据类型检测

 1. typeof:对基本数据类型检测好用,对于引用数据类型全都是object
  2. instanceof:检测一个值是不是属于一个数据原型上的,对于引用速狙很精准,对于基本数据不精准
  3. constructor:可以检测基本数据类型和引用数据类型,但是对于控制类型,不能检测出来,因为空值类型没有构造函数
  4. Object.prototype.toString.call():可以检测所有的数据类型

10.运算符

1.算术运算符

+  -  *   /   %  ++    --   +*(累计计算),** (幂)
   i++和++i的区别
  ++i是用算符,如果++在变量的前面则先计算然后在赋值,
则值是计算后的值,
   如果++在变量的后面,先把变量的旧值拿出来使用,最后在计算新值在赋值
   总结:i++先复制后计算,++i

2.逻辑运算符:==    ===    !  ||  &&

 ! 求反。!true=>galse
    ||或,左边如果未true则使用左边的值,否则使用右边的值
    && 与,如果左边的值是假的,就终止执行了,不需左边和有边的值都为truet条件才成立
    ==等于,只判断值,不判断类型【它偷偷的做了数据集的隐式转换】
   ===全等,不光判断值,还判断数据类型【推荐在程序中使用它做判断】

11.条件语句

if
switch
三目运算符/三元表达式/三元运算符

三者的区别
1.if和switch没有返回值,三目运算符有返回值
2.语法不一样
3.三目运算符虽然有返回值可以由更多的使用场景,但是当前是阅读不方便

位运算符:先把左右的十进制转成二进制之后在计算
1.&按位与
2.|按位或
3.^按位异或
4.~按位非
5.<<按位左移
6.>>按位右移
7.>>>按位右移零

12.函数

普通函数》声明函数:function name(){}
函数可以提升,整个函数会提示
匿名函数》function(){}
函数表达式》var name=function(){}
如果用var 接受匿名函数,只会提升变量,不会提升函数
自执行函数》(function(){})()或funtions(){}()
函数自有属性
arguments  不定参数-伪数组
name 获取函数的名字

12.1 函数作用域

function 里的this指向它声明的作用域里顶级对象,如果函数是绑定给dom事件的,那么this是dom对象,如果函数
是声明在全局作用域里,this是window.

12.2 什么是函数?什么方法

函数是指独立的一个函数,该函数可以被直接调用
方法是指函数归属于一个对象,使用对象点函数的方式调用,这个函数叫方法

12.3 回调函数

把函数做为参数传给另一个函数

12.4 闭包

就是常驻内存的一个值,这个值默认不会被释放,但是这个值还不会污染全局作用域
被垃圾回收机制忽略的值,所产生的内存占用也叫闭包

13.工厂函数和class类

工厂函数:将一系列的属性和方法分装成一个构造函数,使用的时候需要使用new关键字来调用构造函数,目的是为了得到一个独立的实例对象。
js里有内置的构造函数


var obj=new Object();

13.1 当使用new调用函数之后发生了什么?

第一步在函数中创建一个对象
第二部函数中的this指向该对象
第三步把函数中的this返回出去
第四步使用变量接收构造函数的返回值--实例对象

13.2  工厂函数优势

独立的作用域,不会污染全局
实例出来的对象都是互相独立,互不影响的

13.3 工厂函数的缺点

每次实例化都会在内存中开一个新的对象存储,如果大量实例化会占用内容

13.4 对象、原型、原型链和构造函数直之间的关系

1.对象就是使用构造函数new出来的。
2.原型是构造函数的proptype对象,这里只有function函数才有原型对象,基于它可以实现对象的继承
3.原型链指的的实例对象的自身的_proto_对象,_proto_指向的是构造函数prototype对象,当我们使用对象点一个属性的时候,这个查找属性
的过程称为原型链,程序会沿着对象_proto_对象一直找到过程叫原型链
4.构造函数是new的函数,也是实例对象的_proto_下面的constructor【构造函数】

13.5 改变this指向的三种方式

【注意】修改this指向的函数,必须是function函数,因为这些方法来自于prototype对象上的,而箭头函数没有原型对象,所以箭头函数不能改变this
call
1.第一个参数是对象,后面的参数都是独立传入的
2.一旦使用则是会立即调用函数
apply
1.第一个参数是对象,后面的参数放在数组里
2.一旦使用则会立即调用函数
bind【es6】
1.第一个参数是对象,后面的参数可以是任意
2.不会立即调用函数,而是返回了一个修改了this之后的新函数

13.6 class类【es6】

类的概念:基于面向对象的概念实现的封装,特点是:封装,多态,继承。
class类是原型函数的语法糖

13.7 类的底层原理

es6的类还是基于函数的prototype封装的,他只是工厂函数的语法糖,其底层还是基于函数的封装
因为是基于prototype对象实现的class,在严格意义上它属于伪类

13.8 类的继承

1.子类继承于父类使用关键字extends
2.当使用new来调用字类的时候,程序会先从字类自生初始化所有的属性和方法,其次才沿着原型对象找到符类的属性和方法
如果符类和字类都有相同的属性和方法则使用字类的替代父类的

14.字符串常用方法

合并 除了+好,concat()才是正经的合并字符串方法
复制  repeat(n)
查找  
 1.indexOf()找到了返回字符所在的下标,找到第一个匹配的字符串,找不到返回-1
 2.lastIndexOf() 取最后一个匹配字符串下标,也是从左向右
删除、修改
 1.replace(target.value)  只能修改匹配到的第一个
 2.replaceAll(target,value)  修改匹配到的所有的字符
切割
1.split('条件') 根据条件进行切割
转数组
1.split('')传入一个空字符串转成数组
截取
1.slice(开始的下标,结束的下标)根据下标进行截取

15.数组的方法

1.数组的合并
 concat()  可以合并多个数组,不会修改原始数组,会返回一个新数组
2.查找
indexOf()  找到了返回字符所在的下标,找到第一个匹配的字符串,找不到返回-1
lastIndexOf()  取最后一个匹配字符串下标,也是从左向右
3.去重
      新创建一个空数组,遍历目标数组,在for中使用新数组indexOf判断包含目标数组的当前项,如果返回-1则把当前项插入到新数组中,
      如果返回不是-1说明新数组中已经有了相同内容,则不插入,最后新数组的每一项都是不同的,从而实现数组的去重
4.删除和修改
delete 关键字可以删除某一项元素
splice(位置下标,删除长度)  删除指定位置的长度
splice(第几位,0,。。。插入的值) 指定位置的后面插入元素,个数不限

5.创建数组
var arr=[]  字面量形式
var arr=new Array()实例化数组

6.其他的es5里面的数组方法
 push  尾部添加,修改原始数据,返回新数组的长度  
 pop  尾部删除,并返回删除掉的元素,改变原始数据
 shift  从头部删除元素
 unshift  向头部添加元素
 for  在所有的循环遍历中,只有for是执行最快的
     终止循环  break
     跳过本次循环进入下一次循环  continue
 forEach  它没有返回值,但是可以使用return来终止循环
 sort  正序排序
 reverse  倒序排序
 some  只要有一个符合就返回true
 every  必须每一个都符合才返回true,只要有一个不符合就返回false


7.数组转字符串
  join('')如果需要转成的字符串有符号链接,可以在join(' ')
反转字符串
var s='你好天明'
console.log(s.split('').reverse().join(''))


8.数组转对象
遍历,然后把每一个放在对象里去

16.对象

1.合并对象
  遍历对象,把对象的属性名和属性值依次按顺序赋给一个新的对象
2.其他
  object.defineProperty  监听对象属性发生改变的方法,也是VUE2的数据双向响应的底层原理
  toString  转成字符串
  ofValue  转成字符串

17.递归

1.函数自我调用
2.递归的三大条件:
   数据结构必须是一致的
   必须要有结束的判断
   数据的嵌套层级不固定
 

18.变量

let
用来声明变量的,不可以重复声明,可以重复的赋值
const
用来声明常量的,常量成为只读数据
一旦声明必须赋值,且值不可再改,
使用const声明的常量不可以重复声明更不可以重复的赋值
var
用来声明变量的,可以重复的赋值,可以重复的声明

相同点
都是声明的关键字

不同点
1.变量提示只有var
2.作用域:var声明的变量存在于window顶级对象中,let和const的变量存在于独立的块级作用域。
3.let可以重复的赋值,const不可以重复赋值

 

19.ex6的经典题:暂时性死区

原因就是let和const的块作用域的特性
当let或const放在{}里的时候,这个{}就会变成块级作用域,被let或const声明的变量锁死--暂时性死区
在es5时代,作用域只有全局的window和局部的函数作用域,受条件限制,for循环,if和switch里的变量会污染全局,现在又了let和const之后,凡是有{}的代码块里面使用
了let或const则{}就会变成块级作业域

20.let,const,var使用场景

1.let适合在for循环中的定时器使用,作为强类型语法现限制的变量
2.const适合作为一次性赋值的常量,多用于数据的版本号或id
3.var适合兼容的le浏览器,对于很旧的项目使用的比较多,目前推荐使用let替代

21.模板字符串/超级字符串

1.可以换行,并且原格式输出,自动添加制表符
2.可以使用‘${}’的形式插入表达式或变量值

22.es6里的解构赋值

对象
1.使用{}去解构,不光解构自身的属性,还会解构原型上的属性
2.对于对象自身没有找到的属性,解构除了的变量的值是undefined

数组
1.使用【】去解构,按顺序解构
2.对于不存在的,得到的值也是undefined

解构赋值中的对象和数组的区别是?
1.对象解构按属性名解构
2.数据解构按位置解构

解构赋值中的默认值
·var [2=1]=[1]·如果目标数据中么有对应的项,则使用默认值

23.function 和箭头函数

相同点
1.都是函数
2.都有局部作用域
不同点
1.语法不同
2.this指向不同
   1.function指向调用它的对象
   2.箭头指向上一层作用域里的对象
3.不定参伪数组
   1.function 函数中有arguments
   2.箭头函数没有arguments,但是可以使用...扩展运算符得到类似的形参集合
4.箭头函数不可以作为构造函数使用,不可以使用new调用
5.箭头函数没有原型对象
6.箭头函数只能是匿名函数
7.箭头函数不能改变this指向

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值