一、变量
1、基本数据类型
String,Number,Boolean,Undefined,Symbol
2、转换规则
数据类型 | 转换为true | 转换为false |
---|---|---|
String | 任何非空字符串 | " "(空字符串) |
Number | 任何非零数值 | 0和NaN |
Object | 任何对象 | null |
undefined | – | undefined |
null
undefined和null与任何有意义的值比较返回的都是false,
但是null与undefined之间互相比较返回的是true
null == false //false
null == true //false
null == undefined //true
null == 0 //false
null >= 0 //true
变量定义
var a=b=3
相当于 var a = 3;b = 3;a是局部变量,而b是全局变量
3、 一元操作符
+:将值转为number类型
console.log(1+ +"2"+"2");
第一个+"2"中的加号是一元加操作符,+"2"会变成数值2,因此1+ +“2"相当于1+2=3.
然后和后面的字符串“2”相合并,变成了字符串"32”.
+new Array(017) // NaN
二、attr/func
1. hasOwnProperty
: 检测给定的属性是否在当前对象的实例中。
2. export & import
export
// Exporting individual features
export let name1, name2, …, nameN; // also var, const
export let name1 = …, name2 = …, …, nameN; // also var, const
export function functionName(){...}
export class ClassName {...}
// Export list
export { name1, name2, …, nameN };
// Renaming exports
export { variable1 as name1, variable2 as name2, …, nameN };
// Exporting destructured assignments with renaming
export const { name1, name2: bar } = o;
// Default exports
export default expression;
export default function (…) { … } // also class, function*
export default function name1(…) { … } // also class, function*
export { name1 as default, … };
// Aggregating modules
export * from …; // does not set the default export
export * as name1 from …; // ECMAScript® 2O20
export { name1, name2, …, nameN } from …;
export { import1 as name1, import2 as name2, …, nameN } from …;
export { default, … } from …;
import
import defaultExport from "module-name";
import * as name from "module-name";
import { export1 } from "module-name";
import { export1 as alias1 } from "module-name";
import { export1 , export2 } from "module-name";
import { export1 , export2 as alias2 , [...] } from "module-name";
import defaultExport, { export1 [ , [...] ] } from "module-name";
import defaultExport, * as name from "module-name";
import "module-name";
var promise = import("module-name");
三、数组
1.会&不会改变数组的方法
//会改变数组的方法:
push()
pop()
shift()
unshift()
splice() //删除或替换现有元素或者原地添加新的元素来修改数组
sort()
reverse()
forEach()
//不会改变数组的方法:
filter()
concat()
slice() //浅拷贝
map()
2.赋值
a[n]: 数组长度自动延长到n+1,没有赋值的元素均为undefined
3.sort
sort((a, b) => a - b) : 升序 [1, 2, 3, 4, 5]
4.创建 Array 的语法
var arr=[1,2,3];
var arr=new Array(1,2,3);
var arr=new Array(12); //如果只有一个数,代表数组的length是12个
var arr=new Array(0); //清空数组
四、字符串
1、数字后面.会被解析为小数点
2.toString() :将会优先将小数点解析为数字小数点
2…toString() :因为连续的两个小数点不符合number的格式规则,第二个小数点才会被解析为调用方法
五、函数
1.全局函数
- 编码相关:
escape()、unescape()、encodeURI()、decodeURI()、
encodeURIComponent()、decodeURIComponent() - 数据处理:
Number()、String() - 数字相关:
isFinite()、isNaN()、parseFloat()、parseInt() - 特殊:
eval()
2. this/箭头函数
普通函数,this永远指向它的调用者;
箭头函数,this指向定义时的上下文
3.原型
- 只有实例对象上不存在的属性和方法才会去原型上查找
- 构造函数的原型对象的构造器指回构造函数本身
- 给构造函数本身添加的方法是静态成员,想要访问静态成员,只能构造函数本身去调用方法,而由构造函数构造出来的实例对象不能直接访问静态成员(属性、方法)
- Function & Object
Function.prototype.a = 'a';
Object.prototype.b = 'b';
function Person(){};
var p = new Person();
console.log('p.a: '+ p.a); // p.a: undefined
console.log('p.b: '+ p.b); // p.b: b
Person函数才是Function对象的一个实例,所以通过Person.a可以访问到Function原型里面的属性,但是new Person()返回来的是一个对象,它是Object的一个实例,是没有继承Function的,所以无法访问Function原型里面的属性。
由于在js里面所有对象都是Object的实例,所以,Person函数可以访问到Object原型里面的属性。
六、回收
1.代码回收规则
1.全局变量不会被回收。
2.局部变量会被回收,也就是函数一旦运行完以后,函数内部的东西都会被销毁。
3.只要被另外一个作用域所引用就不会被回收
2.闭包
for(var i = 0;i<2;i++){
setTimeout(function(){console.log(i)},0) ....①
}
for(var i = 0;i<2;i++){
(function(i){
setTimeout(function(){console.log(i);},0) ...②
}(i))
}
①setTimeout是异步的,定时函数被加入执行队列,等(for循环)主程序运行完毕时,此时再调用定时函数,i的值已经变为2,两次的定时函数都会共用i=2这个值,因此打印2个2
②js的作用域是链式的,当for循环函数内部的子块有引用的时候是不会销毁的。这里运用了闭包,外层 function(i)保持着对i的引用,因此每次 i的值得以保留,每次调用定时函数内层function都有自己的私有变量值。 因此打印 0 1
②式中如果把function的参数i去掉,没有对i的引用,结果就和①式一样了
七、循环遍历
1.for in
- 遍历的的属性值是字符串,而不是数字!
- 遍历的是对象的枚举属性,包括自身属性以及原型链上的属性
【 不可枚举属性(enumerable: false)不会被遍历 】 - 遍历顺序是对象属性的枚举顺序,并不一定按数组的下标顺序遍历
八、事件绑定
1.父子调用顺序
在JS中,绑定的事件默认的执行时间是在冒泡阶段执行,而非在捕获阶段,这也是为什么当父类和子类都绑定了某个事件,会先调用子类绑定的事件,后调用父类的事件。
e.preventDefault() :阻止默认事件
e.stopPropagation() :阻止事件冒泡