javascript笔记
js笔记
- js中只是声明而没有赋值的变量为“undefined”,表示无定义
- javascript引擎的工作方式是,先解析代码获取所有被声明的变量,然后再一行行运行,这会造成所有变量的声明语句被提升到代码头部,即变量提升。如:
console.log(a); var a = 1; //实际执行的是 var a; console.log(a); a = 1;
这种情况不会报错,因为存在变量提升,所以结果是,undefined - break语句是跳出代码块或循环
而continue语句是终止本轮循环,返回循环头部,开始下一轮循环
注:存在多层循环,不带参数的break和continue都只针对最内层循环 - typeof
数值 ------- number
字符串 ----- string
布尔值 ----- boolean
函数 ---------function
undefined---undefined
[]/{}------------object
window-------object
null-------------object
(null是由于一开始js只考虑了五种数据类型,只把null当成一种object的特殊值,后来null独立出来作为一种单独的数据类型,为了兼容以前的代码没有改变) - null和undefined
null表示该处的值为空,是不存在的事物,可以通过设置值为null来清空对象,转为数值时是0
undefined表示‘未定义’,转为数值时是NaN,通常是://变量声明未赋值 var i; i //undefined //调用函数,应该提供的参数没有提供 function f(x) { return x; } f() //undefined //对象未赋值的属性 var o = new Object(); o.p //undefined //函数没有返回值时,默认返回undefined function f(){} f() //undefined
- 以下布尔值为false
null,undefined,false,0,NaN,"",'' - javascript 中所有数字都是以64位浮点数形式存储
所以: 1 === 1.0 //true
提供的有效数字最长(即精度):53 个二进制位即绝对值小于2的53次方,超出之后,多出来的有效数字无法保存,变成0 - Number对象的MAX_VALUE和MIN_VALUE属性返回具体最大最小值
Number.MAX_VALUE; //1.7976931348623157e+308 Number.MIN_VALUE; //5e-324
- 以下情况js自动转换为科学计数法
小数点前多于21位,小数点后0多于5个 - NaN
NaN === NaN //false Boolean(NaN) //false typeof NaN //' Number' [NaN].indexOf(NaN) //-1 //Infinity或-Infinity 与 NaN 比较也是 false
- isNaN
isNaN方法只对数值有效,其他会被先转换成数值isNaN('Hello') //true 相当于isNaN(Number('Hello')) //对象和数组 {}/['xyz'] true //空数组和只有一个数值成员 isNaN([]) //false isNaN([123]) //false isNaN(['123']) //false
- isFinite
返回布尔值,表示是否为正常数字
Infinity/-Infinity/NaN/undefined 返回 false - 转义字符
\u : null \r : 回车
\b : 后退 \t : 制表
\f : 换页 \v : 垂直制表符
\n : 换行 - Base64转码
一种编码方式,将任意值转成可打印字符btoa() //: 任意值转成Base64编码 atob() //: Base64编码转回原来的值 //非ASCII码字符报错
- argument
argument对象包含了函数运行时的所有参数,argument[0]就是第一个参数,以此类推 - promise
promise是一个对象,也是一个构造函数
通过自身的状态控制异步操作
pending-----未成功
fulfilled-------成功
rejected------失败
这三种状态的变化途径只有未成功到成功或失败,一旦状态变化就凝固了,也就是promise实例的状态变化只能发生一次,所以最终只有两种结果。 - promise构造函数
//Promise构造函数接受一个函数作为参数 //resolve参数将Promise实例的状态从未完成 变成 成功 //reject将未完成 变成 失败 var promise = new Promise(function(resolve,reject){ //....... if(/*fulfilled*/){ resolve(value); }else(/*rejected*/){ reject(new Erro); } });
- Set
Set本身是一个构造函数,用来生成Set数据结构,Set结构不会添加重复的值。
向Set加入值时,不会发生类型转换(Set加入值认为NaN等于自身)
.size //返回Set实例的成员总数
.add //添加值,返回Set结构本身
.has //返回布尔值,表示是否是Set的成员
.delete //删除某个值,返回布尔是否成功
.clear //清除所有成员,无返回值
Array.from可以把Set结构转为数组
去除数组重复function dedupe(array){ return Array.from(new Set(array)); } dedupe([1,1,2,3]) //[1,2,3]
- Set遍历*
keys(),values(),entries(),forEach()
键名,键值,键值对,回调函数遍历每个成员 - 遍历顺序就是插入顺序*
- Map
Map提供 : 值---值 的对应 - Iterator
遍历器,是一种接口,提供统一的访问机制。
主要供for..of消费
遍历过程主要是:
创建一个指针对象,对象的next方法指向数据结构的第一个成员,不断被调用直到指向结束位置。var it = makeIterator(['a','b']); it.next(); //{value:"a",done:false} it.next(); //{value:"b",done:false} it.next(); //{value:undefined,done:true} function makeIterator(array){ var nextIndex = 0; return{ next: function(){ return nextIndex < array.length ? // {value:array[nextIndex++],done:false} : // {value:undefined,done:true}; //可简写 {value: array[nextIndex+=]} : {done: true}; } }; }
- 原生具备Iterator接口
Array,Map,Set,String,TypedArray,函数的arguments对象,NodeList对象
扩展运算符也会调用默认的Iterator接口 - for...of
作为遍历所有数据结构统一的方法
可以与break,continue,return配合使用 - Generator
语法上理解为封装多个内部状态
形式上理解为function与函数名间有*,内部使用yield定义状态function* helloWorldGenerator(){ yield 'hello'; yield 'world'; return 'ending'; }//函数不执行,返回的是一个指向内部状态的指针对象 var hw = helloWorldGenerator(); //必须调用next方法使指针移向下一个状态 hw.next();//{value: 'hello',done: false} hw.next();//{value: 'world',done: false} hw.next();//{value: 'ending',done: false} hw.next();//{value: undefined,done: true} //next方法遇到yield表达式就暂停执行后面的操作,并紧跟yield //后面的那个表达式的值,下一次再向下...
for..of遍历Generator一旦next返回true就会停止,且不返回这个对象 - async
执行和普通函数一样
asyncReadFile();
async+await代替*+yield
async函数返回Promise对象(意味着可以使用then)