函数的扩展

  • 函数执行是先执行函数参数,再执行函数体
  • 如果函数参数使用了解构赋值、设置默认值、扩展运算符则不可以在函数体内显式设定为严格模式,否则会报错
  • “调用记录”,又称“调用帧”。用于保存调用位置和内部变量等信息。如果A调用了B,那么在A的调用帧上形成了B的调用帧,如果在B内部海调用了C,那么在B的上方又形成了C的调用帧,等到C的调用结束以后,将结果返回给B,C的调用帧才会消失。A、B、C的调用帧便形成了调用栈
  • 函数拥有name属性,可以获取函数名。

默认值

More

Promise

异步编程,是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作),是对象,获取异步操作的消息。

其特点如下:

  • 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)fulfilled()已成功rejected(已失败)。注意:其状态只要异步操作才会使其改变!参考其名字!
  • 状态一旦改变,就不会再变,任何时候都可以得到这个结果。Promise对象状态改变,两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态便凝固了,不会再改变!这时称为resolved(已定型)。如果改变已经发生,即使再对Promise对象添加回调函数,也会立即得到这个结果。

More

对象扩展

属性相关

简洁表示

  • 可直接写入变量和函数,作为属性和方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 属性简写
function f(x, y) {
return {x, y};
}
// 等同于
function f(x, y) {
return {x: x, y: y};
}

// 方法简写,注意,只有方法的简写方式才会被js引擎确认对定义的是对象的方法
const o = {
method() {
return "Hello!";
}
};
// 等同于
const o = {
method: function() {
return "Hello!";
}
};
// 以下两种方式均为定义一个方法然后赋给foo属性
const obj = {
foo:() => super.foo
}
const obj = {
foo:function(){
return super.foo
}
}

More

CSS基础回顾之定位和文档流

标准文档流

  • 所谓的标准文档流就是浏览器默认的排版方式,注意,这是一种排版方式。

  • 说道排版,便有行内元素和块级元素的不同。其区别和注意事项,请看下面知识点。

  • 标准文档流注意事项:

    • 空白折叠现象。比如,如果我们想让img标签之间没有空隙,必须紧密相连。

      1
      <img src="img/00.jpg" /><img src="img/02.jpg" />
    • 高矮不齐,底边对齐

    • 自动换行,一行写不完,换行写

      More

双向数据绑定

采用数据劫持结合发布者订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter和getter,数据变动时发布消息给订阅者,触发相应函数的回调。

解释

MVVM双向数据绑定,数据变化更新试图,视图变化更新数据。

视图变化更新数据可通过事件监听来实现,而关键在于数据变化更新视图。

如果要实现双向数据绑定,需要四个东东:

More

CSS杂记

渐进增强和优雅降级

  • 渐进增强

    针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验

  • 优雅降级

    一开始就构建完整的功能,然后再针对低版本浏览器进行兼容

  • 区别:渐进增强是向上兼容,优雅降级是向下兼容

  • 互联网发展很快,连微软公司都抛弃了ie李兰器,转而支持edge这样的高版本浏览器,很多情况下没有必要再时刻想着低版本浏览器,而是一开始构建完整的表过,根据实际情况,修补低版本浏览器问题

More

JS异步执行如何工作的

  • js是单线程的工作机制,不过浏览器是多线程的,所以不要担心单线程的js是不是落后,反正有浏览器帮衬。
  • 浏览器有个叫web worker的东西,可以让浏览器开出一个Worker线程,通过接受发送消息和主线程交互,并且和主线程不冲突的执行。
  • web worker的讲解详情请翻看本站其他文章讲解
  • 几乎现在的主流语言都有同步和异步问题,那么js的异步有哪些?
    • js引擎线程(解释执行js代码、用户输入、网络请求)
    • GUI线程(绘制用户界面、就是我们刚刚说的解析CSS和DOM的,它和js主线程是互斥的)
    • http网络请求线程(处理ajax的)
    • 定时触发器线程(setTimeout、setInterval)
    • 浏览器事件处理线程(将click、touch放入事件队列中)

      More

WebWorker

  • 前面在《js异步执行如何工作的》一文中简单提到,因为js是单线程的,在如今这种高密度的计算中,显然有些吃力。于是,浏览器积极发展多线程,来弥补js单线程的不足。而Web Worker就是其中一种机制。
    既然是一种多线程机制,那么它是怎么工作的呢?
  • 简单的说,Web Worker是运行在后台的。为什么这么说?js是一种单线程机制,那么其就有一个主线程。而主线程可以创建Worker线程,将一些任务分配给后者运行。那跟人家主线程相比,Web Worker可不就是运行在后台。
  • 更巧妙的是,Worker是独立于其他脚本的,不会影响页面的性能,跟主线程互不干扰。除了两者之间进行消息沟通。
  • 互不干扰的意思是不会被主线程上的活动给打断,比如主线程要进行用户点击、提交表单等等。不是不会进行通信的意思哦。

More

执行上下文变量提升

执行上下文

  • 执行上下文相当于执行环境,在《Javascipt高级程序设计》中关于执行环境是这么描述的:

    • 执行环境定义了变量有权访问的其他数据,并决定了他们各自的行为
    • 执行环境有一个与它关联的对象(变量对象)
    • 该对象中保存了这个执行环境中所有的变量和函数
  • 其实书中所写可以理解为:每一次代码执行都会产生一个执行环境,该环境称为执行上下文

More

数组去重的方法整理

只做各方神仙的搬运工

一、最笨的方法

  • 以下方法是基础的方法,但是时间复杂度为O(n2),性能很差。不过相较于其他方法,兼容性很好
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function single(origin) {
var result = [];
var arrayItem, resultItem
for(var i=0; i<origin.length; i++){
arrayItem = origin[i]
for(var j=0; j<result.length; j++){
resultItem = result[j]
if(resultItem === arrayItem){
break;
}
}
if( j === result.length) {
result.push(arrayItem)
}
}
}

More