温习JavaScript

1.布尔值:undefined,null,false,0,NaN,""或''(空字符串) 都会视为false ;空数组[],空对象{},都会视为true数组

2.js操做对象用点和中括号的区别 例如,var obj = {name:'alhh'}   obj.name 用点的时候后面须要跟一个指定的属性名称,用中括号的时候,里面是字符串或者是变量 var obj = name ;obj[name] 浏览器

3.属性的读取一个是用点,一个是放在方括号中,放在方括号中须要必须使用引号,不然会被认为是变量 obj['a'],方括号内还可使用表达式,数字不须要加引号由于会自动转化为字符串安全

4.函数体内部声明的函数,做用域绑定在函数体内部闭包

5.闭包能够简单理解为:定义在一个函数内部的函数,本质上,闭包就是将函数内部和函数外部链接起来的一座桥梁app

闭包还能够形象的理解为中国的父子关系 父函数包裹着子函数,父里面定义的局部变量子均可以访问(父母老是毫无保留的对待孩子),父不能访问子里面定义的变量,除非子return出去(父母不会直接去索取孩子的东西,除非孩子本身给)异步

注意:外层函数每次运行,都会生产新的闭包,而这个闭包又会保存外层函数的内部变量,因此内存消耗很大,所以不能滥用闭包,不然会形成网页的性能问题函数

6.当即调用的函数表达式,能够避免污染全局变量 性能

(function(){ /* code */ }());
// 或者
(function(){ /* code */ })(); //分号是必须的

7.eval 接受一个字符串做为参数,并将这个字符串当作语句执行,若是不是字符串,就原样返回,若是字符串没法按照语句执行就会报错,eval没有本身的做用域,都在当前做用域执行,所以会修改当前做用域的变量,形成安全问题,为了防止这种风险,JavaScript规定,若是有严格模式‘use strict’ eval内部声明的变量,不会影响外部,可是仍会修改外部变量不推荐使用,通常用在解析JSON字符串,可是能够用JSON.parse代替。除了eval()是直接调用,其余都是别名调用,window.eval(' ...')or eval.call(null,',,') eval的别名调用,做用域都是全局做用域ui

8.foreach不返回值,只用来操做数据,若是数组遍历的目的是用来获得返回值,那么使用map方法.this

9.Javascript提供apply,call,bind这三个方法,来切换/固定this的指向.①.call参数是一个对象,若是参数为空,null,undefined则默认传入全局对象.也能够传入多个参数,第一个参数是this所要指向的对象,后面的参数是函数调用时所需的参数,例如

function add(a, b) {
  return a + b;
}

add.call(this, 1, 2) // 3

 

②.apply方法与call相似,惟一区别是func.apply(thisValue,[arg1,arg2,...]),apply接收一个数组做为函数执行时的参数,这样就会有一些应用 ,

1.找出数组最大的元素

var a =[23,45,6,77] 
Math.max.apply(null,a)
//77

2.将数组的空元素变为undefined

 Array.apply(null,[a,,b]) //['a',undefined,'b']
//空元素和undefined的区别在于,使用forEach遍历数组的时候会跳过空元素,可是不会跳过undefined,undefined会被打印出来

 

3.转换相似数组对象,另外,利用数组对象的slice方法,能够将一个相似数组的对象(好比arguments对象)转为真正的数组。

Array.prototype.slice.apply({0: 1, length: 1}) // [1]
Array.prototype.slice.apply({0: 1}) // []
Array.prototype.slice.apply({0: 1, length: 2}) // [1, undefined]
Array.prototype.slice.apply({length: 1}) // [undefined]

③.bind用于将函数体内的this绑定到某一个对象上,而后返回一个新的函数

注意事项:1.每一次返回一个新的函数,这样会产生一些问题,好比监听事件的时候不能这样

element.addEventListener('click', o.m.bind(o));
element.removeEventListener('click', o.m.bind(o));
//这样绑在一个匿名函数上面,没法取消绑定

正确的应该这样

var listener = o.m.bind(o);
element.addEventListener('click', listener);
//  ...
element.removeEventListener('click', listener);

 10.原型链:Object.prototype对象有没有它的原型呢?回答是Object.prototype的原型是nullnull没有任何属性和方法,也没有本身的原型。所以,原型链的尽头就是null

 11.异步-定时器 例如,用户输入后当即将字母转换成大写的(会有不少相似的应用)

<input type="text" id="input-box">

//这样子是达不到目的的,它只能将本次输入前的字符转为大写的,由于浏览器还没收到新的文本,document.getElementById('input-box').onkeypress = function (event) { this.value = this.value.toUpperCase(); }

可是使用setTimeout改写,就能够了

document.getElementById('input-box').onkeypress = function() {
  var self = this;
  setTimeout(function() {
    self.value = self.value.toUpperCase();
  }, 0);
}
//放在setTimeout之中,就能使得它在浏览器接收到文本后再触发

12.异步-Promise

const p1 = new Promise((resolve, reject) => {
  resolve('hello');
})
.then(result => result)
.catch(e => e);

const p2 = new Promise((resolve, reject) => {
  throw new Error('报错了');
})
.then(result => result)
.catch(e => e);

Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// ["hello", Error: 报错了]

注意,若是做为参数的 Promise 实例,本身定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()catch方法。

Promise.race方法一样是将多个 Promise 实例,包装成一个新的 Promise 实例。

13.同源 

所谓同源指的是三个相同 ①:协议相同 ②:域名相同 ③:端口相同

相关文章
相关标签/搜索