前言考虑到后期开发中会用到大量的js语言进行开发,所以打算重新整理一下javascript的知识点,特地开了一个js专栏复习js语言。万事开头难,如果后面写的有什么不对的地方,欢迎大家在下面狠狠地打脸!!!JavaScript中一般有两种数据类型,值类型和引用类型;值类型:String、Number、Boolean、Null、Undefined、Symbol值类型按值存储,数据存储在内存栈中,Number、String、Boolean、Symbol都对应一个wrapper对象,例如:newNumber(5)这也是原始数据类型调用方法的原理:eg:('happy').toString(),'happy'是基本数据类型,本身没有toString方法,所以把值转换成通过调用ToObject[spec]获得一个对象,然后在其包装对象中调用它newString('happy')。调用完成后,包装对象会消失,下次使用时会重新创建。引用类型:Object、Array、Function引用类型都是通过引用来存储的,存储的不是值,而是地址,数据存储在内存堆中。数据类型检测常用方法typeof主要用于原始类型检测typeof'seymoe'//'string'typeoftrue//'boolean'typeof10//'number'typeofSymbol()//'symbol'typeofnull//'object'不能判断是否为nulltypeofundefined//'undefined'typeof{}//'object'typeof[]//'object'typeof(()=>{})//'function'instanceof主要用到todetectcustomobjects//测试构造函数的原型是否在被检测对象的原型链上{})instanceofFunction//trueObject.prototype.toString.call数据类型判断的最终方法该方法的本质是依赖Object.prototype.toString()方法获取对象的内部属性[[Class]]和传入原始类型,但可以确定结果,因为值被封装了。null和undefined可以输出结果,因为内部实现已经做了处理//Object.prototype.toString.call(obj)Object.prototype.toString.call({})//'[objectObject]'Object.prototype.toString.call([])//'[对象数组]'对象。prototype.toString.call(()=>{})//'[objectFunction]'Object.prototype.toString.call('seymoe')//'[objectString]'Object.prototype.toString.call(1)//'[objectNumber]'Object.prototype.toString.call(true)//'[objectBoolean]'Object.prototype.toString.call(Symbol())//'[objectSymbol]'Object.prototype.toString.call(null)//'[objectNull]'Object.prototype.toString.call(undefined)//'[objectUndefined]'Object.prototype.toString.call(newDate())//'[objectDate]'Object.prototype.toString.call(newMath())//'[objectMath]'Object.prototype.toString.call(newSet())//'[objectSet]'Object.prototype.toString.call(newWeakSet())//'[objectWeakSet]'Object.prototype.toString.call(newMap())//'[objectMap]'Object.prototype.toString.call(newWeakMap())//'[objectWeakMap]'var,let和const初始使用在javascript中使用var时,称为熟练。es6出来的时候,提供的let和const关键字,一开始并没有var好用,但是实际使用之后才发现,真的很好吃!!!(???)?现在基本上已经淘汰了varvar:全局作用域(函数内部),声明有变量提升,好用就是好用,难受也是难受!执行javascript代码时,会分为两个阶段,预编译阶段和运行阶段。在预编译阶段,变量声明会被提升,也就是说var定义的变量声明会放在代码的最前面,变量赋值也会放在代码的最前面。代码运行时,可以通过下面的例子来理解JS执行过程中的变量提升。console.log(a);vara=0;//相当于vara=undefined;console.log(a);a=0;当然除了变量提升之外,函数提升也是一样的,大家有兴趣可以自己尝试一下。functionfun(){}//这种声明的写法会导致函数被提升,所以无论在哪里声明都可以调用,不会自己执行varfoo=function(){}//这种写法会导致变量提升,但不会导致函数提升。这时候必须在调用let之前先声明:块级作用域,可以看做是{},组成块级作用域。如果要使用let声明的变量,必须先声明变量再使用;在for循环中,可以使用let为每个循环中的变量分配各自的作用域,以免相互影响。//没有变量提升console.log(a);//a未定义。leta=1;//块级作用域letb=1;{console.log(b)//在1个范围内可访问在范围外声明的变量letc=1;}console.log(c)//c未定义。作用域内声明的变量const不能在作用域外访问:块级作用域和let关键字会形成块级作用域,但const通常用于声明常量!对于栈存储类型的数据,通过const声明赋值后就不能再改变;对于堆存储类型的数据,通过const声明赋值后堆引用地址不能改变,但是堆地址对应的数据是可以改变的(比如对象的属性,Array选项等!)StringAPIstr.split('-')//将字符串按-分割,返回一个数组str.substr(startIndex,count)//返回截取的新字符串str.substring(startIndex,endIndex)//返回一个新字符串(包括startIndexbutnotendIndex)str.slice(startIndex,endIndex)//返回一个新的字符串(包括startIndex但不包括endIndex)str.repalce(oldstring,newstring)//替换字符串str.toLowerCase()//转为小写str.toUpperCase()//转大写str.trim()//去掉两端的空格str.charAt(index)//返回索引位置的字符str.concat(str1,str2,...)//return拼接后的新字符串str.indexOf(str1,startIndex)//返回str1的位置索引,不是return-1str.lastIndexOf(str1)//返回第estr1从后往前的位置Index,没有返回-1数APIMath.abs(x)//返回x的绝对值。Math.ceil(x)//返回x,四舍五入到最接近的整数。Math.floor(x)//返回x,四舍五入到最接近的整数。Math.max(x,y,z,...,n)//返回最大值的数。Math.min(x,y,z,...,n)//返回具有最小值的数字。Math.pow(x,y)//返回x的y次方。Math.random()//返回一个介于0和1之间的随机数。Math.round(x)//将x舍入到最接近的整数。Math.trunc(x)//返回数字(x)的整数部分。ArrayAPI//拼接会改变原来的数组array.splice(startIndex,deleteCount,item1,item2,...)//一般用于删除元素(也可以替换(插入)元素)//slice返回一个新的数组array.slice(?startIndex,?endIndex)//将截取的数组值放到一个新数组中(不包括endIndex处的元素)//includes:ES7,判断数组是否包含指定值array.includes(elem,[startIndex])//与indexOf的区别在于includes可以找到NaN,而indexOf不能[NaN].includes(NaN)//true[NaN].indexOf(NaN)//-1array.concat(array1,array2,...)//组合返回一个新的数组array.push(item)//插入数组的最后一个位置,返回数组的新长度array.pop()//删除数组的最后一个元素,返回删除的元素值数组。shift()//删除数组首元素并返回删除元素的值array.unshift(item)//在数组首元素前插入一个新元素并返回新数组的长度array.join('-')//使用-将数组的每一项组装成字符串,并返回组装后的字符串//array.join()array.toString()array.reverse()//反转数组并返回数组.sort(function(a,b){returna-b;})//排序(升序)//遍历array.forEach(function(value){})array.forEach(function(value,index,newArray){})//Map遍历数组中的每一项,将所有执行结果插入到一个新数组中并返回array.map(function(value){returnvalue*2;})//Filter返回一个新的符合条件的数组array.过滤器(函数(值){返回值>3;})//every返回true/false(只有数组中的每一项都满足条件才会返回true)【当结果确定时停止遍历】array.every(function(value){returnvalue>0;})//some返回true/false(只要数组中有一项满足条件,就会返回true)【确定结果后停止遍历】array.some(function(value){returnvalue>0;})//indexOf()返回查找元素从前到后第一个元素位置的索引varindex=['tang','fu','qiang','fu']。indexOf('福');//索引为1;//lastIndexOf()返回被查找元素从后到前第一个元素的位置索引varlastIndex=['tang','fu','qiang','fu'].lastIndexOf('fu');//lastIndexis3//Array.from方法将两种类型的对象转换为真正的数组//类数组对象和可遍历(Iterable)对象(包括ES6中的数据结构Set和Map)Array.from(newFormData(from))objectsAPIObject.keys(obj)//该方法将返回给定对象本身的[可枚举属性]数组vararr=['a','b','c'];console.log(Object.keys(arr));---['0','1','2']varobj={0:'a',1:'b',2:'c'};console.log(对象.keys(obj));//console:['0','1','2']varanObj={100:'a',2:'b',7:'c'};console.log(Object.keys(anObj));//console:['2','7','100']Object.assign()//方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象。eg:Object.assign(target,...sources)Object.getPrototypeOf(obj)//返回指定对象的原型(内部[[Prototype]]属性的值)obj.hasOwnProperty(prop)//返回一个布尔值,表示对象自身的属性中是否有指定的属性。Object.create(创建对象的原型,{对象自身的可枚举属性(可选)})//eg:Object.create(Array.prototype)Object.defineProperty(Obj,prop,descriptor)//返回修改后的Objectdescriptor:value:defaultundefined,该属性对应的值可以是任意有限的JavaScriptvalue,(function,number,object,etc.)writable:defaultfalse,valuecanbechangedbyassignmentoperatoronlywhensettotrueconfigurable:default如果为假,则无法修改。如果设置为true,则可以修改或删除。enumerable:默认为false,只有设置为true时,该属性才能出现在对象的枚举属性中//循环遍历://forin:遍历时,不仅可以读取对象的成员属性本身,也可以读取原型链上对象的原型属性,所以可以使用hasOwnProperty判断一个属性是否是自身的属性,返回true表示这个属性是对象的成员属性,而不是一个prototypepropertyfor(keyinobj){if(obj.hasOwnProperty(key)){object[key]=1;}}//forof:一种遍历所有数据结构的统一方法//只要一个数据结构部署了Symbol.iterator属性,就被认为具有iterator接口,可以使用for...of遍历其成员,也就是说for...of循环内部调用的是数据结构DateAPI的Symbol.iterator方法constmyDate=newDate([params]);//params的可能取值(0~11月):empty2019,9,20'2019/9/20''2019-9-20''2019-9-2017:27:30'myDate.获取年份();//获取当前年份(2位数字)myDate.getFullYear();//获取完整的年份(4位数字,1970-????)myDate.getMonth();//获取当前月份(0-11,0代表一月)myDate.getDate();//获取当前日期(1-31)myDate.getDay();//获取当前星期X(0-6,0代表星期天)myDate.getTime();//获取当前时间(从1970.1.1开始的毫秒数)myDate.getHours();//获取当前小时(0-23)myDate.getMinutes();//获取当前分钟数(0-59)myDate.getSeconds();//获取当前秒数(0-59)myDate.getMilliseconds();//获取当前毫秒数(0-999)myDate.toLocaleDateString();//获取当前日期myDate.toLocaleTimeString();//获取当前时间myDate.toLocaleString();//获取日期时间总结以上是总结的javascript基础的一部分,关于javascript基础的东西很多。我不会在这里详细介绍。下一篇文章会讲JS事件循环(EventLoop)。感兴趣的朋友可以关注一下。想知道有哪些内容,也可以在下方留言。以上内容如有错误,也可以留言告诉我ヽ( ̄▽ ̄)?
