五、查询书名包括"网络"关键词的图书,输出书号、书名、做者。
六、查询现有图书中价格最高的图书,输出书名及做者。
七、查询当前借了"计算方法"但没有借"计算方法习题集"的读者,输出其借书卡号,并按卡号降序排序输出。
数据可视化-基础绘图体系(R)
日期时间、字符串的处理
1.最近邻分类法基于距离的比较,本质上赋予每一个属性相等的权重。所以,当数据存在噪声或不相关属性时,它们的准确率可能受到影响。
2.最近邻分类法在对检验元组分类时可能很是慢。
3.粗糙集理论能够用于分类,发现不许确数据或噪声数据内的结构联系。它用于离散值属性。所以,连续值属性必须在使用前离散化。
4.粗糙集理论基于给定训练数据内部的等价类的创建。造成一个等价类的全部元组是不加区分的;也就是说,对于描述数据的属性,这些样本是等价的。
5.半监督分类使用有类标号的数据和无类标号的数据构建分类器。
6.自我训练是半监督分类的最简单形式。
7.协同训练是半监督分类的另外一种形式,其中两个或多个分类器互教互学。理想地,每一个学习器都对每一个元组使用一个不一样的、理想的独立特征集。
8.主动学习是一种迭代的监督学习,适合数据丰富但类标号稀缺或获取昂贵的状况。学习算法是主动的,由于它可能有目的地向用户询问类标号。一般,这种方法用于学习概念的元组数远小于典型的监督学习所须要的数量。
9.高维数据聚类方法能够分红两类:子空间聚类方法和维归约方法。
10.如何从高维数据中发现子空间簇?大体能够划分红三个主要类别:子空间搜索方法、基于相关性的簇聚类方法和双聚类方法。
11.聚类的最优化目标包含两部分:优化聚类质量和最小化违反约束的罚。整体目标函数是聚类质量得分和罚得分的组合。
12.基于密度的离群点检测方法的基本假设是:非离群点对象周围的密度与其领域周围的密度相似,而离群点对象周围的密度显著不一样于其领域周围的密度。根据这个假定,基于密度的离群点检测方法使用对象和其近邻的相对密度指示对象是离群点的程度。
13.朴素贝叶斯分类法假定一个属性值在给定类上的影响独立于其余属性的值。
开发工具选项卡调用:选项----自定义功能区
VBE就是VBA的编辑窗口,全部的VBA操做都在VBE里完成
Single(!)/单精度浮点型 |
1.大数据在国际标准上是4v,也就是数量、多样、价值、速度。
(1)数量就是数据体量特别大。
(2)多样就是数据的种类和类型很是多,它包括网络日志、视频、图片、地理位置、信息、统计等等调查,这些全包括。
(3)深刻挖掘,就能产生出商业价值,换言之就是价值密度低,商业价值高。
(1)首先大数据它不是随机样本,而是全体数据。
(2)大数据不是精确性的,而是混杂性。
(3)大数据彼此不是因果关系,而是相关关系。
(1)数据特征化是目标类数据的通常特征或特征的汇总。一般,经过查询来收集对应于用户指定类的数据。
(2)数据特征化的输出能够用多种形式提供,例如饼图、条图、曲线、多维数据立方体和包括交叉表在内的多维表。结果描述也能够用广义关系或规则(称作特征规则)形式提供。
4.数据区分是将目标类数据对象的通常特性与一个或多个对比类对象的通常特征进行比较。目标类和对比类能够由用户制定,而对应的数据对象能够经过数据库查询检索。
5.频繁模式是在数据中频繁出现的模式。存在多种类型的频繁模式,包括频繁项集、频繁子序列(又称序列模式)和频繁子结构。
6.频繁项集挖掘是频繁模式挖掘的基础。
7.离群点数据分析称作离群点分析或异常挖掘。
8.数据质量涉及许多因素,包括准确性、完整性、一致性、时效性、可信性和可解释性。
9.考察数据预处理的主要步骤,即数据清理、数据集成、数据规约和数据变换。
(1)数据清理例程经过填写缺失的值,光华噪声数据,识别或删除离群点,并解决不一致性来”清理”数据。
analysis)或PCA(又称Karhunen-Loeve或K-L方法)搜索k个最能表明数据的n维正交向量,其中k<=n,这样,原数据投影到一个小得多的空间上,致使维规约。与属性子集选择经过保留属性集的一个子集来减小属性集的大小不一样,PCA经过建立一个替换的、较小的变量”集合”属性的基本要素。原数据能够投影到该较小的集合中。PCA经常可以揭示先前不曾察觉的联系,并所以容许不寻常的结果。
11.PCA能够用于有序和无序的属性,而且能够处理稀疏和倾斜数据。多于二维的多维数据能够经过将问题归约为二维问题来处理。主成分能够用作多元回归和聚类分析的输入。与小波变换相比,PCA可以更好地处理稀疏数据,而小波变换更适合高维数据。
12.数据仓库是一个面向主题的、集成的、时变的、非易失的数据集合,支持管理者的决策过程。
13.一般,数据仓库采用三层体系结构:
(1)底层是仓库数据库服务器,它几乎老是一个关系数据库系统。
(2)中间层是OLAP服务器,其典型的实现使用(i)关系OLAP(ROLAP)模型(即扩充的关系DBMS,它将多维数据上的操做映射为标准的关系操做),或使用(ii)多维OLAP(MOLAP)模型(即专门的服务器,它直接实现多维数据和操做)。
(3)顶层是前端客户端,它包括查询和报告工具、分析工具和或数据挖掘工具(例如,趋势分析,预测等)。
14.多维数据分析的核心是有效地计算多维集合上的汇集。
15.置信区间是一个以给定的高几率涵盖正真整体值估计的值域。
16.至少有4种方法能够把OLAP风格的分析与数据挖掘技术融合在一块儿。
(1)使用立方体空间为数据挖掘定义数据空间。
(2)使用OLAP查询为挖掘产生特征和目标。
(3)使用数据挖掘模型做为多步挖掘过程的构建。
(4)使用数据立方体计算技术加快重复模型的构建。
17.通常而言,关联规则的挖掘是一个两步的过程:
(1)找出全部的频繁项集:根据定义,这些项集的每个频繁出现的次数至少与预约义的最小支持计算min_sup同样。
(2)由频繁项集产生强关联规则:根据定义,这些规则必须知足最小支持度和最小置信度。
18.基于模式的多样性,模式挖掘能够使用以下标准进行分类:
(1)基本模式:频繁模式可能有多种形式,包括简单的频繁模式、闭幕式和极大模式。
(2)基于模式所涉及的抽象层:模式或关联规则可能具备处于高、低,或多个抽象层的项。
(3)基于规则或模式所涉及的维数:若是关联规则或模式中的项或属性只涉及一个维,则它是单维关联规则/模式。
19.数据挖掘研究的通常线路图
20.根据约束如何与模式挖掘过程配合,模式剪纸约束能够分为五类:(1)反单调的;(2)单调的;(3)简洁的;(4)可转变的(5)不可转变的
21.模式融合合并大模式的小的子模式,而不是用单个项增量地扩展模式,所以,该方法有一个优势,绕过中型模式,沿着通往可能的巨型模式的路径前进。
22.分类是一种最重要的数据分析形式,它提取刻画重要数据类的模型。这种模型称为分类器,预测分类的(离散的、无序的)类标号。
23.数据分类是一个两阶段过程,包括学习阶段(构建分类模型)和分类阶段(使用模型预测给定数据的类标号)。
24.聚类是一个把数据对象集划分红多个组或簇的过程,使得簇内的对象具备很高的类似性,但与其余簇中的对象很不类似。
25.数据仓库是一个从多个数据源收集的信息存储库,存放在一致的模式下,而且一般驻留在单个站点上。数据仓库一般经过数据清理、数据变换、数据集成、数据装入和按期数据刷新来构造。
(1)一般,数据仓库用称做数据立方体的多维数据结构建模。
26.数据特征化是目标类数据的通常特征或特征的汇总。一般,经过查询来收集对应于用户指定类的数据。
27.数据区分是将目标类数据对象的通常特征与一个或多个对比类对象的通常特征进行比较。目标类和对对比类能够由用户指定,而对应的数据能够经过数据库查询检索。
28.分类预测类别(离散的,无序的)标号,而回归创建连续值函数模型。也就是说,回归用来预测缺失的或难以得到的数值数据值,而不是(离散的)类标号。
29.离群点数据分析称做离群点分析或异常挖掘。
30.做为一个应用驱动的领域,数据挖掘吸纳了诸如统计学、机器学习、模式识别、数据库和数据仓库、信息检索、可视化、算法、高性能计算和许多应用领域的大量技术。
31.有效性、可伸缩性、性能、优化以及实时运行能力是驱动许多数据挖掘新算法开发的关键标准。
32.给定基本防踢,方体的物化有三种选择:
(1)不物化(2)彻底物化(3)部分物化
33.聚类、决策树和相关分析能够用于数据离散
33.数据仓库提供联机分析处理(OLAP)工具,用于各类粒度的多维数据的交互分析,有利于有效的数据泛化和数据挖掘。OLAP工具一般使用数据立方体和多维数据模型,对汇总数据提供灵活的访问。
34.大规模数据集下的一些重要的特征抽取类型,它们包括如下两种
35.序列是事件的有序列表。根据事
件的特征,序列数据能够分层三类:(1)时间序列数据(2)符号序列数据(3)生物学序列法
36.序列分类方法能够分红三类:(1)基于特征的分类,它们把序列转换成特征向量,而后使用传统的分类方法;(2)基于序列距离的分类,其中度量序列之间类似性的距离函数决定分类的质量(3)基于模型的分类。
37.可视化数据挖掘包括数据可视化、数据挖掘结果可视化、数据挖掘过程可视化和交互的可视数据挖掘。
表一、员工表employee的结构:
三、商品基本信息表product:
(1)查询所有职工的基本信息
(2)查询全部职工的部门、职工号、姓名和薪水
(3)查询全体职工的姓名、年龄、所属部门,并用汉语显示表头信息
(4)查询1973年出生且为职员的员工信息
(5)查询业务科或财务科的职工姓名、性别和所在部门,仅显示前面5位职工
(6)查询薪水为2000或4000的职工编号、姓名、所在部门和薪水
(7)查询薪水在的职工姓名和薪水
(8)查询薪水不在的职工姓名和薪水
(9)查询全部姓张的职工姓名、所属部门和性别
(10)查询全部姓张且全名为三个汉字的职工姓名
(11)查询既不在业务科也不在财务科的职工姓名、性别和所在部门
(12)查询1991年被雇佣的职工号、姓名、性别、电话号码、出生日期以及年龄
(13)查询6月出生的员工编码、姓名、出生日期,并按出生日期的降序输出
(14)查询职工工资最高的前10%的职工编号、职工姓名和工资
(15)查询每一个业务员的订单数量
(16)统计在业务科工做且在1973年或1967年出生的员工人数和平均工资
(17)统计每种商品的销售数量和金额,并按销售金额的升序排序输出
(18)查询订单中至少包含3种(含3种)以上商品的订单编号及订购次数,且订购的商品数量在3件(含3件)以上。
(1)查询住址在上海的员工所作的订单,结果输出员工编号、姓名、订单编号、客户编号和订单日期,并按客户编号排序输出。
(2)查找订购了“32M DRAM”的商品的客户编号、客户名称、订单编号、定货数量和定货金额,并按客户编号排序输出。
(3)查询与“张晓梅”在同一部门工做的员工姓名、所属部门、性别和出生日期,并按所属部门排序输出
(4)查询1973年出生的员工所订购产品的订单,输出结果位员工编号、姓名、所属部门、订单编号、客户名称、订单日期,按员工编号排序输出。
(5)统计订单中每一个商品具备销售数量大于4的订单的订单个数,要求显示商品编号、商品名称、订单数
(6)查询每一个客户订购商品的具体订单信息,输出结果为客户编号、客户名称、商品编号、商品名称、数量、单价和金额
(7)查询“52倍速光驱”的销售状况,要求显示相应的销售员的姓名、性别、销售日期、销售数量和金额。
(1)查询员工“张小娟”所作的订单信息
(2)查询没有订购商品的且在北京地区的客户编号、客户名称和邮政编码,并按邮政编码降序排序
(3)查询订购了“32M DRAM”商品的订单编号、定货数量和定货单价
(4)查询与员工编号E2008005在同一部门的员工编号、姓名、性别、所属部门
(5)查询即订购了P商品,又订购了P商品的客户编号、订单编号和订单金额。
(6)查询没有订购“52倍速光驱”或“17寸显示器”的客户编号、客户名称。
(7)查找至少有2次销售记录的业务员名单和销售日期
(8)查找销售金额最大的客户名称和总订单金额
(9)查找销售总额少于5000元的销售员编号、姓名和销售额
(10)查找至少订购了3种商品的客户编号、客户名称、商品编号、商品名称、数量和金额
(11)查找同时订购了商品编号为“P”和商品编号为“”的商品的客户
编号、客户姓名、商品编号、商品名称和销售数量,按客户编号排序输出
(1)查询订购了“键盘”商品的客户姓名、定货数量和定货日期
(2)查询没有订购“键盘”商品的客户名称
(3)查询至少销售了5种商品的销售员编号、姓名、商品名称、数量及相应的单价,并按销售员编号排序输出
(4)查询没有订购商品的客户编号和客户名称
(5)查询订购了全部已列商品的客户名称
(6)查询至少包含了“世界技术开发公司”所订购的商品的客户编号、客户名称、商品编号、商品名称、数量和金额。
三、查询与“张晓梅”在同一部门工做的员工姓名、所属部门、性别和出生日期,并按所属部门排序输出
例2:查询至少包含了“世界技术开发公司”所订购的商品的客户所订购商品的客户编号、客户名称、商品编号、商品名称、数量和金额。
'3.代码换行 (空格+下划线+换行)
3.工做表示表的b表示方法
'注意:当工做簿包括工做表、宏表、图表等时,
' 使用索引号引用工做表如Sheets(1)与
3.三种单元格引用小结
'VBA属性: 指对象所具备的特性
'人的属性:姓名,年龄,身份证号,住址….
'VBA对象属性的赋值
'返回 Range 对象,它表明位于指定单元格区域的必定的偏移量位置上的区域。
'表达式 一个表明 Range 对象的变量。
'偏移行列的数字能够是:正数,负数,零值
'返回一个 Range 对象,该对象表明包含源区域的区域尾端的单元格。
'思考题:用上题的思路,将成绩中的"未考"去掉为空?
'方法:实际上就是对对象的操做,它是一种动做,一种行为。
注:名称也就是触发事件,触发事件就是vba自带的
'除了上一课节讲的range基本表示方法外,还有更多的变化写法
'4.变量名的命名规则
'不超过 255 个字符。
'同一范围内必须是惟一
'VBA中的IF条件判断语句,就像函数中的IF同样
'IF可单条件,也可多条件。
'select case语句:根据表达式的值来决定执行几组语句中的其中之一。
'vba if语句为判断语句。根据条件的值,可以使用 If...Then...Else 语句运行指定的语句或一个语句块。If...Then...Else 语句可根据须要嵌套多级。
' 可是,为了代码的可读性,建议使用其他的语句,好比 Select Case 语句而不使用多层嵌套的vba中的 If...Then...Else 语句。
'当须要处理集合成员时,通常会用for each..next,实际上就是处理对象
Sub 理解计数变量的运行()
'do ...loop 循环语句,直到知足某个条件
1.OTS构建在阿里云飞天分布式系统之上的NoSQL数据库服务,提供海量结构化数据的存储和实时访问。
' 数组就是一个列表或者一组数据表.
' 数组存储在内存中.
' a.读写速度快(从内存读取数据要比从硬盘读取快)
' b.没法永远保存(内存只是暂存空间)
' a.通常分为:常量数组,静态数组,动态数组
' 数组最多有60维,但在excel中通常最到2维
' 1.excel中的一行或一列能够转换1维数组
' 2.excel中的多行多列能够转换成2维数组
'比比哪一个程序的运行速度更快
10.what-if模拟分析方法是模拟影响结果的可变因素而测算出最后的结果
3.mysql 的服务器服务的启动和中止
服务器-> 多个数据库->多张数据表(多个行和列)
2、 查看当前全部存在的数据库
一、建立测试数据库test_db,
三、删除测试数据库test_db,
9.模拟运算表(双重变量)
首先建立数据库test_db,SQL语句以下:
查看数据表是否建立成功,SQL语句以下:
主键:primary key 对字段具备非空和惟一的约束
二、定义数据表tb_emp3,其主键为id,SQL语句以下:
四、定义数据表tb_emp5,并在tb_emp5表上建立外键约束。
MUL 不是外键的标志,而是索引的标志。
六、定义数据表tb_dept2,指定部门的名称惟一,SQL语句以下:
七、定义数据表tb_dept3,指定部门的名称惟一,SQL语句以下:
注意:自动auto_increment 只能在具备主键或惟一键的字段上添加
修改属性:modify 能够修改字段名后面
modify 不能修改主键,可是能够增长主键,不能减主键
注意:modify 从新修改的属性要全面
1三、将数据表tb_dept1中的location字段名称改成loc,数据类型保持不变,
1五、在数据表tb_dept1中添加一个没有完整性约束的INT类型的字段managerId(部门经理编号)
方案(假设分析工具):是一组命令的组成部分。预测工做表模型的输出结果。同时还能够在工做表中建立并保存不一样的数值组,而后切换到任意新方案以查看不一样的结果。
数据有效性:限制其数据能录入的有效范围。
数据有效性"序列":是数据有效性中很是经常使用和重要的功
序列:能够在单元格中自定义下拉列表的内容
五、将另外一张表转存到一张表中
注意:没有value这个单词
按照person表信息查询的结果建立表格person2:
一、从fruits表中检索全部字段的数据,SQL语句以下:
二、查询fruits表中f_name列全部水果名称,SQL语句以下:
五、查找名称为“apple”的水果的价格,SQL语句以下:
六、查询价格小于10的水果的名称,SQL语句以下:
八、查询全部s_id不等于101也不等于102的记录,SQL语句以下:
1五、查询fruits表中是否存在s_id=107的供应商,若是不存在则查询fruits表中的记录,SQL语句以下
查询数据表fruits中水果的信息,并按照价格进行升序排列,SQL语句为
1七、查询数据表fruits中水果的信息,首先按照s_id升序,在按照f_price进行降序排列
1九、查询数据表fruits中第3行到第6行的信息
2一、查询每一个供应商各自水果的平均价格大于5元的记录;
2二、查找f_name全部以’b’字母开头的水果,SQL语句以下:
2四、查询以’b’开头,并以’y’结尾的水果的名称,SQL语句以下:
2六、在fruits表中,f_name中包含‘b’或者‘x'的记录,SQL语句以下:
包含b或x(|两边可写单个字符,也可写字符串)
包含b或x,只能匹配单个字符
匹配字符集中除去a到x的其余字符。
匹配包含y且y前面最少四个字符.
(ba)+:+表示符号以前的字符连续出现1次以上;{1,}
配置以后,服务断开以后重启。若是还不能够,须要进行修改数据库utf8
五、在fruits表和suppliers表之间使用内链接查询。
查询以前,查看两个表的结构:
九、使用内链接查询供应f_id= ‘a1’的水果供应商提供的水果种类,SQL语句以下:
十、ANY和SOME关键字是同义词,表示知足其中任一条件,它们容许建立一个表达式对子查询的返回值列表进行比较,只要知足内层子查询中的任何一个比较条件,就返回一个结果做为外层查询的条件。
下面定义两个表tb1和tb2:
十一、分别向两个表中插入数据:
十二、返回tb2表的全部num2列,而后将tb1中的num1的值与之进行比较,只要大于num2的其中一个值,其为符合查询条件的结果。
1三、返回tb1表中比tb2表num2 列全部值都大的值,SQL语句以下:
1.多个下拉列表的切换
2.数据分析能作什么?活动复盘、项目立项、专题报告、项目优化、市场预测、改进技术、帮助研发。
3.应用实例:医疗行业、能源行业、通讯行业、电商行业
5.方法论是从宏观角度出发,从管理和业务的角度提出的分析框架,知道咱们接下来具体分析的方法。方法是微观的概念,是指咱们在咱们在具体分析过程当中使用的方法:
13.什么时数据分析:它就是基于商业目的,有目的地进行收集、整理、加工和分析数据,提炼有价值信息的一个过程。
1.跨工做表的序列引用
用户使用行为是指用户为获取、使用物品或服务所采用的各类行为,通常按照如下过程:对产品有一个认知、熟悉的过程,而后试用,再决定是否继续消费使用,最后成为忠实用户。
2.AARRR理论:增加黑客的海盗法则,精益创业的重要框架,从获取(Acquisition)、激活(Activition)、留存(Retention)、变现(Revenue)和推荐(Referral)5个环节增加。互联网企业能够重点关注AARRR方法论,对于精益化运营、业务增加的问题,这个方法论很是契合。
(1)对比分析法是将两个或两个以上的数据进行比较,分析其中的差别,从而揭示这些食物所表明的发展变化状况和规律性。
(1)指标的口径范围、计算方法计量单位一致。
(2)对比的对象要有可比性
(3)对比的指标类型必须一致
(1)利用各主要财务指标间的内在联系,对企业财务状态及经济效益进行综合分析评价的方法。
(1)数据分析报告是根据数据分析原理和方法,运用数据来反映、研究和分析事物现状、问题、缘由、本质和规律,并得出结论,提出解决问题的一种分析应用文体。
(1)平常数据通报:月度数据报告、日报表
(2)专题分析报告:用户流失分析、提高用户消费分析
(3)综合分析报告:企业运营报告、世界人口发展报告
B2C是Business-to-Customer的缩写,而其中文简称为"商对客"。"商对客"是电子商务的一种模式,也就是一般说的商业零售,直接面向消费者销售产品和服务。
12.天猫的6大优点:
14.天猫的店铺类型:旗舰店、专卖店、专营店
免费推广是指不花钱的状况下,对产品或店铺做出的推广行为。
免费推广:标题优化、宝贝上下架调整、产品属性的完整、主图的点击率
付费推广是指经过工具或方法,得到流量,从而提升店内的流量和销量。
付费推广:直通车、钻石展位、淘宝客
(1)直通车:按单次点击收费的引流工具,适合单品爆款打造。
(1)钻石展位:按千次展示收费的引流工具,适合大型活动或品牌推广。
(1)淘宝客:按成交结果收费的引流工具,适合平常推广。
22.数据分析第三方工具:江湖策,生意参谋,数据魔方
23.会员分析的目的:提升复购率、提升客单价、合理维护客户关系、恰当推广商品。
24.千牛卖家工做台是由阿里巴巴集团官方出品,由PC版本和手机版本,淘宝卖家,天猫商家都可使用。千牛工做台包含卖家工做台、消息中心、阿里旺旺、量子恒道、订单管理、商品管理等主要功能。
26.后台导航-店铺左侧栏
28.流量的本质(个性化搜索)
严格意义上来讲,爆款分二种、一种是利润爆款,一种是引流爆款。利润爆款也叫小爆款,引流爆款叫大爆款,从成本上来讲,引流爆款每每会利润较低!
(1)常规款:常规款为店铺的主营产品。此类产品多以成本导向为订价方法进行销售。区别于流量款有价格优点,区别于活动款有折扣优点,区别于利润款,毛利率并非很高。
(2)流量款:流量款多为引流产品,除有自身的产品优点外,其性价比也很占优。对于同类同质产品能在价格的引导上作出很好的示范,起到吸引店铺流量的做用。
(3)利润款:顾名思义,利润款为产品自己具备核心优点或产品类别同质同类竞争少,因此在利润的追求上会过多。
(4)活动款:活动款的订价须要留有必定的折扣空间,刺激消费者购买,每每做为促销使用。
(5)爆款:爆款的订价策略为区间浮动,根据爆款的预热期,产品价格偏低,追求性价比;到爆款的发展期,产品价格保持优点;到爆款的成熟期,价格能够略微上涨;到爆款的衰退期,低价引流为其余爆款作预热,或将爆款转为利润款,榨干该爆款的剩余价值。
(6)边缘款:此类产品销售形势较低迷,没有爆款或相对爆款的潜质,不具有其余订价策略的核心特色,每每被卖家和消费者忽视。
3.三个钻展的三个阶段
CRM实际上是指全部咱们与客户接触点的关系管理。
CRM的目的是为了知足客户需求;维护好喝客户之间的关系。
客户关系管理本质:对客户进行细分根据客户价值以及特征进行差别化营销。
网店运营靠流量,大多数工做都是围绕流量展开,不少电商人会把流量看做店铺的生命线,可是很容易走入一味砸钱买流量的误区。流量问题应该客观的看待,流量应该围绕着咱们平常运营,运营是有机会的,而流量也应该有规划,每一个点击背后都是一个个活生生的顾客,不一样的流量入口有着其固有的基因,每一个关键词的背后也表明着必定的市场需求,本章节主要分析,如何用数据化的方式精准定位本身的目标顾客,下降引流成本,从而占领主搜阵地。
咱们明确作电商是为了作生意,而非作流量,无论是从长期来讲,仍是从短时间来讲,获取流量的最终目的仍是为了成交,既然一切围绕生意,而生意应该有所计划的,那么对于流量咱们就应该有所规划。
(1)销量的目标决定流量的数量需求
公司不管大小,都会作年度规划,哪怕没有年度规划,老板心中也有一年的计划,而年度规划中很重要的一块就是销售目标规划。
首先,咱们看一下销售额公式:
销售额=流量*转化率*客单价
流量=销售额/(转化率*客单价)
在定位及产品品类不发生太大变化的状况下,大多数店铺转化率和客单价,必定时间内都比较稳定,因此咱们就能够根据销售目标来推倒出来流量的需求。
可是,要注意几点:1、不一样的流量入口,转化率及客单价会有所差别,其中活动流量所占的比重最大,能够单独考虑。2、销量目标、转化率目标、客单价目标也应该根据类目节奏和本身的综合状况进行微调。
固然,制定目标的过程也是须要和相应团队一块儿来制定的,目标的不一样决定行为的不一样,固然这个涉及到团队管理的内容,这里不作讨论,只是须要强调的是,既然目标制定了,咱们应该让团队的工做围绕目标去展开,而流量的目标应该是负责运营推广的同事去实现。
(2)转化的需求决定流量的质量需求
作电商,不只仅有流量的需求,流量的目的是为了转化,这里就涉及到一个流量质量的问题,即流量与店铺产品定位的匹配程度。不一样的流量,在同样的产品、同样的视觉及同样的客服水平面前,也会有不一样的表现,转化率、客单价、以及产品的销售结构都有所不一样。
流量质量须要怎么把控呢?这里给你们介绍一个流量质量金字塔原理:流量应该是分层的,顶部的流量相对比较少,与产品定位匹配性高,转化率高,也就是咱们所说的精准流量;中部的流量精准性良好,转化率通常,数量也比顶部的流量大;而最下面的流量则是属于比较宽泛的流量,不太精准,转化率比较低,同时流量也比较大。
咱们在获取流量的时候应该从顶部开始获取,对于不一样入口的流量获取的方法也不一样:1、天然搜索及直通车流量。天然搜索是根据关键词来获取流量的,而直通车流量本质上也属于搜索流量,只是咱们能够经过出价以及一些其余的推广技巧提升排名。经过关键词获取流量的精准性,取决于关键词的精准性,好比,对于一个卖12岁男童春秋牛仔裤的卖家来讲,“牛仔裤”,“童装牛仔裤”、“男童牛仔裤”、“男大童牛仔裤”、“男大童牛仔裤春秋”,这一系列关键词的精准性就愈来愈精准,相对来讲转化率也较高。2、钻石展位。钻展是经过向被定向的消费者展示广告,吸引消费者点击,而产生的流量。定向的准确与否,直接影响了钻展的流量精准性,同时影响钻展流量的精准程度的还有钻展素材的设计等。3、淘宝客。淘宝客的流量,若是淘宝客是经过“爱淘宝”搜索进来的流量,也是属于搜索流量,精准性取决于站外搜索的关键词的精准性。若是是经过本身招募的淘宝客进来的流量,则取决于淘宝客的平台与所营产品的匹配程度。4、活动流量。活动流量的精准性取决于活动平台上浏览的顾客与所营产品的匹配程度。
(1)顾客购物习惯的改变
消费者消费过程,由“购物”变成了“逛街”。在80年代,那时候尚未超市,咱们到商店购物,是进不了商店柜台的,顾客须要买什么,而后老板就会拿什么,这时候顾客平均停留时间极短,没有访问深度,更谈不上关联销售;到90年代之后,超市开始出现,顾客能够进入店内任意选购,这时候顾客平均停留时间开始获得增加,访问深度也开始加深,不少超市为了让顾客逛更多的东西,开始规划顾客行走路线;而宜家则把这方面作到了极致,在店内布置不一样的主题,迷宫式布局,让顾客流连忘返,还不以为累,顾客的访问深度及停留时间获得了极大的增加。
(2)顾客购物路径的改变
顾客的这种消费行为改变,在网路上依然存在,淘宝平台上,经过搜索成交的比例逐年在下降,而经过主题性活动等形式成交的比例逐步上升。这说明更多的顾客喜欢在愉悦的浏览中购物。若是说搜索流量带着理性购物的基因,更多的是一种刚性的需求,而主题性活动的流量则带着感性购物的基因,更多的是一种冲动型消费。
不一样的流量有着其特定的基因,哪怕就是每个关键词背后也是蕴含着不一样的消费群里,好比说,“婴儿推车欧式”表明着一种对品质的须要,“韩版童装”表明着一种对于潮流款式的追求,钻展也是如此,不一样的位置,不一样的定向,顾客群体都不同,在作流量规划的同时,更应该注意流量的基因是否与产品定位相匹配。
在了解了各个入口的流量基因,熟悉各个入口的流量转化率、客单价及流量成本之后,咱们能够把每一年的流量目标按月来划分,这样就是每月的流量规划表,在制定好每个月流量规划表之后,须要分解实施,同时进行监控,确保最终流量目标的达成。
大多数类目,市场的需求在一年当中会有变化,那么咱们的推广节奏也应该随着市场的变化而改变,致使市场需求变化的因素有产品自己的特性,也有平台的促销节奏,同时也跟传统的节日相关,了解整年的营销节奏,须要推广在旺季来临以前把本身的产品推到搜索排名的前几名,从而在旺季来临的时候获取大量流量。
(1) 类目销售节奏。推广节奏的安排首先须要考虑本类目的销售节奏,具体能够在数据魔方è行业分析è总体状况中查看,须要注意的是查询时间须要选择1年。
(2) 子类目销售节奏。光分析类目营销节奏还不够,咱们还须要看每一个子类目的销售节奏。能够在行业选择的时候,选择子类目查看,一样时间也须要选择1年。
(3) 单品生命周期。涉及到单品打造的时候,还须要考虑单品的生命周期,咱们能够在淘宝指数,根本本产品的主搜关键词进行查询。例:男童长袖T恤。
在了解所经营产品的销售节奏之后,就须要针对性的进行推广投入、老顾客营销、组织促销活动,在进入快速增加的时候大量投入,而进入成熟期之后,能够根据每一个波段进行阶段性投入。
作营销还讲究师出有名,咱们全部的活动必需要有主题,能够是传统节日、重要的文体赛事、突发的热门话题等等,咱们能够对整年的相关主题进行总结。
而不一样的主题适合的活动也不同,有些是能够用来塑造品牌,有些是能够进行大规模促销,促销也须要避免频率过高,不一样的类目能够进行自行选择。
每一年淘内的平台也会有本身的营销节奏安排,如传统的“双十一”、“双十二”、“66大促”、“99大促”等,同时类目也会有一些平常的营销安排,不一样类目会有所不一样,具体能够参考类目帮派。
若是了解了平台的营销节奏,咱们就能够把店内营销活动和平台的营销活动结合,灵活借力;同时咱们还须要了解各活动的要求,争取可以参与进去。
最后咱们能够制定店铺的整年营销计划表,针对不一样时间点的热销类目,结合当时的热点时事或者即日,整合平台的资源,提升店铺的营销活动效果。
按照PV计算,前三页占有全部PV的84%,其中第一页65%,第二页11%,第三页7%,而从点击即IPV的角度,前三页占有全部IPV的86%,其中第一页占68%,第二页占12%,第三页占6%,从成交金额来看第一页更是占了全部成交金额的88%,占成交笔数的87%。这说明了占领排名无论对于流量获取来讲,仍是对于最终成交来讲,都显得特别重要。
(1)上下架时间的概念及影响。淘宝的排名中有一个模型叫作时间模型,天猫和淘宝中的全部宝贝上架后第7天都会有下再上架的过程,在淘宝搜索中,下架以前的一段时间内,在综合排序里宝贝会获得必定的加权,竞争的宝贝数越多,获得的加权时间就越短。
(2)一天中的顾客访问高峰。在淘宝平台上,不一样的时间点访问的人数,搜索的人数都不一样,不一样类目的顾客访问的时间也有所差异,具体咱们能够经过数据魔方è行业分析è卖家信息分析,中查看查询。
(3)根据顾客来访高峰来安排上下架。能够看出来,PC的访问时间与无线的访问时间有所差异,无线更集中在晚上,为了得到一个较好的排名,咱们会把主推的宝贝放到流量较大的时间段,那么若是店铺产品更适合于顾客在PC上浏览,则能够多根据PC端上下架时间进行安排,若是店铺产品属于单价比较低的快速决策类产品,即顾客购买所要花的决策时间比较短的话,能够多安排在晚上20:00到23:00上下架。
有一种状况须要注意,其实安排上下架的时候就相似于田忌赛马,有些时候咱们宝贝的竞争力不强,而行业竞争又很激烈,这些宝贝其实仍是建议安排在竞争较小的时间段上下架。
通常状况下(具体能够用一些软件来查看类目的竞争状况),早10点的竞争较为激烈,可是早10点的流量跟一天当中下午及晚上的流量相差不大,因此安排上下架的时候也须要重点考虑。
若是处于爆款竞争的类目,建议卖家监控竞争对手的上下架时间,来针对性的安排本身店铺宝贝的上下架时间。
(4)上下架须要考虑的同店打散原则。搜索中有个同店打散原则,即除了豆腐块(人气及综合排序的前三名为商城位置,成为豆腐块),每一个搜索结果页面(综合和人气)出现的同店产品最多不会超过2个。那么这是时候就遇到了问题,若是一个店铺内同类产品,被统一关键词覆盖,都在同一时间段上下架,那么即便全部宝贝的人气都很高,也只能在统一页面出现2个,其余产品都会被挤到后面去,因此为了获得最大量的曝光,咱们能够在安排上下架时间的时候,同类产品分开,店内最热销的款上下架时间的当天,甚至能够不安排同类产品。
(5)经过上下架考虑避开强劲竞争对手。咱们甚至有办法经过一些软件查询同类热销产品的上下架时间,为了避开强劲竞争对手,咱们能够把本身产品与竞争对手产品错开时间进行上下架。
理解了以上的原理,现提供一个工具帮助读者安排本身产品的上下架时间,从而有效的提升展示量。
第一步:把店内产品根据不一样的类别进行分类,把被同一类关键词覆盖的产品放到同一类别里:
第二步:根据顾客来访高峰,把产品的上下架时间安排在不一样的时间段。
图10上下架时间计划表
小技巧:(1)在调整上下架时间的时候,适宜把时间往自己的上下架时间日后移,而避免往前移,举个例子,若是一款产品是周一早上11点15分下架,那么咱们调整的时候能够调整到周一11点15分之后,而不要调整到周一的11点15分之前,以免损失一次下架时间以前的曝光。(2)按照访问高峰安排上下架同时面临的一个挑战就是,那个时间段竞争会比较激烈,若是一个新开的店铺,能够在次高峰时间段安排上下架,避开高峰,能获得一个更长时间的搜索加权。
橱窗推荐(又名卖家热推),即每位商家根据店铺实际经营状况,将店铺内最有竞争力的宝贝经过设置成橱窗推荐的方式(在“我是卖家”—“宝贝管理”—“橱窗推荐”中设置),在淘宝搜索排序中,其余条件相同的状况下,橱窗推荐宝贝将得到优先展现机会。橱窗推荐规则仅应用在淘宝搜索排序下,不影响天猫搜索排序。
(1)集市店新橱窗得到规则
星级卖家奖励10个橱窗位; 钻级卖家奖励20个橱窗位; 冠级卖家奖励30个橱窗位。 |
|
开店时间少于90天内,奖励10个橱窗位; 开店时间满1年奖励2个橱窗位; 开店时间满2年奖励5个橱窗位; 开店时间满3年奖励10个橱窗位。 |
|
缴纳消保保证金的,奖励5个橱窗位 |
|
店铺周成交额(不一样类目有所差别) |
周成交额是指上周的周成交额,计算周期为周四0点至周三23:59:59; 根据你的信用等级,店铺上周支付宝周成交额:达到XX金额时,奖励30个橱窗位;达到XX金额时,奖励45个橱窗位 |
金牌卖家奖励:5个橱窗位 |
|
通常违规扣分(A类扣分)满12分及以上,扣除5个橱窗位; 严重违规扣分(B类扣分)满12分及以上,扣除10个橱窗位; 出售假冒商品被违规扣分(C类扣分)满24分及以上,扣除20个橱窗位。 |
(2)天猫店橱窗得到规则
2013年4月18日生效的《天猫橱窗推荐规则》根据天猫商家每月(以天然月为计算单位)的销售金额,分设七个层级,每一个层级有不一样的橱窗推荐位数量。
月销售金额:指上个天然月成交而且已成功的交易。
(3)利用橱窗推荐提升展示量
橱窗推荐会影响搜索结果的综合排序和人气排序,会有很是高的加分,为了将流量集中到咱们的优点宝贝,通常咱们会设置10-15个橱窗位(根据宝贝数的多少和橱窗位的多少会有所调整)推荐临近下架时间的宝贝,其余的橱窗推荐位推荐店内最热销或者最想主推的宝贝。
标题关键词的优化是搜索优化的重要组成部分,这是不少卖家最感兴趣的工做,却又以为难如下手,这里只是从提升展示量的角度跟你们分享几个要点,重要提示,一下只是搜索的一些小技巧和知识,具体实施须要结合所经营的类目进行融会贯通:
(1)尽可能的覆盖更多的搜索关键词。咱们分析淘词的TOP500词就会发现,对于大多数类目来讲,TOP500词都是有为数很少的字进行各类各样的排列组合,而只要标题中覆盖了消费者搜索的关键词,只要不存在分词上的问题,那么理论上都有可能被搜索到,因此咱们能够在优化标题的时候考虑到尽可能多的覆盖搜索关键词。
(2)利用彻底匹配提升可拆分关键词的关键词匹配分。在人气排序中,关键词的匹配分是人气的一个组成部分,什么叫彻底匹配,举个例子,好比在搜索“男童牛仔裤”这个关键词,这个关键词在搜索过程当中会被拆成“男童牛仔裤”这样的几个词根,在童装类目中,只要包含“男童牛仔裤”这几个词根的,无论排列顺序如何,均可以被检索到,可是先后顺序一致,并紧密排列的关键词会获得最高的关键词匹配分。若是咱们想提升单个的关键词展示量,能够采用彻底匹配的技巧。
(3)合理利用长尾词,避开强劲竞争对手。每一个关键词背后都是由于有特定的人群来搜索,其实每一个关键词就对应一个市场,关键词的竞争度有强有弱,具体咱们能够在数据魔方è全网关键词查询,输入宝贝的主推关键词,分析查询结果。
咱们以淘宝平台上搜索量最大的连衣裙为例,能够看到下图,仔细分析,咱们发现根据搜索指数排序,和当前宝贝数排序并不相同,这样咱们就能够用搜索指数除以当前宝贝数,得出单个关键词的竞争激烈程度。再参照转化率能够兼顾转化效果来挑选竞争蓝海市场,咱们参照直通车点击单价,能够挑选在直通车推广中相对竞争较弱的词。
咱们能够看到“早秋新款套装连衣裙”、“森系连衣裙”等关键词竞争热度都小于周围的其余关键词,若是咱们宝贝跟这些关键属性比较相符的话,咱们能够把它们添加到咱们的宝贝标题中来。
一、从fruits表中检索全部字段的数据,SQL语句以下:
二、查询fruits表中f_name列全部水果名称,SQL语句以下:
四、查询价格为10.2元的水果的名称,SQL语句以下:
五、查找名称为“apple”的水果的价格,SQL语句以下:
七、在suppliers表中查询s_city等于“Tianjin”的供应商s_id,而后在fruits表中查询全部该供应商提供的水果的种类,SQL语句以下:
八、在suppliers表中查询s_city等于“Tianjin”的供应商s_id,而后在fruits表中查询全部非该供应商提供的水果的种类,SQL语句以下:
十、在fruits表中,查找f_name字段中包含字母’o’或者’t’的记录,SQL语句以下:
十二、删除fruits表中的外键,SQL语句为:
1三、查询fruits表中的信息,并将结果首先按照s_id升序排列,在按照水果名称降序排列:
1四、修改fruits表中s_id的字段名,将字段名改成fs_id,其他信息不变,SQL语句为:
1五、输出fruits表中第3行到第7行的数据,SQL语句为:
1六、查询fruits表中供应商信息及各供应商提供水果的平均价格,SQL语句为:
1七、查询fruits表中每一个供应商供应的水果大于4.5元的记录,SQL语句为:
1八、查询fruits表中供应商的信息,SQL语句以下:
1九、查询fruits表中有多少个供应商,SQL语句以下:
20、查询fruits表中每一个供应商所供应水果价格最高的记录;
2一、在fruits表中添加一字段名为num的字段,数据类型为int,默认值为3;(该字段为销售量的意思)
2二、查询fruits表中供应商总销售额前三名的信息及销售额;
2三、查询fruits表的信息,并添加‘单价情况’的信息,若是单价低于5元,则标明‘低于5元’,若是单价高于10元,则代表’高于10元’,其余的状况,请代表‘5-10元’,SQL语句为:
主键:primary key 对字段具备非空和惟一的约束; 索引
非空:not null 字段中的值不能为空;
惟一键: unique 字段中的值不能出现重复数据; 索引
外键:foreign key 让一张表中一字段的数据对另外一张表中对应字段的 数据取值范围进行约束,保证数据一致性;
默认值:default 设定默认值
自增:auto_increment 只能在具备主键或惟一键的字段上添加;
第一范式:数据表的单个字段中变量只能有一个。
例:岗位:销售部经理 —>部门:销售部 职位:经理.
第二范式:知足第一范式的条件下,表中字段名的数据由一个字段主键决定;
例:一个订单多个商品:
(订单号,商品号)->商品名称,商品价格
订单表:订单号、客户号、订单时间
中间表:订单号、商品号、销售量
商品表:商品号、商品名称、商品价格
第三范式:知足第二范式的条件下,表中字段与主键是直接联系,而非间接关联:
例子:员工表:员工号、员工名、部门号、部门名..
员工表:员工号、员工名、部门号...
部门表:部门号、部门名称....
从MySQL中导出数据:
一、将某数据库中的全部表导出来:
注意:cmd 中运行,不能语句结束以后不能用;结尾
不能再数据库中运行命令
没有数据库的信息,只有表的信息
三、如何导出全部的库:
四、如何导出特定库中特定表的数据:
五、如何以库为单位导入sql文件:
六、对于表级的备份文件:
七、只导出数据结构,不导出数据
九、导出为txt的文件:
十、将csv或txt文件导入到数据库中
导出csv和txt文件时,格式要定义好,
fields terminated定义字段终止用什么来区分,咱们用的是“,”来区分的,optionally enclosed by’”’表示把数据文件中的字符
串加双引号“ " ”来封闭,escaped by用来规定转义字符。
一、绝对值ABS:求2,-3.3和-33的绝对值,输入语句以下:
三、返回最小整数CEILING:使用CEILING函数返回最小整数,输入语句以下:
八、使用RIGHT函数返回字符串中右边的字符,输入语句以下:
九、使用MID()函数获取指定位置处的子字符串,输入语句以下:
十、使用LOCATE,POSITION,INSTR函数查找字符串中指定子字符串的开始位置,输入语以下:
十一、使用FIND_IN_SET()函数返回子字符串在字符串列表中的位置,输入语句以下:
十二、使用ifnull()函数对null空值进行判断,若是为空,输出第二个值。
1三、使用日期函数current_date()获取系统当前日期,输入语句以下:
1四、使用时间函数current_time()获取系统当前时间,输入语句以下:
1六、使用MONTH()函数返回指定日期中的月份,输入语句以下:
1七、使用MONTHNAME()函数返回指定日期中的月份的名称,输入语句以下:
10.影响无线搜索的十大权重
五、按照供应商来查询表中水果的总销售额:
查询fruits信息的存储过程;
设有N条随机记录,不用索引,平均查找N/2次。
hash(哈希)索引:1次(理论上)
创建数据表books_1,在pubdate上创建普通索引,数据以下
二,在已经存在的表上建立索引;
视图是由查询结果造成的一张虚拟表,表格数据的更新,视图显示的数据也会同时更新,可是,视图的增删改一样会修改表中的数据(只有一一对应的时候才能够修改)。
在商品表tt1中插入数据:
一、客户下订单,订单表中插入数据:('1001','1112',4),建立触发器,要求商品表自动减去相应的商品库存:
二、客户取消订单,取消订单'1001',建立触发器,要求商品表自动添加相应的商品库存:
三、客户修改订单,将订单'1001'的数量改成8,要求商品表的库存自动进行相应的调整.
四、客户下订单,限购要求:每种商品最多只能购买5件,建立存储过程,自动调整下单num和商品表相应的库存.
4.上库存不能大于库存上限
修改密码以后,赋予权限的人须要刷新一下权限
注意:若是没有~的话,则?为通配符,有~的话,?号表示?号自己。
终于来搞JS部分了,真的是太多了
事件流都经历三个阶段:事件捕获阶段,处于目标阶段,事件冒泡阶段
事件模型可以分为三个阶段:
事件绑定监听函数比较简单,有两种方式:
typeof
是一个一元运算符,返回是一个字符串,该字符串说明运算数的类型
instanceof
运算符用于检测构造函数的prototype属性是否出现在某个实例对象的原型链上。
1、typeof会返回一个变量的基本类型,instanceof返回的是一个布尔值
2、instanceof可以准确的判断复杂引用数据类型,但不能正确判断基础数据类型
3、typeof可以判断基础数据类型(null除外),但引用数据类型中,除了function类型之外,其他的也无法判断
事件代理,通俗的讲,就是把一个元素响应事件的函数委托到另一个元素。
如果我们有一个列表,列表之中有大量的列表项,我们需要在点击列表项的时候响应一个事件,如果给每个列表项都绑定一个函数,那对于内存消耗是非常大的,这个时候就可以事件代理,把点击事件绑定在父级元素ul上去,在执行事件的时候匹配目标元素。
事件委托的局限性:focus
、blur
无法进行委托绑定事件;mousemove
、mouseout
不适合事件委托
new关键字主要做了一下工作:
1、创建一个新的对象obj({})
3、将构建函数中的this绑定到新建的对象obj上
4、根据构建函数返回类型作判断,如果是基本数据类型则被忽略,如果是引用数据类型,new实例失效,需要正常返回
ajax
原理简单的来说通过XmlHttpRequest
对象来向服务器发送异步请求,从服务器获得数据,然后用javaScript
来操作DOM而更新页面。
5、接受并处理服务端向客户端响应的数据结果
6、将处理结果更新到HTML页面中
bind、call、apply作用都是改变函数执行时的上下文;
1、三者都可以改变函数this的对象指向
2、三者第一个参数都是this要指向的对象,如果没有这个参数就为undefined或null,则默认指的是全局window
3、三者都可以传参,但apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入
4、bind是返回绑定this之后的函数,apply,call则是立即执行
JS是一门单线程的语言,意味着同一时间内只能做一件事,但是这不意味着单线程就是阻塞,防止单线程阻塞的方法就是 事件循环。
同步任务与异步任务的运行流程图如下:
同步任务进入主线程,即主执行栈,异步任务进入任务队列,主线程内的任务执行完毕为空,会去任务队列读取对应的任务,推入主线程执行。
querySelector 传入任何有效的css选择器,即可选中单个DOM元素(首个)
querySelectorAll 返回一个包含节点子树内所有与之相匹配的Element节点列表,如果没有相匹配的,则返回一个空节点列表
BOM,浏览器对象模型
递归,在数学和计算机科学中,是指在函数的定义中使用函数自身的方法。
如果一个函数内部调用自身,这个函数就是递归函数。
尾递归,即在函数尾位置调用自身,没有常量。
好处:在递归调用的过程中,递归次数过多容易造成栈溢出,而使用尾递归,即一个函数中所有的递归形式调用都出现在函数的末尾,对于尾递归来说,由于只存了一个调用记录,所有永远不会发生“栈溢出”错误。
内存泄漏是在计算机科学中,由于疏忽或错误造成程序未能释放已经不再使用的内存。
内存泄漏,我们可以通过垃圾回收来进行回收。
垃圾回收:JS代码运行时,需要分配内存空间来存储变量和值。当变量不在参与运行时,就需要系统收回被占用的内存空间,这就是垃圾回收。
通常垃圾回收的方式有两种实现方式:
但变量进入执行环境时,标记这个变量“进入环境”。进入环境的变量所占用的内存就不能释放,当变量离开环境时,则将标记为“离开环境”。
垃圾回收程序运行的时候,会标记内存中存储的所有变量。然后,它将所以在上下文中的变量,已经被在上下文中的变量引用的变量标记去掉。在此之后,带有标记的变量就是待删除的,原因是任何在上下文的变量都访问不到她们了,随后进行垃圾回收程序一次内存清理,销毁带有标记的所有值收回它们的内存。
语言引擎有一张“引用表”,保存了内存中里面的所有资源,如果一个次数为0,就表示这个值不再用到了,因此就可以把这块区域释放。
indexedDB是一种低级API,用于存储客户端大量结构化数据。
1、储存量理论上没有上限
2、所有的操作都是异步的
3、原生支持存储JS对象
4、是个正经的数据库,意味着数据库能做的事情它也能做
2、有效时间:locaStorage存储持久,浏览器关闭后数据不会丢失,除非自己手动删除;sessionStorage,浏览器关闭数据也就删除;cookie可以设置过期时间;
3、数据与服务器之间的交互方式:cookie的数据会自动传递给服务器,而sessionStorage,localStorage不会自动把数据发送给服务器,仅在本地保存。
函数式编程是一种“编程范式”,一种编写程序的方法论。JS是一门以函数为第一公民的语言,必定式支持一种编程范式的,以下是JS中的函数式编程
使用纯函数,可以产生可测试的代码;
不依赖外部环境计算,不会产生副作用,提高函数的复用性;
可以组转成复杂任务的可能性
高阶函数就是以函数作为输入或者输出的函数被称为高阶函数
柯里化是接受多个参数的函数,变成接受一个单一参数,并且返回接受余下的参数。
1、让函数的职责更加单一。柯里化可以实现让一个函数处理的问题尽可能的单一,而不是将一大堆逻辑交给一个函数来处理。
2、提高函数参数逻辑复用
函数缓存,就是将函数运算过的结果进行缓存,本质上就是用空间换时间。
实现函数缓存主要依靠闭包,柯里化,高阶函数。
1、对于昂贵的函数调用,执行复杂计算的函数
2、对于具有有限且高度重复输入范围的函数
3、对于具有重复输入值的递归函数
4、对于纯函数,即每次使用特定输入调用时返回相同输出的函数
节流:n秒内只运行一次,若在n秒内重复触发,只有一次生效;
防抖:n秒后在执行该时间,若在n秒内被重复触发,则重新计时.
电梯第一个人进来后,15秒后准时运送一次,这是节流;
电梯第一个人进来后,等待15秒。如果过程中又有人进来,15秒等待重新计时,直到15秒后开始运送,这是防抖.
1、函数防抖,在一段连续操作结束后,处理回调。利用clearTimeout和setTimeout实现。函数节流,在一段连续操作中,每一段时间只执行一次;
2、函数防抖关注一定时间连续触发的事件,只在最后执行一次。而函数节流一段时间内只执行一次,多次变成少次。
分片上传,就是将多要上传的文件,按照一定的大小,将整个数据块来进行分片上传。上传之后再由服务端对所有上传的文件进行汇总整合成原始的文件。
断点续传指的是在下载或上传时,将下载或上传任务人为的划分为几个部分。每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传下载未完成的部分,而没必要从头开始上传下载。用户可以节省时间,提高速度。
clientHeight:它是一个定值,表示屏幕可视区域的高度
2、监听原生touchmove
事件,记录并计算当前滑动的位置值与初始位置值的差值,大于0表示向下拉动,并借助CSS3的translateY
属性使元素跟随手势向下滑动对应的差值,同时也应设置一个允许滑动的最大值;
3、监听原生touchend
事件,若此时元素滑动达到最大值,则触发callback
,同时将translateY
重设为0,元素回到初始位置。
better-scroll
是一款重点解决移动端(已支持PC)各种滚动场景需求的插件。
单点登录,简称SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
淘宝,天猫都属于阿里旗下,当用户登录淘宝后,再打开天猫,系统便自动帮助用户登录了天猫,这种现象就属于单点登录。
【同域名下的单点登录】
将cookie
的domain
属性设置为父域的域名(主域名),同时将cookie
的path
属性设置为根路径,将SessionID(或Token)
保存到父域中,这样所有的子域应用都可以访问到这个cookie
【不同域名下的单点登录】
(1)用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 token 写入 Cookie(注意这个 Cookie是认证中心的,应用系统是访问不到的)
(2)应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心.由于这个操作会将认证中心的 Cookie 自动带过去,因此,认证中心能够根据 Cookie 知道用户是否已经登录过了
(3)如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录;如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL,并在跳转前生成一个 Token,拼接在目标URL 的后面,回传给目标应用系统
(4)应用系统拿到 Token之后,还需要向认证中心确认下 Token 的合法性,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token写入Cookie,然后给本次访问放行。
此实现方法相对复杂,支持跨域,扩张性好,是单点登录的标准做法。
前端拿到Token
后,处理将它写入自己的LocalStorage
中之外,前端通过 iframe+postMessage()
方式,将同一份 Token
写入到了多个域下的 LocalStorage
中,前端每次在向后端发送请求之前,都会主动从
LocalStorage
中读取Token
并在请求中携带,这样就实现了同一份Token
被多个域所共享.
Sql注入攻击,是通过将恶意的sql查询或添加语句插入到应用的输入参数中,再在后台Sql服务器上解析执行进行的攻击。
1、严格检测输入变量的类型和格式;
2、过滤和转义特殊字符;
3、对访问数据库的web应用程序采用Web应用防火墙
Symbol代表创建后独一无二不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题。
BigInt是一种能够表示任意精度,安全地存储和操作的大整数的数字类型。即使这个数已经超出了Number能够表示的安全整数范围
两种类型的区别在于存储位置的不同:
1、原始数据直接存储在栈中的简单数据段,占据空间大小,大小固定,属于被频繁使用数据,所以放入栈中存储;
2、引用数据类型存储在堆中的对象,占据空间大,大小不固定。引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
}"而Object
原型上输出的是其类型。我们可以看出Object
对象和它的原型链上各自有一个toString()
方法,第一个返回的是一个函数,第二个返回的是值类型。而Array
,function
等类型作为Objec
t的实例,都重写了toString
方法。不同的对象类型调用的toString
方法是,调用的不是对象原型上的方法,而是重写的toString
方法。所以采用obj.toString()
不能得到其对象模型,只是将obj
转换为字符串类型;因此想要得到对象的具体类型时,应该调用Object.prototype.toString()
方法
1、Undefined
和Null
都是基本数据类型,这两个基本数据类型分别都只有一个值,就是undefined和null
;
2、undefined
代表的含义是未定义,null
代表的含义是空对象;一般变量声明了但还没有赋值的时候就会返回undefined
,null
主要用于赋值给一些可能会返回对象的变量,作为初始化;
3、undefined
不是JS中的一个保留字,但最好还是不要使用undefined
作为变量名;typeof(null)
返回值是object
,这是一个历史遗留的问题。
1、undefined
:在作用域中声明过但是没有赋过值的变量;
2、undeclared
:没有在作用域中声明过的变量
3、undefined
是JS中的语言类型之一,访问一个undefined
的变量时,浏览器不会报错并且返回undefined
;undeclared
是JS中的一种语法错误,访问一个undeclared
的变量时,浏览器会报错,JS执行会中断。
typeof
是一个一元运算,它返回值是一个字符串,该字符串说明运算数的类型。
在JavaScript第一个版本中,所以值都存储在32位单元中,类型标签存储在每个单元的低位中,共有五种数据类型。
000 :object 当前存储的数据指向一个对象
001:int 当前存储的数据是一个31位的有符号整数
010:double 当前存储的数据指向一个双精度的浮点数
100:string 当前存储的数据指向一个字符串
110:boolean 当前存储的数据是布尔值
null
的类型标签也是000,和Object
的类型标签一样,所以会被判定为Object
。
instanof运算符用于判断构造函数prototype属性是否出现在对象的原型链中的任意位置。
// 判断构造函数的prototype对象是否在对象的原型链上 // 如果没有找到,就继续从其原型上找,Object.getPrototypeOf方法来获取指定对象的原型
undefined
是一个标识符,所以可以被当作变量来使用和赋值。void
并不会改变表达式的结果,只是让表达式不返回值,因此可以用void 0
来获得undefined
。
NaN指的不是一个数字,用于指出数字类型中的错误情况,即“执行数学运算没有成功,这是失败返回结果”
isNaN
函数会首先进行Number
函数转换,如果转换后为number
类型,则返回false
,否则返回true
;
对于 == 来说,如果对方的类型不一样,就会进行类型转换,如果不同,就会进行如下流程:
1、首先判断两者类型是否相同,相同的话就比较两者的大小;
2、类型不相同的话,就进行类型转换;
4、判断两者类型是否为string
和 number
,是的话就会将字符串转换为number
;
5、判断一方是否为boolean
,是的话就会把boolean
转为number
,再去进行判断;
6、判断其中一方是否为object
且另一方为string
,number
或者symbol
,是的话就会调用ToPrimitive()
内部函数(内部详细转换还需看下37题),将object
转为字符串进行判断。
1、使用 ==
进行判断时,如果两边的类型不一致,则会进行强制类型转化后再进行比较;
2、使用 ===
进行相等判断时,不会强制类型转换,直接返回false;
3、使用Object.is()
进行判断时,一般情况和===
相同,它处理了一些特殊的情况,比如-0和+0不再相等,两个NaN
是相等.
基本数据类型的值不是对象,因此从逻辑上讲它们不应该有方法的属性,然后事实并不是我们所想的那样。为了方便操作基本数据类型的值,JavaScript中的原始数据类型的值会在后台隐式地包装为对象,从而引出了基本包装类型的概念。
执行第二行时:创建String类型的一个实例,在实例上调用指定的属性,再销毁该实例 执行第三行时:创建String类型的一个实例,在实例上调用指定的属性,再销毁该实例
引用类型和基本包装类型的区别:对象的生存期
使用 new
操作符创建的引用类型的实例,在执行流离开当前作用域之前,会一直保存在堆内存中。而后台自动创建的基本包装类型的对象,则只存在一行代码的执行瞬间,然后立即被销毁。这意味着我们不能为基本类型的值添加属性和方法。
ToPrimitive
是javaScript
中每个值隐含的自带的方法,用来将值(无法是基本类型值还是对象)转为基本类型值。如果值为基本类型,则直接返回值本身;如果值为对象,其看起来大概是这样:
以下是基本数据类型的值在不同操作符的情况下隐式转换的规则:
1、+
操作符,两边有至少一个string类型变量时,两边的变量都会被隐式转为字符串,其他情况转为数字;
2、- * 、\
操作符NaN也是一个数字;
3、==
操作符,两边尽量转为number
;
4、< >
比较符,如果两边都是字符串,则比较字母表顺序,其他情况转为数字再比较;
5、如何是对象比较,会先转为基本类型在进行转换:
Javascript中有Number.MAX_SAFE_INTEGER
表示最大安全数字,计算结果是0991
,即在这个数范围内不会出现精度丢失(小数除外)。但是一旦超过这个范围,js就会出现计算不准确的情况,这在大量计算的时候不得不依靠一些第三方库来解析bignumber.js
处理大整数,所以官方就提出BigInt
来解决此问题。
创建BigInt,只需要在整数末尾追加n即可
两者都是浅拷贝,会修改原来的数据。
1、Object.assign()
方法接受的第一个参数作为目标对象,第二个参数作为源对象。然后把所有源对象合并到目标对象中。它修改了一个对象,就会触发ES6 的setter;
2、扩展操作符(…)使用它时,数组或对象中的每一个值都会被拷贝到一个新的数组或对象中,它不复制继承的属性或类的属性,但是它会== 复制ES6的symbol属性 ==(表示独一无二的值,最大的用法来定义对象的唯一属性名)
(1)块级作用域:块作用域由{ }
包括,let
和const
具有块级作用域,var
不存在块级作用域;
(2) 变量提升:var
存在变量提升,let
和const
不存在变量提升,即在变量只有声明之后使用,否在会报错;
(3)给全局添加属性:浏览器的全局对象是window
,Node
的全局对象是global
。var
声明的变量为全局变量,并且会将该变量添加为全局对象的属性,但是let
和const
不会;
(4)重复声明:var
可以重复声明变量,后面声明的同名变量会覆盖之前声明的变量。const
和let
不允许重复声明变量;
(5)暂时性死区:在使用let
、const
声明变量之前,该变量都是不可用的。在语法上称为暂时性死区。使用var
声明的变量不存在暂时性死区;
(6)初始值设置:在变量声明时,var
和let
可以不要设置初始值,而const
声明变量必须设置初始值;
(7)指针指向:let
创建的变量时可以更改指针指向(可以重新赋值),但const
声明的变量是不允许改变指针的指向。
const
定义的如果是基本数据类型,定义后就不可再修改,如果修改,就会报错;
但如果是对象的属性,const
定义的对象中保存的是指向对象的指针,这里的“不变”是指向对象的指针不变,而修改对象中的属性并不会让指向对象的指针发生变化,所以用const
定义对象,对象的属性是可以改变的。
箭头函数是ES6
中提出来的,它没有prototype
,也没有自己的this
指向,更不可以使用arguments
参数,所以不能New
一个箭头函数。
(1)箭头函数比普通函数更加简洁;
(2)箭头函数没有自己的this
,没有自己的arguments
,没有prototype
,不能作为构造函数使用;
(3)箭头函数继承来的this指向永远不会改变,call()、apply()、bind()
等方法不能改变箭头函数中的this
的指向;
(4)箭头函数不能用作Generator
函数,不能使用yield
关键字的阻塞原理.
扩展运算符,是将数组转为分割的参数序列。
(1)对象的扩展运算符(…)用于取出参数对象中所有可能遍历属性,拷贝到当前对象之中;
注意:如果用户自定义的属性,放在扩展运算符后面,则扩展运算符内部的同名属性会被覆盖;
(2)数组的扩展运算符可以将一个数组转为用空格分隔的参数序列,且每次只能展开一层数组;
数组的扩展运算符的应用:
1、将数组转换为参数序列
4、扩展运算符与解构赋值结合起来,用于生成数组
(注意:如果将扩展运算符用于数组赋值,只能放在参数的最后一位,否则会报错)
5、将字符串转为真正的数组
6、使用Math函数获取数组中特定的值
解构是ES6提供的一种新的提取数据的模式,这种模式能够从对象或数组里有针对性地拿到想要的数值。
在解构对象时,是以属性的名称为匹配条件,来提取想要的数据的。
注意:对象解构严格以属性名作为定位依据,所以就算调换了name和age的位置,结果也是一样的。
如何提取高度嵌套的对象里面的指定属性?
像此处的 name 这个变量,嵌套了四层,此时如果仍然尝试老方法来提取它: 显然是不奏效的,因为 school 这个对象本身是没有 name 这个属性的,name 位于 school 对象的“儿子的儿子”对象里面。 要想把 name 提取出来,一种比较笨的方法是逐层解构: 但是还有一种更标准的做法,可以用一行代码来解决这个问题:
ES6中引入rest
参数(形式为’…变量名’),用于获取函数的多余参数,或者处理函数参数个数不确定的情况。
ES6以前都是有拼接字符串+,现在提出“模板语法”概念,字符串更加容易拼了,也更易读了,代码整体的质量都变高了。
1、运行使用${}方式嵌入变量 2、在模板字符串中,空格,缩进,换行都会被保留 3、模板字符串完全支持“运算”式的表达式,可以在${}里面完成一些计算ES6新增的字符串方法:
map本质上就是键值对的集合。
Map数据结构有一下操作方法:
set(key,value)设置键名key对应的键值value,返回整个Map结构,如果key已经有值,则键值会被更新,否则就新生成该键。 has(key)该方法返回一个布尔值,表示某个键是否在当前Map对象中Map结构原生提供是三个遍历器生成函数和一个遍历方法:
keys() 返回键名的遍历器
weakMap
对象也是一组键值对的集合,其中的键是弱引用的。其键必须是对象,原始的数据类型不能作为key值,而值可以是任意的。
强引用:对象在JavaScript中是强引用,也就是将一个引用对象通过变量保存下来,那么这个变量或者常量就是强引用,这个对象不会被回收;
弱引用:将一个对象作为键添加到WeakMap或WeakSet中并不能防止这些对象被回收。
1、WeakMap
的键名只支持对象,Map
的键名可以是任意值;
2、由于WeakMap
的成员随时可能被垃圾回收机制回收,成员的数量不稳定,没有size
属性。WeakMap
不能遍历,Map
可以遍历
3、WeakMap
是弱引用,成员随时可以消失,可以防止内存泄漏
JSON是一种基于文本的轻量级的数据交换格式。它可以被任何的编译语言读取和作为数据格式来传递。
JSON的语法是基于JS的,因此很容易将JSON和JS中的对象弄混,但是应该注意的是JSON和JS中的对象不是同一回事。JSON中对象格式更加严格,比如说在JSON中属性值不能为函数,不能出现NaN这样的属性值等。
在JS中提供了两个函数来实现JS数据结构和JSON格式的转换处理
延迟加载就是等页面加载完成之后再加载JS文件。JS延迟加载有助于提高页面加载的速度。
1、defer属性:文档解析完成后再解析执行这个脚本文件,这样的话就能使页面的渲染不被阻塞。多个设置了defer属性的脚本按规范来说最后是顺序执行的。
2、async属性:这个属性会使脚本异步加载,不会阻塞页面的解析过程,但是当脚本加载完成后立即执行js脚本,这个时候如果文档没有解析完成的话同样会阻塞。多个async属性的脚本的执行顺序是不可预测的,一般不会按照代码的顺序依次执行。
3、动态创建DOM方法:动态创建DOM标签的方式,可以对文档的加载事件进行监听,当文档加载完后再动态的创建script标签引入js脚本
4、使用setTimeout延迟方法:设置一个定时器来延迟加载js脚本文件
5、让JS最后加载:将js脚本放到文档的底部,来使js脚本尽可能的在最后来加载执行
一个拥有length属性和若干索引属性的对象就可以被称为类数组对象,类数组对象和数组类似,但是不能调用数组的方法。
常见的类数组对象有arguments
。
ASCII
码称为美国标准信息码,它是专门为英语而设计的,有128
个编码,对其他语言无能为力,它表示的编码有限,要想表示其他语言的编码,还是要使用Unicode
来表示,可以说Unicode
是ASCII
的超集。
Unicode
叫做统一码,万国码,单一码。Unicode
是为了解决传统的字符编码方案的局限而产生的。
2、UTF-16
使用变长码元序列的编码方式,比较复杂、因为其引入了独特的代理。
3、UTF-8
需要判断每个字节中的开头标记信息,所以如果某个字节在传送过程中出错了,就会导致后面的字节也会解析出错,而UTF-16
不会判断开头标记,即使错也只会错一个字符,所以容错能力较强;
4、如果字符内容全部英文或者英文与其他文字混合,但是英文占绝大部分,那么用UTF-8
就比UTF-16
节省了很多空间;那如果字符内容全部是中文这类似的字符或者混合字符中中文占绝大多数,那么UTF-16
就占优势了,可以节省很多空间。
定义:参加运算的一个数据按二进制进行“取反”运算
总结:对一个二进制数按位取反,即将0变1,1变0,当发现按位取反为负数时,就直接取其补码,变成十进制
arguments
是有length
属性和若干个索引的对象,与数组相似,但是没有数组常见的方法属性。
要遍历类数组,有三种方法:
1、escape
是对字符串进行编码(而另外两种是对URL),作用是让它们在所有电脑上可读。
变量提升的表现是,无论在函数中何处位置声明的变量,好像都被提升到了函数的首部,可以在变量声明前访问到而不会报错。
造成变量声明提升的本质原因是 JS引擎在代码执行前有一个解析的过程,创建了执行上下文,初始化了一些代码执行时需要用到的对象。当访问一个变量时,就会到当前执行上下文中的作用域链中去查找,而作用域链的首端指向的是当前执行上下文的变量对象、这个对象是在代码解析的时候创建的。
为什么会进行变量提升呢?
在JS代码执行之前,会进行语法检查和预编译,并且这一操作只进行一次。这么做就是为了提高性能,如果没有这一步,那么每次执行代码前都必须重新解析一遍该变量(函数),而这是没有必要的,因为变量(函数)的代码并不会改变,解析一遍就够了。
我对模块的理解是,一个模块是实现一个特定功能的一组方法。在最开始的时候,js 只实现一些简单的功能,所以并没有模块的概念,但随着程序越来越复杂,代码的模块化开发变得越来越重要。
由于函数具有独立作用域的特点,最原始的写法是使用函数来作为模块,几个函数作为一个模块,但是这种方式容易造成全局变量的污染,并且模块间没有联系。
后面提出了对象写法,通过将函数作为一个对象的方法来实现,这样解决了直接使用函数作为模块的一些缺点,但是这种办法会暴露所有的所有的模块成员,外部代码可以修改内部属性的值。
现在最常用的是立即执行函数的写法,通过利用闭包来实现模块私有作用域的建立,同时不会对全局作用域造成污染。
require()
是同步加载模块,ES6模块的import
命令是异步加载,有一个独立的模块依赖的解析阶段;
use strict是一种ES5添加的运行模式(严格模式),这种模式使得JS在更严格的条件下运行。设置严格模式的目的如下:
1、消除JS的语法的不合理、不严谨之处,减少怪异行为;
2、保证代码运行的安全
3、提高编译器效率,增强运行速度
4、为未来新版本的JS做好铺垫
1、禁止使用with语句
2、禁止this关键字指向全局对象
3、对象不能有重名的属性
1、instanceof 判断构造函数的prototype属性是否出现在对象的原型链中的任意位置
2、constructor 判断对象的constructor属性指向该对象的构造函数,但是这种方式不是很安全,因为constructor属性可以被修改
1、强类型语言:强类型语言也称强类型定义语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用。Python、Java和C++等语言都是强制类型定义的,也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。
2、弱类型语言:JavaScript语言属于弱类型语言。简单理解就是一种变量类型可以被忽略的语言。比如:在JavaScript中就可以把字符串‘12’和整数3进行连接得到字符串‘123’,在相加的时候会进行强制类型转换。
3、两者对比:强类型语言在速度上可能略逊色于弱类型语言,但是强类型语言带来的严谨性可以有效地帮助避免许多错误。
1、解释型语言:一边转换一边执行的,其不会由源代码生成可执行文件,而是先翻译成中间代码,再由解释器对中间代码进行解释运行,每执行一次都要翻译一次。
2、编译型语言:在程序在执行之前需要一个专门的编译过程,通过编译器把程序编译成为可执行文件,再由机器运行这个文件,运行时不需要重新翻译,直接使用编译的结果就行了。
for……in 主要是遍历对象的键名,遍历字符串的下标,遍历数组的下标
for……of 主要是遍历数组,遍历字符串的字符,遍历数组的值,不能遍历对象,一般适合遍历数组
for...of
是作为ES6
新增的遍历方式,允许遍历一个含有iterator
接口的数据结构(数组,对象等)并且返回各项的值,普通对象用for...of
遍历是会报错的。
length
属性),用Array.from()
转成数组即可;
[Symbol.iterator]
属性,并指向一个迭代器即可;
ajax是一种无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量的数据交换,Ajax可以使用网页实现异步更新。
1、本身针对MVC编程,不符合前端MVVM的浪潮;
2、基于原生的XHR开发,XHR本身的架构不清晰;
3、不符合关注分离的原则;
4、配置和调用方法非常混乱;
5、对请求和返回进行转化;
7、自动转换json数据;
8、客户端支持抵御XSRF
攻击
这两个方法都是用来遍历数组的,区别如下:
forEach()
方法没有返回值,如果它数组的数据为基本数据类型,它是不会改变原数组;如果它数组的数据为引用数据类型,则会修改原数组。
// 数组中是基本数据类型——不修改原数组
// 数组中是引用数据类型——修改原数组
map()
方法不会改变原数组的值,返回一个新数组,新数组中的值为原数组处理之后的值;
闭包是指有权访问另一个函数作用域中的变量的函数。
闭包有两个常用的用途:
1、函数外部能够访问到函数内部的变量,可以使用这种方法来创建私有变量;
2、已经运行结束的函数上下文中的变量对象继续保留在内存中,因为闭包函数保留了这个变量对象的引用,所有这个变量对象不会被回收。
比如:函数A内部有一个函数B,函数B可以访问到函数A的变量,那么函数B就是闭包
经典面试题:循环中使用闭包解决var定义函数的问题
因为setTimeout是异步函数,所以会先把循环全部执行完毕,这时候i就是6了,所以会输出5个6。 第一种使用立即指向函数的方式 第二种使用setTimeout的第三个参数,这个参数会被当成timer函数的参数传入 第三种使用let定义i来解决问题,也是最为推荐的方式补充:JS函数的几种写法
作用域是变量有效的范围。
(1)最外层函数定义的变量拥有全局作用域;
(2)所有未定义直接赋值的变量自动声明为全局作用域;
(3)所有window
对象的属性拥有全局作用域;
(4)全局作用域有很大的弊端,过多的全局作用域变量会污染全局命名空间,容易引起命名冲突.
(1)函数作用域声明在函数内部的变量,一般只有固定的代码片段可以访问到;
(2)作用域是分层的,内层作用域可以访问到外层作用域,反之不行.
(1)使用ES6
中新增的let
和const
指令可以声明块级作用域,块级作用域可以在函数中创建也可以在一个代码块中创建(由{}
包裹的代码片段)
(2)let
和const
声明的变量不会由变量提升,也不可以重复声明
作用域链:如果在自己的作用域找不到该变量就去父级作用域查找,依次向上级作用域查找,直到访问到window
对象就被终止,这一层层的关系就是作用域链。
作用:保证对执行环境有权访问的所有变量和函数,通过作用域链,可以访问到外层环境的变量和函数。
多个回调函数嵌套的时候会造成回调函数地狱,上下两层的回调函数间的代码耦合度太高,不利于代码的可维护
使用Promise
的方式可能将嵌套的回调函数作为链式调用。但是使用这种方法,有时会造成多个then
的链式调用,可能会造成代码的语义不够明确
Generator
函数是ES6
新增的一种异步编码的解决方案,语法和传统的函数完全不同;
Generator
函数最大的特点就是可以交出函数的执行权(即暂停执行)。
async
函数是generator
和promise
实现的一种自动执行的语法糖,它内部自带执行器,当函数内部执行到一个 await 语句的时候,如果语句返回一个 promise
对象,那么函数将会等待 promise
对象的状态变为
resolve
后再继续向下执行。因此可以将异步逻辑,转化为同步的顺序来书写,并且这个函数可以自动执行。
Promise
是异步编程的一种解决方案,它是一个对象,可以获取异步操作的消息。它的出现避免了地狱回调。
(1)Promise
的实例有三个状态:
当把一件事件交给Promise
时,它的状态为Pending
,任务完成了状态变成了Resolved
、没有完成失败了就变成Rejected
。
(2)Promise
的实例有两个过程:
注意:一旦从进入状态变成为其他状态就永远不能更改状态了。
1、对象的状态不受外界的影响。
3、一旦状态改变就不会再变,任何时候都可以得到这个结果
1、无法取消Promise
,一旦新建它就会立即执行,无法中途取消
2、如果不设置回调函数,Promise
内部抛出的错误,不会反应到外部
3、当处于pending
状态时,无法得知目前进展到那个阶段(刚刚开始还是即将完成)
Promise构造函数
接受一个函数作为参数,该函数的两个参数分别是resolve
和reject
。
then
方法可以接受两个回调函数作为参数。第一个回调函数是Promise
对象的状态变为resolved
时调用,第二个回调函数时Promise
对象的状态变为rejected
时调用。其中第二个参数可以省略。then
方法返回的是一个新的Promise
实例(不是原来的那个Promise
实例)
如果出现错误,抛出异常,不会停止运行,而是进入catch
方法中,所以catch
方法是用来捕获异常的。
all
方法可以完成并行任务,它接受一个数组,数组的每一项都是一个promise
对象。当数组中所以的promise
的状态都达到resolved
的时候,all
方法的状态就会变成resolved
,如果有一个状态变成了rejected
,那么all
方法的状态就会变成rejected
。
注意:调用all
方法时的结果成功也是一个数组,这个数组按顺序保存每一个promise
对象resolve
执行时的值。
race
方法与all
一样,接受的参数是一个每项都是promise
的数组,但是与all
不同的是,当最先执行完的事件执行完之后,就直接返回该promise
对象的值。如果第一个promise
对象状态变成了resolved
,那自身的状态变成了resolved
;反之第一个promise
变成rejected
,那自身状态就会变成rejected
。
finally
方法用于指定不管Promise
对象最状态如何,都会执行的操作。该方法时ES8引入标准的。
可以将多个Promise
实例包装成应该新的Promise
实例。同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject
失败状态的值。传入的promise
对象返回的值是按照顺序在数组中排列的,但是注意的是他们执行的顺序并不是按照顺序的。
(2)Promise.race
就是赛跑的意思,意思就是说,Promise.race[(p1,p2,p3)]
里面哪个结果获得快,就返回哪个结果,不管结果本身是成功状态还是失败状态。当要做一件事,超过多长时间就不做了,可以用这个方法来解决。
await
表达式的运算结果取决于它等的是什么。
1、 如果它等到的不是一个Promise
对象,那么await
表达式的运算结果就是它等到的东西;
2、如果它等到的是一个Promise
对象,await
就忙碌起来了,它会阻塞后面的代码,等着Promise
对象,然后得到resolve
的值,作为await
表达式的运算结果。
async/await
传递中间值同步写法,非常优雅;
回调函数就是写处理逻辑的函数。
回调函数有一个致命的弱点,就是容易写出回调地狱。
回调地狱的根本问题就是:
1、嵌套函数存在耦合性,一旦有所改变,就会牵一发而动全身;
2、嵌套函数一多,就很难处理错误。
缺点:不能使用try/catch
捕获错误,不能直接return
。
JS是单线程执行的,如果前面的代码影响了性能,就会导致setTimout
不会按期执行。setInterval
用法与setTimeout
基本一致,只是该函数是每隔一段时间执行一次回调函数。
1、它和setTimeout
一样,不能保证在预期的时间执行任务;
2、它存在执行累积问题。
如果有循环定时器的需求,其实完全可以通过requestAnimationFrame
来实现:
requestAnimationFrame
是H5的新特性,请求动画帧。官方解释:帧动画,就是可以一帧一帧的执行动画。
1、requestAnimationFrame
会把每一帧中所有DOM操作集中起来,在一次重绘或回流中完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧。
2、requestAnimationFrame
将不会进行重绘或回流,这当然就意味着更少的CPU,内存的使用。
JS的8种创建对象的方式
2、构造函数新增的方法
3、实例对象新增的方法
find()// 用于找出第一个符合条件的数组成员 findIndex()// 返回第一个符合条件的数组成员的位置,如果所有成员都不符合条件,则返回-1 flatMap()// 对原数组的每一个成员执行一个函数相当于执行Array.prototype.map(),然后对返回值组成的数组执行flat()方法,该方法返回一个新数组,不改变原数组
数组的空位指,数组的某一个位置没有任何值,ES6则是明确将空位转为undefined
5、排序的稳定性,将sort()
默认设置为最稳定的排序算法
ES6中,当对象键名与对应值名相等的时候,可以进行简写
ES6允许字面量定义对象时,将表达式放在括号内
Object.keys()返回自身的(不含继承的)所有可遍历属性的键名的数组 Object.values()返回自身的所有可遍历属性的键对应值得数组 Object.entries()返回一个对象自身得所有可遍历属性的键值对的数组1、ES6允许函数的参数设置默认值
(1)length
返回指定默认值的参数个数
(2)name
返回函数名
1.Proxy
对象是ES6
新出的一个特性,用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查询、赋值、枚举、函数调用等)
Proxy
为构造函数,用来生成Proxy
实例
get
方法用于拦截某个属性的读取操作,可以接受二个参数,分别为目标对象,属性名。
set
方法用来拦截某个属性的赋值操作,三个参数依次为目标对象、属性名、属性值。
Proxy
其功能非常类似于设计模式中的代理模式,常用功能如下:
1、拦截和监视外部对象的访问
2、降低函数或类的复杂度
3、在复杂操作前对操作进行校验或所对需要资源进行管理
模块(Module
),是能够单独命名并独立地完成一定功能的程序语句的集合。
如果没有模块化,我们的代码会怎么样?
1、变量和方法不容易维护,容易污染全局作用域
2、加载资源的方式通过script标签从上到下
3、 代码较多就会复杂
4、大型项目资源难以维护,特别是多人合作的情况下,资源的引入会让人奔溃
ES6 在语言标准的以及层面上,实现了Module,即模块功能,完全可以取代 CommonJS和 AMD规范,成为浏览器和服务器通用的模块解决方案
因为
CommonJS
和AMD
模块,都只能在运行时确定这些东西。比如,CommonJS
模块就是对象,输入时必须查找对象属性;而ES6
设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量
ES6模块内自动采用严格模式,模块功能主要由两个命令构成:
1、export
:一个模块就是一个独立的文件,导出文件,外部能够读取模块内部的某个变量。
2、import
:引入模块使用,import
后面我们常接着from
关键字,from
指定模块文件的位置,可以是相对路径,也可以是绝对路径。
使用场景:如今,ES6模块化已经深入我们日常项目开发中,像Vue
,React
项目搭建项目,组件化开发。
Decorator
,即装饰器,是一个普通的函数,用于扩展类属性和类方法。
1、代码可读性变强了,装饰器命名相当于一个注释
2、再不改变原有代码情况下,对原来功能进行扩展
Decorator
修饰对象为下面两种:
1、类的装饰,接受一个参数即类本身
2、类属性的装饰,接受三个参数,类的原型对象,需要装饰的属性名,装饰属性名的描述对象
== 注意 == :装饰器不能用于修饰函数,因为函数存在变量声明情况
JS数组和字符串原生方法
require.js
的核心原理是通过动态创建 script
脚本来异步引入模块,然后对每个脚本的 load
事件进行监听,如果每个脚本都加载完成了,再调用回调函数。
Iterator
(迭代器)是一种接口,也可以说是一种规范。为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator
接口,就可以完成遍历操作。
[Symbol.iterator]
属性名是固定的写法,只要拥有了该属性的对象,就能够用迭代器的方式进行遍历。
1、创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
2、第一次调用指针对象的next
方法,可以将指针指向数据结构的第一个成员。
3、第二次调用指针对象的next
方法,指针就指向数据结构的第二个成员。
4、不断调用指针对象的next
方法,直到它指向数据结构的结束位置。
value
代表想要获取的数据;
done
布尔值,false
表示当前指针指向的数据有值,true
表示遍历已经结束。
1、为各种数据结构,提供一个统一的、简便的访问接口;
2、使得数据结构的成员能够按某种次序排列;
Generator
(生成器),最大的特点就是可以交出函数的执行权。我们可以通过yield
关键字,把函数的执行流挂起,为改变执行流程提供了可能,从而异步编程提供解决方案。
yield
命令后面如果不加星号,返回的是整个数组,加了星号就表示返回的是数组的遍历器
如有书写错误,可以留言告诉我,加油!
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。