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
的原型是null
。null
没有任何属性和方法,也没有本身的原型。所以,原型链的尽头就是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.同源
所谓同源指的是三个相同 ①:协议相同 ②:域名相同 ③:端口相同