1:浏览器是有缓存的,开发中可以通过快捷键绕过缓存

  对于Windows驱动的系统:Ctrl + F5

  对于Mac驱动的系统:Command + Shift + R.

2:精度问题 (符点和大数字可能会导致精度出现问题)

  0.1 + 0.2 == 0.3;    // false  判断符点的==时需注意

99999999999999999 === 100000000000000000    // true   大整数丢失精度

12.235.toFixed(2)   // 12.23 难道是我概念理解错了?

3:Promise (Promise是个承诺.  new Promise(function(resolve, reject){})  一言即出,四马难追.)

4:闭包函数. (函数创建的时候,scope就确定了)

    var a = 0;

    function addCount() {

    a++;

  }

   // 修改下使之成为一个闭包

   function addCount() {

    var a = 0;

        return function() {

    a++;

   }  

  }

5: 箭头函数. (箭头函数对懒人来说很有用,看上去清晰多了 )

const add = x => y => x + y;

add(10)(1);

6: 判断相等.  (判断是值的判断,对像和对像判断是判断地址,对象和原始数据判断是,是先把对象转化原始数据)

console.log(null == 0);              // false

console.log(Boolean("0"));        // true

console.log([] == 0);                 // true.  对象与基本数据判断的时候,对象会先转化为基本数据

console.log({valueOf:()=>5} == 5);   // ture

console.log(Boolan([]));            // true;

7:let 与 var的区别

//------ 全局变量a由var命令声明,所以它是顶层对象的属性;全局变量b由let命令声明,所以它不是顶层对象的属性
var a = 1;
console.log(window.a); // 1
let b = 1;
console.log(window.b); // undefined // ------let 自带作用域--------------------------------------------------------------------------
let name1 = "hong";
(function(){
let name1 = "honghong"
})();
console.log(name1); // honghong var name = "hong";
(function() {
name = "honghong";
})();
console.log(name); // honghong //---------------------------------------------------------与闭包相关----------------------------
// 用let实现闭包
var array = [];
for (let i = 0; i < 5; i++) {
array.push(function(){
console.log("i:", i)
});
}
array[2](); // 输出2 // 用var
array = [];
for (var j = 0; j < 5; j++) {
array.push(function(){
console.log("i:", j);
});
}
array[2](); // 输出5 // 用闭包实现
array = [];
for (var j = 0; j < 5; j++) {
array.push((function(index){
     return function() {
console.log("i", index);
}
})(j));
}
console.log(array[2]()); // 输出2

8:二进制 ArrayBuffer, TypedBuffer,  DataView

ArrayBuffer代表储存二进制数据的一段内存.不能直接用来读写。只能被TypeArray或DataView"包装"后,方才能读写

TypedBuffer用来读写简单的二进制数据(参数 arraybuffer, 起始位置,  长度 | 普通数组 | count )

DataView用来读写复杂的二进制数据(参数 arraybuffer, 起始位置,count )

const buffer = new ArrayBuffer(24);

const uint32Array = new Uint32Array(buffer, 0, 1);

const uint3Array = new Uint8Array(buffer, 4, 16);

const float32Array = new Float32Array(buffer, 20, 1);

上面代码将一个 24 字节长度的ArrayBuffer对象,分成三个部分:

  • 字节 0 到字节 3:1 个 32 位无符号整数
  • 字节 4 到字节 19:16 个 8 位整数
  • 字节 20 到字节 23:1 个 32 位浮点数

9:async返回一个Promise. async函数内部return语句返回的值会成为then方法回调函数的参数

async function f() {
return 'hello world';
}
f().then(v => console.log(v))

10:正则表达式

(x)     匹配 'x' 并且记住匹配项        例   'bar foo'.replace( /(bar) (foo)/, '$2 $1');    // foo bar

(?:x)   匹配 'x' 并且不记住匹配项

x(?=y) 匹配 'x'并且后面跟着y

x(!=y) 匹配 'x'并且后面不跟着y

\b      匹配一个词的边界

11:webgl用的是右手坐标系

12:symbol 是原始数据,可表示唯一的值. Symbol("bar) == Symbol("bar") // false    Symbol.from("bar") == Symbol.from("bar") // true

13:Iterator 接口的目的,就是为所有数据结构,提供了一种统一的访问机制

14:VO|AO (听起来很高大上,理解下,装装逼)

EC的建立分两阶段

    进入上下文阶段:发生在函数调用时,但是在执行具体代码之前(比如,对函数参数进行具体化之前)

执行代码阶段:变量赋值,函数引用,执行其他代码。

AO示例:

function test(a, b) {
var c = 10;
function d() {}
var e = function _e() {};
(function x() {});
} test(10); // call
当进入test(10)的执行上下文时,它的AO为: testEC={
AO:{
arguments:{
callee:test
length:1,
0:10
},
a:10,
c:undefined,
d:<reference to FunctionDeclaration "d">,
e:undefined
}
};
由此可见,在建立阶段,VO除了arguments,函数的声明,以及参数被赋予了具体的属性值,其它的变量属性默认的都是undefined。函数表达式不会对VO造成影响,因此,(function x() {})并不会存在于VO中。 当执行test(10)时,它的AO为: testEC={
AO:{
arguments:{
callee:test,
length:1,
0:10
},
a:10,
c:10,
d:<reference to FunctionDeclaration "d">,
e:<reference to FunctionDeclaration "e">
}
};
可见,只有在这个阶段,变量属性才会被赋具体的值。

15:知识概念 举例说明

// 填充VO的顺序是: 函数的形参 -> 函数申明 -> 变量申明。当变量申明遇到VO中已经有同名的时候,不会影响已经存在的属性
function a(x) {
return x * 2;
}
var a;
console.log(a);
// 活动对象是在进入函数上下文时刻被创建的,它通过函数的arguments属性初始化
function b(x, y, a) {
arguments[2] = 10;
console.log(a);
}
b(1, 2); // __proto__ 指向原型对象
function A(){};
A.prototype.getName = function(){return console.log("honghong")};
var a = new A();
a.getName(); // honghong
a.__proto__ = null;
console.log(a instanceof A); // 检查a是否是A的原型 false
a.getName(); // 指向的原型为空,所以报错 // 构造函数动态传参
function People(a, b, c) {
  this.a = a;
  this.b = b;
  this.c = c;
}
People.prototype.say = function() {
  console.log("say hello");
}
var obj = {};
People.apply(obj, [1,2,3]);
obj.__proto__ = People.prototype;
console.log(obj.a,obj.b,obj.c);
console.log(obj.say);

16:防盗链的实现可以通过设置HTTP Header中的Referer实现

base标签很有用,可以本地看线上的一些效果

xml一般只在浏览器会有支持,像nodejs,小游戏等不支持xml,这时就需要把xml转化成json,或使用 window.DOMParser = require("./xmldom/xmldom.js").DOMParser

17:es6写法

var obj1 = {}, var obj2 = {...obj1}, 浅复制的另一种写法

最新文章

  1. 【Python】[模块]使用模块,安装第三方模块
  2. 2.用vs2015创建Dotnet Core的mvc项目
  3. MVC利用URLRoute实现伪静态
  4. 动态修改attr里的多个属性
  5. 【noiOJ】p8206
  6. JavaScript Tips
  7. 《转载》两个activity界面间跳转切换动画效果
  8. ruby安装插件报错
  9. synopsys license maker
  10. kafka consumer 分区reblance算法
  11. webshell 匿名用户(入侵者)
  12. 胜利大逃亡(续)(状态压缩bfs)
  13. Scrum Meeting Alpha - 4
  14. Runtime的理解与实践
  15. beta冲刺5-咸鱼
  16. 5.CentOS7安装mariadb
  17. collections, time, queue的应用
  18. 更换mysql数据库的datadir目录
  19. Python day7_set集合的常用方法以及常用格式化的总结
  20. 获得用户完整的autodiscover配置文件

热门文章

  1. 实现虚拟机和宿主机之间的复制、粘贴(ubuntu系统)
  2. 【commons】邮件发送工具——commons-email
  3. 20155308 2016-2017-2 《Java程序设计》第10周学习总结
  4. spring boot启动报内存溢出的问题
  5. jsp+servlet+javabean开发web项目
  6. [IOI2011]Race 点分治
  7. abp core版本添加额外应用层
  8. MyBatis.Net 配置
  9. Spring学习(五)-----注入bean属性的三种方式( 1: 正常的方式 2: 快捷方式 3: “p” 模式)
  10. 六、EnterpriseFrameWork框架基础功能之权限管理