笔记:JavaScript(下)

笔记:JavaScript(下),第1张

笔记:JavaScript(下)
  • 数据类型判断
  • 数据类型转换
  • Global
  • Math
    • bigint
  • RegEep
    • 常用正则表达式符号
  • Date
  • JSON
  • Module
  • ES6其他新特性
  • 严格模式
  • 性能优化

数据类型判断

typeof *** 作符可以判断并返回的值有:numberundefinedbooleanstringsymbolfunctionobject
typeof *** 作符处理null返回的是objectnull表示一个空对象指针。

typeof value;                           /* 判断变量类型 */
obj instanceof constructor;             /* 判断实例的原型链中是否含有构造函数 */
!value && typeof value === "object";    /* 判断null */
Array.isArray(value);                   /* 判断数组类型 */
数据类型转换

其他类型 转 Number
Number()将布尔值转为01,空字符串''null转为0,非纯数字字符和undefined转为NaN。如果传入参数是对象,则会依次调用valueOf()toString()方法的返回值作为参数。
parseInt()parseFloat(),先将变量转为字符串再从头提取有效数字,非有效数字均返回NaNparseInt()支持不同进制。ES6中这俩方法存在Number中。
-*/%作为二元运算符,会将其他类型通过Number()转换为数值,再进行运算。
+-作为一元运算符,效果与①相同,转换成数值后再添加正负号。

Number(v);
parseInt(v, 16);    Number.parseInt();
parseFloat(v);      Number.parseFloat();
v = +'123';

其他类型 转 String
toString()nullundifined无法调用该方法,数值调用该方法可以传入一个参数指定进制数。
String()toString()基础上,能转换nullundifined
+作为二元运算符,任何值与字符串相加,先将任何值通过String()转换为字符串,再拼接字符串。
join()将数组转换为字符串。

v.toString();
String(v);
v = 123 + '';
v = arr.join('');

其他类型 转 Boolean
Boolean()0NaN,空字符串''undefinednull会转为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

ES6其他新特性

解构赋值
①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);
}

函数柯里化

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/742214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存