- 数据类型判断
- 数据类型转换
- Global
- Math
- bigint
- RegEep
- 常用正则表达式符号
- Date
- JSON
- Module
- ES6其他新特性
- 严格模式
- 性能优化
①typeof
*** 作符可以判断并返回的值有:number
,undefined
,boolean
,string
,symbol
,function
,object
。
②typeof
*** 作符处理null
返回的是object
,null
表示一个空对象指针。
typeof value; /* 判断变量类型 */
obj instanceof constructor; /* 判断实例的原型链中是否含有构造函数 */
!value && typeof value === "object"; /* 判断null */
Array.isArray(value); /* 判断数组类型 */
数据类型转换
其他类型 转 Number
①Number()
将布尔值转为0
或1
,空字符串''
和null
转为0
,非纯数字字符和undefined
转为NaN
。如果传入参数是对象,则会依次调用valueOf()
或toString()
方法的返回值作为参数。
②parseInt()
和parseFloat()
,先将变量转为字符串再从头提取有效数字,非有效数字均返回NaN
。parseInt()
支持不同进制。ES6中这俩方法存在Number中。
③-*/%
作为二元运算符,会将其他类型通过Number()
转换为数值,再进行运算。
④+-
作为一元运算符,效果与①相同,转换成数值后再添加正负号。
Number(v);
parseInt(v, 16); Number.parseInt();
parseFloat(v); Number.parseFloat();
v = +'123';
其他类型 转 String
①toString()
,null
和undifined
无法调用该方法,数值调用该方法可以传入一个参数指定进制数。
②String()
在toString()
基础上,能转换null
和undifined
。
③+
作为二元运算符,任何值与字符串相加,先将任何值通过String()
转换为字符串,再拼接字符串。
④join()
将数组转换为字符串。
v.toString();
String(v);
v = 123 + '';
v = arr.join('');
其他类型 转 Boolean
①Boolean()
将0
,NaN
,空字符串''
,undefined
和null
会转为false
,其他情况转为true
,对象也是true
。
②! && ||
作为运算符,效果与①相同。
Boolean(v);
v = !!10;
其他类型 转 Array
①字符串转数组,使用Array.from()
方法。
②字符串转数组,使用String.split()
方法。
③字符串转数组,使用扩展运算符...
,能够识别32位的Unicode字符。
④Set、Map转数组,使用扩展运算符...
arr = Array.from(str);
arr = str.split('');
arr = [...str];
arr = [...set]; arr = [...map];
Global
①Global是JS的全局对象,内置原生方法和属性。
内置属性
undefined; NaN; Infinity;
内置方法
isNaN(); isFinite(); eval();
parseInt(); parseFloat(); Object();
encodeURI(); encodeURIComponent(); Array();
decodeURI(); decodeURIComponent(); Function();
Boolean(); String(); Number();
Date(); RegExp(); Symbol();
Error(); EvalError(); RangeError();
ReferenceError(); SyntaxError(); TypeError();
URIError();
②window对象是浏览器对Global的代理,并添加了额外的属性和方法。
Math①**
指数运算符。
Math.ceil(); /* 向上取整 */ Math.clz32(); /* 返回一个32位无符号整数的前导0的个数 */
Math.floor(); /* 向下取整 */ Math.imul(); /* 32位带符号整数的乘积,用于特别大的数 */
Math.round(); /* 四舍五入取整 */ Math.fround(); /* 返回一个数的单精度浮点数形式 */
Math.random(); /* 生成0-1之间的随机数 */ Math.expm1(x); /* e^x-1 */
Math.max(); /* 最大值 */ Math.log(x); /* ln(x) */
Math.min(); /* 最小值 */ Math.log1p(x); /* in(1+x) */
Math.trunc(); /* 去除一个数的小数部分 */ Math.log10();
Math.sigh(); /* 判断一个数是正数、负数还是0 */ Math.log2();
Math.signbit(); /* 判断一个数是否带负号 */ Math.sinh();
Math.cbrt(); /* 立方根 */ Math.cosh();
Math.hypot(); /* 返回所有参数的平方和的平方根 */ Math.tanh();
Math.asinh(); Math.acosh();
Math.atanh(); Math.pow(); /* 指数运算 */
bigint
①整数后加上n
后缀表示大数,不可与数值混合运算。
②不支持无符号右移>>>
、一元运算符+
、相等运算符==
。
③除法运算会舍去小数部分。
let num = 5n / 3n;
RegEep
正则表达式修饰符
①i
忽略字母大小写。
②g
全局匹配模式。
③u
正确处理大于\uFFFF
的Unicode字符。
④y
类似全局匹配模式,从匹配剩余字符串的头部字符开始匹配,但最开头的字符需要与模板相同。
⑤s
使.
能够匹配上换行符、回车符、行分隔符和段分隔符。
⑥m
多行匹配模式。
let reg = new RegExp('正则表达式', '修饰符');
let reg = /正则表达式/修饰符;
reg.lastIndex; /* 每次匹配的开始位置索引 */
reg.flags; /* 正则表达式的修饰符 */ reg.source; /* 正则表达式的正则表达式 */
reg.global; /* 是否设置了g修饰符 */ reg.sticky; /* 是否设置了y修饰符 */
reg.ignoreCase; /* 是否设置了i修饰符 */ reg.dotAll; /* 是否设置了s修饰符 */
reg.unicode; /* 是否设置了u修饰符 */ reg.multiline; /* 是否设置了m修饰符 */
reg.test(str); /* 判断正则表达式匹配是否成功,返回布尔值 */
reg.exec(str); /* 执行一次正则表达式匹配,返回数组形式的匹配结果信息 */
具名组匹配
①正则表达式用括号进行组匹配,返回一个数组包含多个括号内的匹配结果信息。
②?<变量名>
可以给匹配组命名。
③或
\k<变量名>
可以在正则表达式中引用具名组匹配。
④$<变量名>
可以在替换字符串时引用具名组匹配结果。
reg = /(?\d{4}) /; /* 具名组匹配 */
reg.exec(str).groups.value; /* 获取匹配结果变量的值 */
reg = /(?\d{4}_\1_\k) /; /* 引用具名组匹配 */
str.replace(reg, "$" ); /* 用匹配结果替换 */
常用正则表达式符号
a|b /* a或b */
[A-z] /* A到z的或 */
[^ab] /* 除了a和b以外 */
a{3} /* 连续3个a */
(ab){1, 3} /* 连续1到3个ab */
(ab){3, } /* 连续3个以上ab */
a+ /* 至少1个a */
a* /* 至少0个a */
a? /* 1个或0个a */
^a /* 以a开头 */
a$ /* 以a结尾 */
. /* 表示任意字符 */
\., \\ /* .和\的转义字符 */
\w, \W /* 含有任意字母和数字和下划线,不含字母和数字和下划线 */
\d, \D /* 含有任意数字,不含任意数字 */
\s, \S /* 含有任意空格,不含任意空格 */
\b, \B /* 含有单词边界,不含单词边界 */
Date
moment.js等第三方库包含各种Date日期的格式化。
let time = new Date(); /* 获取当前时间 */ Date.now(); /* 获取当前时间戳 */
time.getDate(); /* 获取当前几日 */ Date.prase(); /* 解析时间字符串为时间戳 */
time.getDay(); /* 获取当前周几,0为周日 */ Date.UTC(); /* 解析时间字符串为时间戳 */
time.getMonth(); /* 获取当前月份,0为1月 */
time.getFullYear(); /* 获取当前年份 */
time.getHours(); /* 获取当前小时 */
time.getSeconds(); /* 获取当前秒 */
time.getMinutes(); /* 获取当前分钟 */
time.getTime(); /* 获取当前时间戳 */
JSON
JSON.parse(json); /* 解析json格式为对象 */
JSON.stringify(obj); /* 对象转换成json格式 */
对象深拷贝
JSON.parse(JSON.stringify(obj));
Module
①ES6的模块使得JS大程序能拆分成小文件。模块是静态加载,即在编译阶段完成模块的加载。
②export
语句将模块内部的变量、函数或Class对外暴露,并可以用as
语句重命名。变量的值改变时,对外暴露的值也随之改变,是动态对应的关系。
export let module = 1; /* 将变量module对外暴露 */
export {module as anyname};
③import
语句从其他模块中引入相应的变量、函数或Class,并可以用as
语句重命名。import
语句会提升到整个模块的头部,在编译阶段最先执行。
④import
可以用*
将引入模块中所有的变量打包成对象,需要配合as
使用,该对象不可被修改。整体引入会忽略export default
的暴露。
import {module as anyname} from './'; /* 从./模块引入module变量 */
import * as anyname from './'; /* 从./模块引入所有 */
⑤export default
为模块对外暴露匿名变量,用import
引入匿名模块时可以任意起名,且不必使用大括号。每个模块只能有一个export default
。
⑥export default
本质是对外暴露一个重命名为default
的变量,引入时重命名为任意变量名。所以export default
后面不能跟变量声明语句。
export default module; /* 匿名暴露模块 */
import anyname from './'; /* 引入匿名模块 */
⑦如果在模块中先引入其他模块再暴露相同模块,可以用复合写法。
export {module as anyname} from './';
export * from './';
export {default} from './';
export {module as default} from './';
export {default as module} from './';
⑧import()
能够动态懒加载模块,在代码执行j阶段进行模块加载,函数的参数即需要加载模块的路径。
⑨import()
可同时加载多个模块,在成功加载模块后,模块会被当做为一个对象参数传入thien()
方法。
Promise.all([import('./1'), import('./2')]).then(([module1, module2]) => {});
⑩循环加载模块的时候,已经被执行的模块不会被重复执行,所以暴露变量的取值可能是undefined
。
解构赋值
①Array、Object、String、Set等带Iterator接口的数据结构允许解构赋值。
②解构赋值可在等号左边设置默认值,当等号右边严格等于undefined
时,自动使用默认值。
③解构失败时,变量赋值为undefined
。
④解构赋值是浅拷贝。
⑤可用于交换变量,函数返回多个值,函数参数定义,提取JSON数据,函数参数默认值,Map结构遍历,提取模块的指定方法。
let [x = 6, [y, z]] = [3, [z, y]];
let {x, y: z} = {x: 3, y: 5};
Null传导运算符
①?.
读取深度嵌套在对象链中的属性值,而不必验证每个属性是否存在。当属性不存在时,表达式停止计算并返回undefined
,否则为读取该值。
p?.next?.next; /* 等同于 */ p && p.next && p.next.next;
非空运算符
①??
当第一个参数不是undefined或null时,返回第一个参数,否则返回第二个参数。与||
不同的是,??
只针对undefined或null,当第一个参数是0或false,依然返回第一个参数。
②??=
空赋值运算符。当第一个参数是undefined或null时,将第二个参数复制,否则依然是原值。
let a;
let b = a ?? 5; /* b=5 */
let a ??= 5 /* a=5 */
严格模式
性能优化
函数尾调用
①函数尾调用优化,大大节省内存。例如尾调用递归,确保递归函数最后一步只调用自身,把所有的内部变量改写成函数参数。
②需要开启严格模式。
function Fibonacci (n, ac1 = 1, ac2 = 1){
if (n <= 1) return ac2;
return Fibonacci(n - 1, ac2, ac1 + ac2);
}
函数柯里化
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)