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
的原型是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.同源
所谓同源指的是三个相同 ①:协议相同 ②:域名相同 ③:端口相同