Promise是一种异步编程的解决方案,有三种状态,pending(进行中)、resolved(已完成)、rejected(已失败)
使用方法:
当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__
隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype
的__proto__
中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。
①一直往上层查找,直到到null还没有找到,则返回undefined
②Object.prototype.__proto__ === null
表示延伸到原型链的顶端
③所有从原型或更高级原型中的得到、执行的方法,其中的this在执行时,指向当前这个触发事件执行的对象
核心: 将父类的实例作为子类的原型
缺点:
只能实现单继承
引用属性也是共享的
创建子类实例时, 无法向父类构造函数传参
function Parent() {
this.name = 'zhangsan';
this.children = ['A', 'B', 'C'];
}
Parent.prototype.getName = function() {
console.log(this.name);
}
function Child() {
}
Child.prototype = new Parent();
var child = new Child();
console.log(child.getName());
补充1:es6新增的原型数据类型Symbol,特点是什么;
补充2:如何声明两个相等的Symbol变量?
使用Symbol.for来判断
let a = Symbol.for('a');
补充3:Undefined与Null的区别:
Undefined 其实就是已声明未赋值的变量输出的结果
null 其实就是一个不存在的对象的结果
补充4:栈(stack)为自动分配的内存空间,它由系统自动释放;而堆(heap)则是动态分配的内存,大小不定也不会自动释放。基本数据类型存放在栈中,引用类型存放在堆中。
理解为浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存
理解为深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象
官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
通俗来说,JavaScript中所有的function都是一个闭包。不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”。
闭包就是可以访问另一个函数作用域中的变量函数。
// An highlighted block
function a() {
var i = 0;
function b() { alert(++i); }
return b;
}
var c = a();
c();
闭包的优点:
保护函数内的变量安全,加强了封装性,变量可以一直存储在内存中
避免变量的污染
使得Javascript的垃圾回收机制GC不会回收函数a所占用的资源
闭包的缺点:
内存浪费,不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。
添加链接描述
JavaScript中的每一个function对象都会有call和apply方法
/*call()方法*/
function.call(thisObj[, arg1[, arg2[, [,...argN]]]]);
/*apply()方法*/
function.apply(thisObj[, argArray])
相同点:
都是为了解决改变 this 的指向,作用一致
不同点:
传参的方式不同
this 永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。匿名函数或不处于任何对象中的函数指向 window 。函数中的this的值取决于函数调用的模式:
① 方法调用模式:
函数是对象的一个属性时候(函数为该对象的方法),此时函数中的this=该对象
② 函数调用模式:
当函数并不是对象的属性。函数中this=全局对象
note:某个方法中的内部函数中的this的值也是全局对象,而非外部函数的this
③ 构造器调用模式:
即使用new调用的函数,则其中this=新构造的对象。
④ 使用apply或call调用模式:
该模式调用时,函数中this被绑定到apply或call方法调用时接受的第一个参数
1、概念:
Ajax代表异步JavaScript和XML,用于异步显示数据
2、原理:
Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发送异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面
3、包含的技术:
4、XMLHttpRequest
javascript可以及时向服务器提出请求和处理响应,而不阻塞用户,达到无刷新的效果,通过XMLHttpRequest对象,可以在页面加载以后进行页面的局部更新。
5、优点:
6、 缺点:
Ajax的基本原理总结
第一步、定义model来处理数据和逻辑
同步更新 state 的 reducers
处理异步逻辑的 effects,返回请求的数据
订阅数据源的 subscriptions
第二步、在component层使用dispatch调用model中方法,取到model中state的值来来显示数据
块元素:
内联元素:
是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。
1:所有浏览器都支持
2:容器和项目
① 容器(Flex container): 需要添加弹性布局的父元素;
设置 display 属性的值为 flex(块级元素) 或 inline-flex(行级元素)将其定义为弹性容器
② 项目(Flex item): 弹性布局容器中的每一个子元素,称为项目;
3:了解两个基本方向,这个牵扯到弹性布局的使用:
① 主轴: 在弹性布局中,我们会通过属性规定水平/垂直方向为主轴(flex-direction);
② 交叉轴: 与主轴垂直的另一方向,称为交叉轴
设为 Flex布局后,子元素的float、clear和vertical-align属性将失效。但是position属性,依然生效。
绝对长度单位:
px:绝对单位,页面按精确像素展示
与字体相关的相对长度单位:
em:相对长度单位,相对于当前对象内文本的字体尺寸。
rem:是相对于根元素html的font-size属性的计算值,chrome/firefox/IE9+支持
vw、vh:与视图窗口有关,vw表示相对于视图窗口的宽度,vh表示相对于视图窗口高度
通配符选择器(*)
id选择器(#classId)
类选择器(.className)
标签选择器(div,h1,p,span,table)
子选择器(ul > li)
后代选择器(li a)
伪类选择器(a:hover,li:nth-child)
补充:权重和优先级
固定布局
流式布局
弹性布局
浮动布局
定位布局
margin和padding
CSS预处理器是一种专门的编程语言,进行Web页面样式设计,然后再编译成正常的CSS文件,例如Less、Sass、Stylus,用来预编译Sass或less,增强了css代码的复用性,还有层级、mixin、变量、循环、函数等,具有很方便的UI组件模块化开发能力,极大的提高工作效率。
CSS后处理器例如:PostCSS,通常被视为在完成的样式表中根据CSS规范处理CSS,让其更有效;目前最常做的是给CSS属性添加浏览器私有前缀,实现跨浏览器兼容性的问题。
值 | 描述 |
---|---|
inline | 默认。显示为内联元素 |
block | 显示为块级元素 |
none | 隐藏 |
inline-block | 行内块元素 |
list-item | 列表显示 |
table | 作为块级表格来显示(类似table),表格前后带有换行符 |
原理:不断比较相邻元素,如果前一个比后一个大,就元素交换,直到没有需要比较的元素。
function sort(arr) {
var len = arr.length;
for (var i = 0; i < len; i++) {
for (var j = 0; j < len - 1; j++) {
if (arr[j] > arr[j+1]) { // 比较相邻元素
var temp = arr[j+1]; //元素交换
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
function sort(arr) {
var len = arr.length;
var minIndex, temp;
for (var i = 0; i < len - 1; i++) {
minIndex = i;
for (var j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) { //寻找最小的数
minIndex = j; //将最小数的索引保存
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
原理:在数组中找到基准点(比如中间位置的数字),其他数与之比较,新建两个数组,小于基准点的数存储在左边数组,大于基准点的数存储在右边数组,拼接数组,然后左边数组与右边数组继续比较存储,直到最后完成数组排序。
function sort(arr){
if(arr.length<=1){
return arr // 如果数组长度小于或等于1,则直接返回数组
}
// 找到数组中间的索引,如果是浮点数,则向下取整
var num = Math.floor(arr.length/2);
var centerVal = arr.splice(num,1); // 找到数组中间索引的值
var left = [];
var right = [];
for(var i=0;i<arr.length;i++){
if(arr[i]<centerVal){
left.push(arr[i]) // 基准点左边的数放到左边数组
}else{
right.push(arr[i]) // 基准点右边的数放到右边数组
}
} // 利用concat拼接数组,并调用sort方法
return sort(left).concat([centerVal],sort(right))
}
必须要会的50个React面试题
未完待续…