1. 数 据 类 型 \color{red}{1.数据类型} 1.数据类型
基本数据类型:
数
字
、
布
尔
值
、
字
符
串
、
u
n
d
e
f
i
n
e
d
、
n
u
l
l
、
S
y
m
b
o
l
\color{#0099ff}{数字、布尔值、字符串、undefined、null、 Symbol}
数字、布尔值、字符串、undefined、null、Symbol
Symbol这种类型的对象永不相等,即始创建的时候传入相同的值,可以解决属性名冲突的问题,做为标记。
引用类型:
o
b
j
e
c
t
、
f
u
n
c
t
i
o
n
、
A
r
r
a
y
、
D
a
t
e
、
R
e
g
E
x
p
\color{#0099ff}{object、function、 Array、Date、RegExp}
object、function、Array、Date、RegExp
2. l e t , c o n s t , v a r 区 别 \color{red}{2.let,const,var区别 } 2.let,const,var区别
ES5 中作用域有:
全
局
作
用
域
、
函
数
作
用
域
。
\color{0099ff}{全局作用域、函数作用域。}
全局作用域、函数作用域。没有块作用域的概念。ES6 中新增了
块
级
作
用
域
\color{0099ff}{块级作用域}
块级作用域。块作用域由 { } 包括,if语句和 for语句里面的{ }也属于块作用域。
三者都是用来声明变量的
- var定义的变量,没有块的概念,可以 跨 块 访 问 \color{0099ff}{跨块访问} 跨块访问, 不能跨函数访问。
- let定义的变量,只能在块作用域里访问, 不 能 跨 块 \color{0099ff}{不能跨块} 不能跨块访问,也不能跨函数访问。
- const用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且 不 能 修 改 \color{0099ff}{不能修改} 不能修改。
3. g e t 和 p o s t 请 求 区 别 \color{red}{3.get和post请求区别 } 3.get和post请求区别
1. url可见性:
get,参数url可见;
post,url参数不可见
2. 数据传输上:
get,通过拼接url进行传递参数;
post,通过body体传输参数
3. 缓存性:
get请求是可以缓存的
post请求不可以缓存
4. 后退页面的反应
get请求页面后退时,不产生影响
post请求页面后退时,会重新提交请求
5. 传输数据的大小
get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大)
post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。
6. 安全性
原则上post肯定要比get安全
4. t h i s 的 指 向 \color{red}{4.this的指向 } 4.this的指向
- 如果是一般函数,this指向全局对象window;
- 在严格模式下"use strict",为undefined.
- 对象的方法里调用,this指向调用该方法的对象.
- 构造函数里的this,指向创建出来的实例.
5. 普 通 函 数 和 箭 头 函 数 区 别 \color{red}{5.普通函数和箭头函数区别} 5.普通函数和箭头函数区别
(1) 箭头函数是匿名函数,不能作为构造函数,不能使用new
(2) 箭头函数不绑定arguments,取而代之用rest参数…解决
(3) this的作用域不同,箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己的this值。
(4)箭头函数没有原型属性
(5)箭头函数不能当做Generator函数,不能使用yield关键字
6. 同 源 策 略 是 啥 ? 怎 么 跨 域 ? j a s o n p 是 怎 么 实 现 跨 域 的 ? 他 返 回 的 是 一 个 什 么 东 西 \color{red}{6.同源策略是啥 ? 怎么跨域?jasonp是怎么实现跨域的?他返回的是一个什么东西} 6.同源策略是啥?怎么跨域?jasonp是怎么实现跨域的?他返回的是一个什么东西
同源策略
-
同协议
-
同域名/同IP
-
同端口号
【注】ajax只能下载同源的数据,跨源的数据禁止下载
跨源的策略
- 修改ajax同源协议(不建议)头文件加上Access-Control-Allow-Origin
- 委托php文件进行跨源 php文件没有跨源限制
- jsonp
JSONP跨域的使用流程
- 先去声明一个函数,这个函数有一个形参,这个形参会拿到我们想要下载的数据,使用这个参数进行后续数据的处理
- 在需要下载数据的时候,动态创建script标签,将标签src属性设置成下载数据的链接
- 在script插入到页面的时候,就会调用已经封装好的函数,将我们需要的数据传过来
7. t y p e o f 和 i n s t a n c e o f \color{red}{7.typeof和instanceof} 7.typeof和instanceof
- typeof 是判断参数是什么类型的实例,返回值为说明运算数类型的字符串。
- instanceof是用来判断一个对象在其原型链中是否存在一个构造函数的prototype属性
a instanceof b:判断a是否为b的实例,可以用于继承关系中
b是c的父对象,a是c的实例,a instanceof b 与 a instanceof c 结果均为true
8. t y p e o f ( n u l l ) 输 出 什 么 \color{red}{8.typeof(null)输出什么} 8.typeof(null)输出什么
object
9. c o n s t 一 个 数 组 , 是 否 能 够 p u s h 一 个 数 据 进 去 , 为 什 么 能 或 不 能 ? \color{red}{9.const一个数组,是否能够push一个数据进去,为什么能或不能?} 9.const一个数组,是否能够push一个数据进去,为什么能或不能?
splice、push可以修改const值,能够push数据进去
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。
10. p r o m i s e 一 般 用 来 做 什 么 \color{red}{10.promise一般用来做什么} 10.promise一般用来做什么
Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。
promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。
promise是用来解决两个问题的:
• 回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象
• promise可以支持多个并发的请求,获取并发请求中的数据
• 这个promise可以解决异步的问题,本身不能说promise是异步的
11. 闭 包 \color{red}{11.闭包} 11.闭包
1.函数嵌套函数
2.内部函数使用外部函数的形参和变量
3.被引用的形参和变量就不会被垃圾回收机制回收
好处:
- 希望一个变量常驻内存
- 避免全局变量污染 避免声明全局变量
- 可用声明私有成员
12. 判 断 是 否 为 数 字 ? \color{red}{12.判断是否为数字?} 12.判断是否为数字?
function isNum(num) {
return typeof num === "number" && !isNaN(num);
}
alert(isNum(" "));
function isNum(num) {
if (parseFloat(num).toString() == "NaN") {
return false;
} else {
return true;
}
}
alert(isNum(" "));
//isNaN(val)不能判断空串或一个空格
//如果是一个空串、空格或null,而isNaN是做为数字0进行处理的,而parseInt与parseFloat是返回一个错误消息,这个isNaN检查不严密而导致的。
13. 数 组 去 重 \color{red}{13.数组去重} 13.数组去重
1. 引入库underscore-min.js
2. For嵌套循环for,然后用splice去重
var arr = [1, 3, 4, 5, 3, 2, 1, 1];
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) {
arr.splice(j, 1);
j--;
}
}
}
alert(arr);
3.利用sort+push
var arr = [1, 3, 4, 5, 3, 2, 1, 1, 6, 8, 3, 4, 9];
var arr = arr.sort();
var result = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] !== arr[i + 1]) {
result.push(arr[i]);
}
}
alert(result);
4.利用indexOf去重
var arr = [1, 3, 4, 5, 3, 2, 1, 1, 6, 8, 3, 4, 9];
var result = [];
for (var i = 0; i < arr.length; i++) {
if (result.indexOf(arr[i]) === -1) {
result.push(arr[i]);
}
}
alert(result);
5.filter+indexOf
var arr = [1, 3, 4, 5, 3, 2, 1, 1, 6, 8, 3, 4, 9];
function getUniqueArray() {
var result = arr.filter(function (item, index) {
return arr.indexOf(item) === index;
});
alert(result);
}
getUniqueArray();
6.利用ES6 set去重
var arr = [1, 3, 4, 5, 3, 2, 1, 1, 6, 8, 3, 4, 9];
function getUniqueArray(arr) {
return Array.from(new Set(arr));
}
alert(getUniqueArray(arr));
7.set
var arr = [1, 3, 4, 5, 3, 2, 1, 1, 6, 8, 3, 4, 9];
function getUniqueArray() {
var result = [...new Set(arr)];
alert(result);
}
getUniqueArray();
8.reduce+include
var arr = [1, 3, 4, 5, 3, 2, 1, 1, 6, 8, 3, 4, 9];
function getUniqueArray() {
var result = arr.reduce((pre, item) => {
return pre.includes(item) ? pre : [...pre, item];
}, []);
alert(result);
}
getUniqueArray();