前端-javascript--JavaScript语法
1、JavaScript的组成JavaScript由ECMAScript(JavaScript语法)、DOM(文档对象模型)、BOM(浏览器对象模型)2、输入输出语句head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleDocument/title script //1.alert()弹框 alert(这是弹出框提示文本) //2.confirm()返回true或false var x; var r confirm(请按下按钮!); if (r true) { x 你按下的是\确定\按钮。; } else { x 你按下的是\取消\按钮。; } document.write(x) //3.prompt() 返回第二个参数内容 var x; var name prompt(请输入你的名字, Keafmd); //显示默认文本 Keafmd if (name ! null name ! ) { x 你好! name 。; document.write(x) } //4.console.log()后台打印 /script /head body palert是阻塞的函数/p p这句话只有在确认弹出框的提示文本后才会显示/p /body3、变量3.1 变量命名由字母(A-Z,a-z)数字(0-9)下划线(_)美元符号($)组成如:usrAge,num01,__name不能以数字开头不能用关键字命名区分大小写如Var与var不同3.2 变量提升再预编译阶段会进行变量提升即定义提取到最前面。var关键字变量提升初始值为undefinedfunction会变量提升,初始值为函数定义值优点解析和预编译过程中的声明提升可以提高性能让函数可以在执行时预先为变量分配栈空间声明提升还可以提高JS代码的容错性使一些不规范的代码也可以正常执行。缺点变量提升导致的问题变量被覆盖变量没有被销毁3.3 let const var的区别区别let 和const 定义的变量不能变量提升var可以变量提升。尝试在声明前去使用 let 和 const这两个关键字声明的变量就会报错形成暂时性死区。let 和const不能重复声明。var可以重复声明。const定义时就要初始化let 和const不用。3.4 变量提升考题具体参考JavaScript之预编译与变量提升、window、AO、GO、return、if_aoif_牧码侠的博客-CSDN博客补充习题理解//会报错fn is not a function关键字变量提升fn但是没有赋值其值为Undefined,没有指向函数地址 //执行顺序是var fnundefined fn() fnfunction(){} fn() var fnfunction(){} //函数变量提升知道了函数的名字与其地址,执行顺序是function fn2(){} fn2() fn2() function fn2(){}1、 var a 1; function b(){ a 10; //覆盖了内部的函数对象函数内部变量按照作用域链进行查找 return; function a(){ console.log(a); } } b(); console.log(a); //1 var name1 Tom; function aa() { // var name1 Jack; name1 Jack; console.log(name1); //jack } aa(); console.log(name1); //函数内部var name1 Jack;结果时“Tom”函数里面前后修改name1不影响外部 //函数内部 name1 Jack;结果时Jack // 因为预编译不管是否会进入判断 // 都会发生变量提升 2、 var a 1; function b(){ a 10; } b(); console.log(a); //10 3、 function a(a) { var a; console.log( a); // 1 先变量提升然后形参赋值再函数赋值再执行代码 } a(1); function a(a) { var a 2; console.log(EE, a); //2 } a(1); function a(a) { console.log(EE, a); //函数作用域链 function a() { var b 5; console.log(b); } } a(1); 3、 立即执行函数不可以调用也不会进行变量提升 var name1 Tom; //aa is not defined console.log(aa); (function aa() { console.log(name1, typeof name1); var name1 Jack; //存在时nameundefined,不存在时nameTom })(); //aa is not defined console.log(aa);拓展结合原型链new new Foo().getName()笔试考题优先级等问题_new foo.print-CSDN博客凡科前端笔试之打印题_前端打印什么的题目-CSDN博客//写出以下输出结果 function Foo() { getName function () { alert (1); }; return this; } Foo.getName function () { alert (2);}; Foo.prototype.getName function () { alert (3);}; var getName function () { alert (4);}; function getName() { alert (5);} //请写出以下输出结果 Foo.getName(); // 2 getName(); // 4调用匿名函数 Foo().getName(); // 1 修改getName函数 getName(); // 1 new Foo.getName(); // 2 new( Foo.getName()) new Foo().getName(); // 3 ( new Foo()).getName() new new Foo().getName(); // 3Foo.getName()直接访问 Foo 上的静态方法 →2getName()变量声明提升函数声明alert(5)先提升后被变量赋值alert(4)覆盖 →4Foo().getName()执行Foo()内部把全局 getName覆盖为alert(1)Foo()返回this这里是 window所以执行window.getName()→1getName()全局 getName 已经被改成 1 →1new Foo.getName()点运算符优先级高于 new等价new (Foo.getName)()执行静态方法 →2new Foo().getName()等价(new Foo()).getName()实例上没有 getName去原型找 →3new new Foo().getName()等价new ((new Foo()).getName)()依然是原型上的方法 →34、数据类型JS 把数据类型分为两类基本数据类型(Undefined,Nullsymbol,bigintNumber,String,Boolean,),存在栈中。复杂数据类型(Object ArrayfunctionMathDateRegExp)存在堆中地址交给存在栈中的变量名管理补充其中基础数据类型的 boolean、number、string又称为包装类型valueOf() 是 Object 的原型方法它定义在 Object.prototype 对象上所有 Object 的实例对象都会继承 valueOf() 方法。对数据的操作是灵魂哟所以有需要的就根据自己情况做笔记哈哈哈5、Undefined与NulltypeOf null //Object null instanceof Object //false null undefined //false null undefined //TRUE NaN NaN //false isNAN(Number(NAN)) //TRUE alert(0 ); //true alert(0 false); //true alert(false ); //true alert(null undefined); //true alert(!0); //true alert(!false); //true alert(!undefined); //true alert(!null); //true alert(!); //true alert(0 undefined); //false alert(0 null); //false alert(false null); //false alert(false undefined);//false alert( null); //false alert( undefined); //false console.log(10null,10,10undefined,10false,100) //10 10 NaN 10 100 console.log(10[1,a],10[1,a],10[1,2],10[1,2]) //101,a 101,a 101,2 101,2 console.log(parseInt([1q,2])) //1 console.log([]0,[]false,[]undefined) //true,true,flase console.log(![],[],![],!,[]) //true true false true [] console.log(!{},{}false,1{}) //true false 1[object Object]5、SymbolSymbol生成唯一值相同参数生成两个Symbol值不相等Symbol.for() 用于将描述相同的Symbol变量指向同一个Symbol值Symbol.keyFor()是用来检测该字符串参数作为名称的Symbol值是否已被登记返回一个已登记的Symbol类型值的keyconst s3 Symbol(debug); const s4 Symbol(debug); console.log(s3 s4); // false let a1 Symbol.for(a); let a2 Symbol.for(a); a1 a2 // true let a3 Symbol.for(b); Symbol.keyFor(a3); // a let a4 Symbol(c); Symbol.keyFor(a4); // undefined6、Number参考JavaScript面试大师_Number类型_js面试 number-CSDN博客6.1、为什么0.1 0.2 0.300000000000000040.1和0.2是十进制小数对应分数是1/10和1/5将它们用二进制表示均是循环小数基于IEEE 754格式二进制表示循环小数实际上是截断后的近似值相加后的值比十进制的0.3略大。可以使用toFixed解决或者规定允许误差toFixed2保留两位小数四舍五入由误差6.2、给Number加一个方法newRound可以保留小数点后n位 (1.23457.newRound(2) - 1.23)6.3、Number(undefined) ,Number(null) typeof NaNNaN 0 number6.4、Number函数的转换规则Object转换为Number的规则如下对于复杂类型会先调用该值得valueOf()方法如果有并且返回基本类型之就是用该值进行强制类型转换。如果没有就是使用toString()的返回来进行强制类型转换。Number([])和Number([1,2,3])的值分别是什么说明其原理因为数组的valueOf()方法返回的是数组本身不是一个基本类型所以还会调用toString()方法而数组的toString()方法返回的是数组各项通过逗号拼接一起的字符串可以理解调用了Array.prototype.join(,)方法所以空数组返回空字符串转换为数组自然就是0而数组[1,2,3]则是“123”再转换为NaNNumber([100]) //1006.5、[1, 2, 3].map(parseInt) 答案是多少解答[1, NaN, NaN] 首先需要明确arr.map(function(item, index, arr){})以及parseInt(numStr, radix)迭代数组元素的过程中传给parseInt函数的第一个参数是item第二个是index因此返回结果为[parseInt(1, 0), parseInt(2, 1), parseInt(3, 2)]parseInt的第二个参数是进制基数后两个元素解析错误返回NaN6.6、parseIntstringradixparseInt(string,radix)以radix进制解析字符串,不会四舍五入parseInt(ff, 16) //15*16^115*16^02556.7、isNaN()与Nnuber.isNaN()isNaN()输入参数是否可以转化为数字即先进行Number转换再判断Nnuber.isNaN():先判断输入参数的类型是否为number再调用isNaN方法isNaN(11) //true isNaN(11a) //false6.8、字符串 任何类型 拼接之后的新字符串alert(100 100); // 100100console.log(11 undefined); // NaNconsole.log(true undefined);// NaNconsole.log(你好 undefined); // 你好undefined6.9、运算符优先级三元表达式//如果表达式1为 true 则返回表达式2的值如果表达式1为 false则返回表达式3的值表达式1 ? 表达式2 : 表达式3;6.10、短路运算(逻辑中断)alert(0a); 结是返回 01、只要 || 前面为 false无论 || 后面是true还是 false结果都返回 || 后面的值。2、只要 || 前面为 true无论 || 后面是true还是 false结果都返回 || 前面的值。3、只要 前面是 false无论 后面是true还是 false结果都将返 前面的值;4、只要 前面是 true无论 后面是true还是false结果都将返 后面的值;5、“”false0是一样的nullundefined7、String参考JavaScript 28个常用字符串方法及使用技巧 - 掘金 (juejin.cn)7.1、字符串方法你懂多少我薄弱点7.1.1、charCodeAt()该方法会返回指定索引位置字符的 Unicode 值let str abcdefg;console.log(str.charCodeAt(1)); // b -- 98拓展1、对应十进制的unicode编码“a”--97 A---65 1--482、将元素转化为unicode编码toString16方法10.toString2 //1010将数字转化为2进制的字母将字符串转化为unicode编码str.charCodeAt(i).toString(16);3、encodeURI(URIstring)encodeURI() 函数可把字符串作为 URI 进行编码。decodeURI(URIstring)decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码。7.1.2、string.split(separator,limit)separator必需。字符串或正则表达式limit可选。该参数可指定返回的数组的最大长度。const fruits list.split(/[,;]/4)7.1.3、slice(start,end) substring(start,end)返回的子串包括开始处的字符但不包括结束处的字符区别于string.substr(start,length)7.1.4、repeat(n)表示将原字符串重复n次,如果参数是小数会向下取整。如果参数是小于-1的负数或者Infinity会报错。参数是 0 到-1 之间的小数或NaN则等同于 0返回空字符串7.1.5、string.match(regexp)返回存放匹配结果的数组let str abcdef;console.log(str.match(c)) // [c, index: 2, input: abcdef, groups: undefined]笔试题var str 2[2[ab7[d]]3[c]]4[e]; const decode (str) { if (!/\d\[[a-zA-Z]\]/g.test(str)) return str; // var test str; // console.log(test.replace(/\d\[[a-zA-Z]\]/g, 啊)); str str.replace(/\d\[[a-zA-Z]\]/g, function (item, index) { //item是指7[d] 3[c] 4[e],index时item的起始下标 // console.log(测试, index, item); // 匹配符合规制的字符串 // var arrtest item.match(/\d\[[a-zA-Z]\]/); // console.log(arrtest, arrtest); // 匹配符合规制的字符串并保留括号里面的内容 // var arr item.match(/(\d)\[([a-zA-Z])\]/); // console.log(arr, arr); var arr item.match(/(\d)\[(.?)\]/).slice(1); var s arr[1].repeat(arr[0]); return s; }); // console.log(str, str); str decode(str); return str; }; decode(str); var matchStr {a}2{b{{c}d}2}3; const matchCode (matchStr) { if (!/\{[a-zA-Z]\}\d*/g.test(matchStr)) return matchStr; matchStr matchStr.replace(/\{[a-zA-Z]\}\d*/g, function (item, index) { console.log(item, index); var flagarr item.match(/\{([a-zA-Z])\}(\d*)/).slice(1); var s2 flagarr[1] ? flagarr[0] : flagarr[0].repeat(flagarr[1]); console.log(s2, s2); return s2; // console.log(flagarr, flagarr); }); matchStr matchCode(matchStr); console.log(matchStr, matchStr); return matchStr; }; matchCode(matchStr);7.1.6、string.search(searchvalue)返回相匹配的子串的起始位置。let str abcdef; str.search(/bcd/) // 输出结果17.1.7.parseInt(string, radix) 返回将string转化为radix进制的数字7.1.8、JSON.stringify将一个JavaScript对象或值转换为JSON格式字符串。参考JSON.parse 和 JSON.stringify 详解 - 掘金 (juejin.cn)JSON.stringify(value[, replacer [, space]])value将要序列化成 一个JSON字符串的JavaScript对象或值。replacer 可选用于处理将要序列化的值。space 可选指定缩进用的空白字符串用于美化输出。基本类型值字符串、数字、布尔值以及String、Boolean、Number对象值都会转成原始值字符串输出。基本类型的字符串转换结果会带双引号。 因为在还原时双引号会让JavaScript知道是字符串而不是变量。undefined、函数、symbol以及XML对象出现在Object对象中时会被忽略出现在数组中时会被序列化成null单独出现时会返回undefined。3.NaN、null都会被序列化成null。4.replacer参数如果是一个数组则只有包含在这个数组中的属性名才会最终被序列化到结果字符串中。只对对象的属性有效对数组无效。如果是一个函数被序列化的值的每个属性都会经过该函数的转换和处理。JSON.stringify(333) // 333 JSON.stringify(true) // true JSON.stringify(new String(333)) //333 JSON.stringify(Boolean(true)) // true JSON.stringify(Symbol()) // undefined JSON.stringify([Symbol(), Math.abs, undefined]) // [null,null,null] JSON.stringify({ [Symbol()]: Math.abs, key: undefined }) // {} const obj { json: JSON, parse: PARSE, stringify: STRINGIFY } JSON.stringify(obj, [parse, stringify]) // {parse:PARSE,stringify:STRINGIFY} JSON.stringify({ json: 1, stringify: rr }, (key, value) { if (typeof value number) { return ss } return value }) // {json:ss,stringify:rr}7.1.9、JSON.parse(text[, reviver])将json字符串转成json对象(js对象值)该方法也支持数字、布尔值和null三个类型的值转换出对应的字面值不支持数组不能使用undefined、Symbol和BigInt。数字也不支持NaN、Infinity和-InfinityJSON.parse(null) // null JSON.parse(111.) // 111 JSON.parse({key: 1 }) //{key: 1 } JSON.parse([]) //[]补充AJAX和JSON的区别ajax是一种通过后台与服务器进行少量的数据交换的异步JavaScript和xml使页面实现异步更新。json是一种轻量级的数据交换格式看着像对象本质是字符串ajax的优缺点优点可以实现异步通信效果页面局部刷新带来更好的用户体验。按需取数据减少了冗余请求和服务器的负担缺点异步回调问题、this指向问题、路由跳转back问题对搜索引擎的支持比较弱对于一些手机还不是很好的支持json的优缺点优点轻量级格式都是压缩的占用宽带小、易于人的阅读和编写便于js解析难度较低比起XML简单的多支持复合数据类型支持多种语言缺点 没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用性8、数组8.1、常用数组的方法你懂多少8.1.1、改变原数组的方法pop(),shift(),unshift(),push(),sort((a,b)a-b),splice(start,num,element),reverse(),fill()8.1.2、高阶函数的数组方法forEach,map,some,every,find,filter,sort,reduce8.1.3、普通数组方法concat,includes,indexOf,join8.2、考点我的薄弱点8.2.1、Array.from(iterable, mapFn, thisArg)将字符串活对象或字典转化为数组或者拷贝数组//使用类似数组的对象创建数组 const obj { 0: 榴莲, 1: 牛油果, 2: 蓝莓, length: 3 }; console.log( Array.from(obj)); //[ 榴莲, 牛油果, 蓝莓 ] //使用映射函数处理数组元素 const numbers [1, 2, 3, 4, 5]; const doubledNumbers Array.from(numbers, num num * 2); console.log(doubledNumbers); //[ 2, 4, 6, 8, 10 ]8.2.2、创建二维数组let aArray(5).fill(null) // - [null, null, null, null, null]8.2.3 将多维数组转化为一位数组function flatten(arr) { return [].concat(...arr.map((x) (Array.isArray(x) ? flatten(x) : x))); } let arr [[1, 2], 3, [[[4], 5]], 1]; var res arr.reduce((pre, cur) { if (Array.isArray(cur)) { cur flatten(cur); } return pre.concat(cur); }, []); const arr4 [1, [1, 2], [1, [3]]]; arr4.flat(Infinity)8.2.4 一维数组去重let setnew Set(arr)let arr[...set]8.2.5 二维数组去重function removeDuplicate(arr) { let obj {} arr.map(item { if (!obj[item]) { obj[item] true } }) return Object.keys(obj) } const arr [[1, 1], [2, 2], [1, 1]]; // 使用ES6 Set()去重 const deduplicatedArr Array.from(new Set(arr.map(JSON.stringify))).map(JSON.parse);9、对象9.1、创建对象的三种方式利用字面量创建对象利用 new Object创建对象利用构造函数创建对象//构造函数形式 function 构造函数名(形参1,形参2,形参3) { this.属性名1 参数1; this.属性名2 参数2; this.属性名3 参数3; this.方法名 函数体; } var obj new 构造函数名(实参1实参2实参3)9.2 、继承class Father { constructor(surname) { this.surname surname; } say() { return 我是爸爸; } } class Son extends Father { constructor(surname, firstname) { super(surname); //调用父类的 constructor(surname) } say(){ // super.say() super调用父类的方法 return super.say() 的儿子; } } var damao new Son(); console.log(damao.say());9.3、new 实现首先创一个新的空对象。根据原型链设置空对象的 __proto__ 为构造函数的 prototype 。构造函数的 this 指向这个对象执行构造函数的代码为这个新对象添加属性。判断函数的返回值类型如果是引用类型就返回这个引用类型的对象。9.4、原型链区分对象的原型proto构造函数的原型对象prototypejs分为函数对象和普通对象每个对象都有__proto__属性但是只有函数对象才有prototype属性原型每一个 JavaScript 对象null 除外在创建的时候就会与之关联另一个对象这个对象就是我们所说的原型每一个对象都会从原型继承属性其实就是 prototype 对象。访问一个对象的某个属性时会先在这个对象本身属性上查找如果没有找到则会去它的__proto__隐式原型上查找即它的构造函数的prototype如果还没有找到就会再在构造函数的prototype的__proto__中查找这样一层一层向上查找就会形成一个链式结构我们称为原型链继承的时候只需要把子类的原型对象prototype里的__proto__属性指向父类的prototype即可9.5、bind、call和apply的区别apply 、 call 和 bind 调用模式这三个方法都可以显示的指定调用函数的 this 指向。apply 方法接收两个参数一个是 this 绑定的对象一个是参数数组。call 方法接收的参数第一个是 this 绑定的对象后面的其余参数是传入函数执行的参数。也就是说传递给函数的参数必须逐个列举出来。bind 方法通过传入一个对象返回一个 this 绑定了传入对象的新函数。不会调用函数需要赋值之后再调用这个函数的 this 指向除了使用 new 时会被改变其他情况下都不会改变。let arr[1,2,3] Math.max.call(null,...arr]) Math.max.apply(null,arr]) Math.max.bind(null,arr])()后续补充手撕apply 、 call 和 bind9.6、对象的方法与遍历对象// 作用: 用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。 Object.assign() // 作用 : 创建一个新对象使用现有的对象来提供新创建的对象的__proto__。 Object.create() // 作用 : 返回一个给定对象自身可枚举属性的键值对数组其排列与使用 for...in 循环遍历该对象时返回的顺序一致 Object.entries() // 作用 : 会返回一个由一个给定对象的自身可枚举属性组成的数组数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。 Object.keys() // 作用 : 返回一个给定对象自身的所有可枚举属性值的数组 Object.values() // 作用: 判断两个值是否为同一个值 Object.is() // 作用 : 直接在一个对象上定义新的属性或修改现有属性 Object.defineProperty() // 用来检测obj是否含有特定的自身属性name。 obj.hasOwnProperty(name) //遍历 for(let key in obj){ console.log(key, obj[key]) } Object.keys(obj).forEach(key console.log(key, obj[key]))9.7、对象的合并方法、深克隆function mergeObject(...objs) { let result {} objs.forEach(obj { Object.keys(obj).forEach(key { let value obj[key] if (!result.hasOwnProperty(key)) { // 说明result中没有该属性 result[key] value } else { // 说明result已经存在该属性那么就把同名属性的值合并为一个数组 result[key] [].concat(result[key], value) } }) }); return result }function deepClone(obj {}) { // 判断传入的 obj 是不是数组或对象不是直接返回 obj if (typeof obj ! object || obj null) { return obj; } let result; // 判断是不是数组 if (obj instanceof Array) { result []; } else { result {}; } for (let key in obj) { // hasOwnProperty()方法检测一个属性是否是对象的自有属性 if (obj.hasOwnProperty(key)) { // 递归调用 result[key] deepClone(obj[key]); } } return result;}10、函数10.1、函数类型命名函数 function 函数名(){}匿名函数 var 变量名 function (){}立即调用函数function (){}10.2 、作用域链根据[内部函数可以访问外部函数变量] 的这种机制用链式查找决定哪些数据能被内部函数访问就称作作用域链。10.3、闭包机制什么是闭包函数内部的变量函数外部无法访问这形成了闭函数外部想得到函数内部的变量可以通过某些方法譬如通过return等语句将内部的变量暴露出去这形成了包即闭包是有权限访问其他函数作用域的局部变量的一个函数闭包的作用将函数内部的私有变量保存了下来不被修改并且拓展了变量的使用范围闭包应用参考JavaScript | 图解 | 闭包应用之循环事件绑定的N种解决办法 - 掘金 (juejin.cn)1为节点循环绑定click事件将var改为let,通过let形成闭包(2)回调函数柯里化(3)防抖与节流:通过闭包可以实现传参效果防抖在一定时间间隔内将多次触发变成一次触发减少函数执行次数持续触发不执行不触发的一段时间之后再执行运用场景搜索框搜索输入只需要用户最后一次输入完再发送请求。窗口大小resize只需窗口调整完成后计算窗口大小。防止重复渲染。节流当触发事件后每隔一固定时间就执行一次。但是在固定时间内多次触发却只执行一次函数。持续触发并不会执行多次到一定时间 / 其它间隔 ( 如滑动的高度 )再去执行作用都是为了限制函数的执行频次以优化函数触发频率过高导致的响应速度跟不上触发频率出现延迟假死或卡顿的现象。应用场景滚动加载加载更多或滚到底部监听。搜索框搜索联想功能。//防抖 let timer null function debounce(fn, delay) { // fn: 需要防抖的函数delay延迟的时间 timerclearTimeout(timer) timer setTimeout(fn, delay) } 写法2 function debounce(fn, delay) { let timer; return function() { let context this; let args arguments; timer clearTimeout(timer); timer setTimeout(function() { fn.apply(context, args); }, delay); }; } //节流 // 前缘节流首次触发立即生效后续需要间隔一段时间触发才生效 function throttleImmediateExecution(fn, delay){ let timer null; // 使用定时器实现 return function (){ let _this this; // 当前 this 保存以免后续处理中 this 丢失 if(!timer){ fn.apply(_this, arguments); timer setTimeout(function (){ timer null; }, delay); } }} export default function throttle(fn,interval){ //last 为上一次触发回调的时间 let last Date.now() return function(){ // 保留调用时的this上下文 let context this // 保留调用时传入的参数 let args arguments // 记录本次触发回调的时间 let now Date.now() // 判断上次触发的时间和本次触发的时间差是否小于时间间隔的阈值 if(now-lastinterval){ last now; fn.apply(context,args) } } }闭包能够造成内存泄漏页面不关闭变量就一直在不能被垃圾回收机制回收或者手动清除。函数参数函数体内不用定义直接调用arguments它是一个伪数组没有数组的方法拥有数组的属性即下标索引与length11、内置对象-Math对象属性、方法名功能Math.PI圆周率Math.floor()向下取整Math.ceil()向上取整Math.round()四舍五入版 就近取整 注意 -3.5 结果是 -3Math.abs()绝对值Math.max()/Math.min()求最大和最小值Math.random()获取范围在[0,1)内的随机值包括第一个数不包括第二个数1. Math.floor向下取整 Math.floor(5.95) //5 Math.floor(-45.95); // -46 2. Math.ceil向上取整 Math.ceil(7.004) //8 Math.ceil(-7.004) //-7 3. Math.round 返回一个数字四舍五入后最接近的整数。 x Math.round(20.49); //20 x Math.round(20.5); //21 x Math.round(-20.5); //-20 4.Math.random() 函数返回一个浮点数伪随机数在范围从0 到小于1 Math.power(a,n) Math.sqrt(a)12、Date日期对象//日期格式化 // 格式化日期 年 月 日 var date new Date(); console.log(date.getFullYear()); //返回当前日期的年 2020 console.log(date.getMonth() 1); //月份 返回的月份小1个月记得月份加1呦 console.log(date.getDate()); //返回的是 几号 console.log(date.getDay); //周一返回的是1 周六返回的是6 周日返回的是0 //我们写一个 2020年 9月 6日 星期日 var year date.getFullYear(); var month date.getMonth() 1; var dates date.getDate(); var day date.getDay(); if (day 0) { day 星期日; } console.log(今天是 year 年 month 月 dates 日 day); var now Date.now(); //当前的时刻12、RegExp()正则匹配strabclet regnew RegExp([a]b,gi) reg.test(str)let res/[a]b/.test(str)需要回顾match replace search13、类型检测13.1、 typeof 检查基本类型除了数组对象null是Object外其他都是正常typeof(null) //Object13.2、instanceof 检查引用类型其原型链上是否存在其构造函数。let car new Car(); let arr []; let fun () {}; let num 1; console.log(car instanceof Car); //true console.log(arr instanceof Array); //true console.log(fun instanceof Function); //true console.log(num instanceof Number); //false13.3、constructor检查所有类型function Person(name) { this.name name; }Person.prototype.constructor Person // true13.4、Object.prototype.toString.call(obj)检查所有类型console.log(Object.prototype.toString.call(jerry));//[object String] console.log(Object.prototype.toString.call(12));//[object Number] console.log(Object.prototype.toString.call(true));//[object Boolean] console.log(Object.prototype.toString.call(undefined));//[object Undefined] console.log(Object.prototype.toString.call(null));//[object Null] console.log(Object.prototype.toString.call({name: jerry}));//[object Object] console.log(Object.prototype.toString.call(function(){}));//[object Function] console.log(Object.prototype.toString.call([]));//[object Array] console.log(Object.prototype.toString.call(new Date));//[object Date] console.log(Object.prototype.toString.call(/\d/));//[object RegExp] function Person(){}; console.log(Object.prototype.toString.call(new Person));//[object Object]