温习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.闭包可以简单理解为:定义在一个函数内部的函数,本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁

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

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

6.立即调用的函数表达式,可以避免污染全局变量 

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

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

8.foreach不返回值,只用来操作数据,如果数组遍历的目的是用来得到返回值,那么使用map方法.

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.同源 

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

猜你喜欢

转载自www.cnblogs.com/alhh/p/9663431.html