1.javascript基础

1. javascript组成

* ECMAScript(核心标准)
* 扩展-->浏览器端* DOM* BOM
* 扩展-->服务器端* NODEJS

1.1 js常识

js输出document.write   向body中写字符串console.log      向控制台输出alert            弹出警告框输出编写位置
1.外联文件<script src="引入的文件位置"></script>
2.内联文件<script type="text/javascript">js代码编写的位置</script>js基本语法严格区分大小写语句分号结尾没有添加分号时浏览器自动添加,但是消耗资源并且可能添加出错js字面量和变量字面量即为常量变量可被字面量赋值变量声明和赋值可分开或一起var a;a = 1;或者var a = 1;
js标识符所有可以自定义的变量都叫做标识符,并且遵循以下规范:1.只能以字母数字,下划线,$构成2.不能以数字开头3.不能使用ES的关键字和保留字4.一般使用驼峰命名法标识符以unicode编码表示,因此可以使用UTF-8的所有内容,但是一般只使用英文

2.五大基本数据类型

 1.string2.number可以表示整数与浮点数2进制浮点数以分数表示,不准确NaN与Infinity是数值的字面量,表示非数与无穷typeof 参数  检测某个值的类型3.boolean只有两个值:true  false4.null表示一个空对象var a = null;console.log(typeof a);结果为object5.undefined已经声明的变量未赋值则成为undefinedvar a;console.log(typeof a);结果为undefined

3.转换类型

强制类型转换1.string两种办法:a.toString()   String()toString只能用于对象,因此null和undefined无法调用String()对于Number, String, Boolean来说会调用底层的toString()方法,对于null和undefined会直接进行转换2.number三种方法:Number(), parseInt(), parseFloat()Number():对于字符串来说如果只包含数字,直接转换成数字,如果包含非数字转换成NaN,如果是""或者"  "则转换成0对于boolean值,true转换成1,false转换成0对于null,转换成0对于undefined,转换成NaNparseInt():首先将所有内容转换成字符串再开始解析。从左到右依次解析,需要非整数直接舍去,第一位非整数返回NaNparseFloat():与parseInt()相似,只是遇到第一位小数点不会忽略会转换成小数,其余与之相同3.boolean一种方法:Boolean()对于数字:只有0跟NaN会转换成false对于字符串:只有""会转换成false对于null和undefined,只会转换成false

4.运算符

运算符有以下种类:typeof,+,-,*,/,%,所有的运算符都不改变原始变量而是返回进行运算后的结果,并且NaN与任何值进行运算结果都为NaNtypeof:typeof返回一个变量或者字面量的类型,返回值为stringvar a = typeof 2;console.log(a);console.log(typeof a);结果为:number与string+:数字的加法运算遇到非number的值,会将其转换成number遇到string的值,会转换成string然后进行接串操作,可应用于长字符串的换行与隐性string类型转换其余运算符进行相应数学运算并且在遇到非number值时,会全部转换成number值后再进行运算操作,此特性可用于隐式number类型转换,但还有更简单的方法var a = "123";console.log(a / 1);console.log(typeof (a / 1));结果为123和number类型一元运算符正号+和负号-两者能够进行相应的数学运算同时在遇到非number的值时会将其强制转换成number值再进行运算,此特性可用于隐式number类型转换var a = "123";console.log(+a);console.log(typeof +a);结果为123和number类型
自增与自减++分为前++(++a)和后++(a++),对于a值来说都是增加1,但是表达式的返回值不同,前++返回新值,后++返回原值--特性与自增相同,只是对于a值来说是减少1
逻辑运算符包括!, &&, ||三种运算符!:两次取非会得到原值的布尔值,可以利用这个特性进行隐式布尔值转换var a = "123";console.log("a = " + !!a);结果为true,与Boolean(a)相同&&:两个值都为true结果才为true||:两个值都为false结果才为false在JS中&&与||都是属于短路操作,即当一个值满足要求时才会继续执行第二个操作,第一个值不满足要求时不执行第二个操作当参数不是boolean值时先会将参数转换成boolean值后再按照以上规则输出原值&&:当第一个值为true时,返回第二个值当第一个值为false时,返回第一个值console.log("123" && "456");结果为"456"console.log(NaN && "111");结果为NaN||:当第一个值为false时,返回第二个值当第一个值为true时,返回第一个值console.log(NaN || "111");结果为"111"console.log("123" || "456");结果为"123"
赋值运算符有以下几种:=, +=, -=, /=, *=var a += 3;var a = a + 3;两者等价,对于其他的赋值运算符,与+=规则相同
关系运算符有以下几种:<, >, <=, >=有一方为number值时,将非number值转换成number值再进行比较NaN与任何值进行任何比较结果都为false, 包括NaN本身console.log(NaN >= NaN);结果为false当两方都为string时,按位比较字符编码,因此在两者都为string类型值为数字时进行比较,结果可能不符合预期,可应用于英文名字的排序console.log("11" > "2");结果为false
unicode编码在js中使用时在编码前加\u对编码进行转义输出console.log("\u0031");结果为1,编码为16进制在HTML中使用时以 &#编码; 的格式输出0结果为1,编码为10进制
相等运算符包括==, !=, ===, !====, !=两者类型相同时判断是否相等,类型不同时进行类型转换再判断是否相等,转换成哪种类型无法确定由于undefined衍生于null,因此两者相等console.log(undefined == null);结果为trueNaN与任何值进行运算结果都为false,包括自己console.log(NaN == NaN);结果为false===, !==除不进行类型转换外,规则与==, !==类似当两者类型不同时,===直接返回false,!==直接返回trueNaN的规则在此处同样适用console.log(NaN === NaN);结果为falseundefined与null在这种运算符下,才会不相等console.log(undefined === null);结果为false
三元运算符语法格式为(表达式)?(语句1):(语句2);当表达式结果为true时执行语句1,否则执行语句2当表达式结果为非boolean值时,会转换成boolean值后再对表达式进行判断
逗号运算符用来分割不同语句,可以同时声明多个变量
运算符优先级按照优先级表进行先后运算,可以使用()改变优先级

5.条件判断语句

条件判断语句语法1:满足条件只执行紧接着的第一条语句,后面语句与判断语句无关if(表达式)语句1;语法2:满足条件执行代码块中的代码,代码块外的代码与判断语句无关if(表达式){语句1;语句2;} 语法3:满足条件执行前一个代码块中的代码,否则执行后一个代码块中的代码if(表达式){语句...}else{语句...}语法4:从上到下依次判断,当满足一个表达式后后面的代码不再执行if(表达式){语句...}else if{语句...}else if{语句...}else if{语句...}else{语句...}语法5:条件判断语句可以嵌套if(表达式){语句...}else{语句...if(表达式){语句...}}
条件分支语句语法:switch(表达式){case 值1: 语句...break;case 值2: 语句...break;case 值3: 语句...break;default:语句...break;}break;语句用来跳出switch语句,当没有此语句时,如果表达式的值满足某个case时,后面的语句都会执行var a = 1;switch(a){case 1:console.log("1");case 2:console.log("2");default:console.log("其他");}结果为1, 2, 其他
while循环while语句:语法1:while(true){    //1.将表达式写死if(条件表达式){  //2.当满足某种条件时退出break;}语句...}语法2:var i = 0;     //1.初始化变量while(i < 10){  //2.当不满足条件时退出循环语句...i++;        //3.更新变量}do{}while()语句:语法:do{语句...}while(表达式)与while语句的唯一不同是,while语句先对表达式进行判断,当不满足条件时不继续执行后面的代码块,而do{}while()语句是先执行do后面的代码块再判断表达式,不满足时不执行第二次var i = 11;while(i <= 10){console.log(i);}结果为无do{console.log(i);}while(i <= 10)结果为11
for循环语法:for(初始化变量; 条件表达式; 更新变量){}作用与while循环相同,写法也可与while循环语法2相同,只要初始化变量与更新变量分别写在for循环外部与内部var a = 0;for(; a< 10;){a++;}当for循环表达式不写任何内容时则成为死循环for(;;){}
break和continuebreak; 用来跳出循环或者switch用在循环语句时跳出最近的循环,不能跳出if语句continue; 用来跳过当前循环,执行下一次循环不能跳出if语句label:在循环语句的前一行使用label语句用来标识某一个循环两者都可增加参数,参数是循环的标识名,可以跳出所指定的循环good:for(var i=1; i<10; i++){console.log(i);for(var j=1; j<10; j++){break good;       }}结果只有一个1bad:for(var i=1; i<10; i++){console.log(i);for(var j=1; j<10; j++){if(i==2){continue bad;       }}}结果为1,3,4,5,6,7,8,9
优化程序效率可以考虑在循环语句中增加break;来提高程序运行效率使用console.time("字符串标志");来标记一个计时器使用console.timeEnd("字符串标志");来结束某个计时器并打印出计时器经过的时间console.time("a");console.timeEnd("a");结果是名为a的计时器经过的时间,单位是ms,只能用在浏览器中

2.对象

对象对象属于复合数据类型,有三种,分别是:1.内建对象由ES标准中内建的对象,在任何的ES实现中都可以使用,如Math, String, Boolean, Number, Function, Object...2.宿主对象由js运行的环境所提供的对象,一般指浏览器,如DOM, BOM...3.自定义对象由开发人员自定义的对象创建对象var obj = new Object();new所调用的函数是一个构造函数constructor(),构造函数是专门用来创建对象的函数使用typeof语句会返回object增加属性语法:对象.属性名 = 属性值;obj.name = "111";属性名可以不遵循标识符的规范,不遵循规范时需要其他方式来增删查改,但是一般尽量遵守规范,属性值可以是任何数据类型,包括null,undefined,object,当是object时可以无限嵌套var obj2 = new Object();obj2.name = "333";obj.test = obj2;修改属性语法:对象.属性名 = 属性值;obj.name = "222";与增加属性方法类似,只是将已有值覆盖查询属性语法:对象.属性名console.log(obj.name);结果为222当对象的属性为另一个对象时.重复使用来获取对象的对象的属性值console.log(obj.test.name);结果为"333"删除属性语法:delete 对象.属性delete obj.name;console.log(obj.name);结果为undefined当查询对象的某个属性不存在时,会返回undefined当属性名没有遵循标识符规范时需要使用[]来增删查改相应属性,属性名可以是变量或者字符串语法:对象[属性名] = 属性值;obj["123"] = 345;  //字符串var test = "123";console.log(obj[test]);  //变量结果为345in语句用来查询某个对象是否有相应属性名,属性名必须是字符串或者是变量,有则返回true,没有返回false语法:属性名 in 对象;console.log("123" in obj);结果为true基本和引用数据类型在js中,内存分为栈内存和堆内存,因为基本数据大小一般比较小,js专门将这些数据存放在固定的内存范围内即栈内存来保存变量与变量值,而引用数据大小一般较大,js需要创建新内存空间即堆内存来保存对象的内容当声明变量时,会在栈内存最下层中新建一个变量取值时按照声明顺序取值当调用new新建对象时会在堆内存中创建新的内存空间来新建一个对象由于新建的内存地址不确定,取对象时需要用相应内存地址取用相应的对象给变量赋值为基本数据类型时,会直接修改栈内存中变量对应的变量值为相应的变量值给变量赋值为引用数据类型时,会直接修改栈内存中变量对应的变量值为内存地址两个变量的内存地址指向同一个对象时,修改一个变量的对象的值,另一个变量的对象的值也会发生改变var obj1 = new Object();obj.name = "111";var a = obj1,b = obj1;a.name = "222";console.log(b.name);结果为222
对象字面量可以使用对象字面量来新建对象,效果与new Object()相同语法:{属性名: 属性值, 属性名: 属性值...};var obj = {name: "a", age: "16", gender: "男"};属性名可以使用引号包起来,但是一般不使用,当属性名不遵循标识符规范时,需要使用引号包起来,最后一个属性写完后不加逗号

3.函数

 函数也是对象,它具有普通对象具有的所有功能声明函数:新建函数对象:语法:var func = new Function("需要执行的代码块");在构造函数中可以加入字符串参数代码使得调用函数时可以直接执行var func = new Function("console.log(111)");func();结果为111函数声明:语法:function func([形参1,形参2, 形参3...]){语句...}函数表达式:语法:var func = function([形参1,形参2, 形参3...]){语句...}
形参与实参声明函数时传递的参数叫形参,作用相当于在函数内部声明变量调用函数时传递的参数叫实参,作用相当于给函数的形参赋值当实参数量大于形参时,多出来的实参会被忽略当实参数量小于形参时,未赋值的形参会是undefined类型实参可以是任意数据类型包括对象与函数,当实参数量过多时,可以考虑将部分实参封装成一个对象传入将函数当做实参传入另一个函数:function func1(){console.log("a");return "1";}function func2(a){console.log(a);}func2(func1);       //结果为func1对象本身,结果为func1函数的内容func2(func1());     //结果为func1的函数返回值,结果为1
返回值使用return语句可以让函数返回特定的值,此时函数中return后面跟的所有语句都不执行语法:return [返回值];function test(a, b){return a+b;}var result = test(1, 2);console.log(result);结果为3当return后不加参数时,相当于函数返回undefined函数中不使用return时,也相当于返回undefined返回值可以是任意类型,包括对象和函数function func1(){function func2(){console.log("func2");}return func2;}var a = func1();console.log(a);结果为func2函数本身的内容console.log(a());       //与console.log(func1()());相同结果为"func2"
立即执行函数语法:(function([形参1, 形参2...]){语句...})([实参1, 实参2...])当写成以下形式时,js会将前半部分当成代码块,无法识别函数声明function([形参1, 形参2...]){语句...}([实参1, 实参2...])
方法由于对象的属性可以是任何值,因此也可以将一个函数赋值给一个对象的属性,此时这个函数属性就被叫做方法,需要注意的是,函数与方法只是名称上的不同,其他没有任何区别var obj = new Object();obj.name = "111";obj.callName = function(){console.log(obj.name);}obj.callName();结果为"111"调用对象中的函数,被称为调用这个对象的方法
枚举语句语法:for(var 声明变量 in 对象){语句...}for(var i in obj){console.log(i);     //i为obj对象的属性名console.log(obj[i]);        //obj[i]为obj对象的属性值}对象中有多少个属性,这个循环便会执行多少次

4.作用域

 全局作用域直接写在script标签中的代码都属于全局作用域,它在打开页面时创建,在关闭页面时销毁全局作用域中所有的变量可以在页面的任意部分被访问到var a = 1;function func1(){console.log(a);}结果为1全局作用域中所有声明的变量都会被创建成window对象的属性var a = 1;console.log(window.a);结果为1变量的提前声明当使用var来声明或者声明并赋值变量时,无论声明位置在何处,声明本身这个语句会在当前script标签中的最顶端被执行console.log(a);var a = 1;结果为undefined而不是报错,因为var a;这条语句已经在代码最顶端被执行过了console.log(a);a = 1;报错,a未被声明函数的提前声明无论函数在何处被声明,函数声明本身会在任何代码前被执行func1();function func1(){console.log("1");}结果为"1"但是对于函数表达式来说,由于使用var来声明函数,因此只符合变量提前声明的特性func1();var func1 = function(){console.log("1");}结果报错,undefined不是一个函数函数作用域函数作用域在函数执行时创建,在执行完毕后销毁,在函数作用域内部与全局作用域相似当在函数中使用变量时会先向当前作用域查找,没有则向上一级作用域查找,直到全局作用域,如果全局作用域中没有此变量时报错var a = 1;function func1(){function func2(){console.log(a);}func2();}func1();结果为1在函数作用域中可以访问到全局作用域的变量,反之不成立function func1(){var a = 1;}console.log(a);结果为报错,a未定义在函数作用域中变量声明提前与函数声明提前同样适用(当函数有形参时相当于在函数内部声明了变量)function func1(){console.log(a);var a = 1;}func1();结果为undefinedfunction func1(){var a = 1;func2();function func2(){console.log(a);}}结果为1

5.this

当调用函数时,解析器会隐式传入一个参数this,它是一个对象1.当以函数的形式调用时,this永远是全局作用域window2.当以对象的方法调用时,this是调用这个方法的对象3.当以构造函数调用时,this就是新创建的对象作用:var name = 1, obj1 = {name: 2, sayName: func}, obj2 = {name:3, sayName: func};func(){console.log(this.name);}func();obj1.sayName();obj2.sayName();结果为1, 2, 3可以使用this来使方法/函数内的值发生变化

6.构造函数

 function Person(name, age){this.name = name;this.age = age;this.sayName = function(){console.log(this.name);}}function Dog(name, age){this.name = name;this.age = age;this.sayName = function(){console.log(this.name);}}var person1 = new Person("aaa", 16);var person1 = new Person("ccc", 14);var dog = new Dog("bbb", 18);console.log(instanceof person1);console.log(instanceof dog);结果分别为Person, Dog构造函数与普通函数在使用上的区别就是是否使用了new,构造函数又被称为类,对类作new操作等到的结果被称为实例构造函数的执行流程:1.立即新建1个对象2.将构造函数的this值赋值为新创建的对象3.依次执行构造函数内的代码4.将新建的对象返回构造函数改进:按照上述代码编写会在给对象创建方法时重复创建函数,当实例化类次数增加时会浪费大量内存,因此需要将重复创建的方法函数变成只创建一次console.log(person1.sayName == person2.sayName);结果为false,证明的确重复创建了函数可以将方法声明在全局作用域中function Person(name, age){this.name = name;this.age = age;this.sayName = func;}function func(){console.log(this.name);}var person1 = new Person("aaa", 16);var person2 = new Person("bbb", 18);console.log(person1.sayName == person2.sayName);结果为true,证明是同一个函数但是这种办法会污染全局命名空间并且不够安全,有可能会被其他函数覆盖

7.原型对象

每一个类都可以有一个原型对象prototype,它是一个对象,并且这个类的实例会有一个原型属性__proto__,它的值是这个实例的类的原型对象地址因此修改类的原型对象的属性也会改变这个类的实例的原型属性所指向的那个原型对象可以利用原型的特性为类开辟出一个新的公共空间让这个类的每一个实例都可以使用这个公共空间的值或者方法而不会污染全局命名空间function Person(name, age){this.name = name;this.age = age;}Person.prototype = function(){console.log(this.name);}var person1 = new Person("a",12);console.log(person1.__proto__ == Person.prototype);结果为true所有对象都有原型属性__proto__,由于原型对象也是对象,因此也具有原型属性__proto__console.log(Person.prototype.__proto__);结果为objectObject的实例的原型没有原型var a = new Object();console.log(a.__proto__.__proto__);结果为null所有对象都是Object对象的实例,包括原型对象,因此原型的回溯最多到Object实例的原型为止,也就是原型对象的原型为止实例中变量查找顺序:1.先在被实例化的类中的变量之间查找,如果找到则输出,否则进入它的原型对象2.在类中的原型对象中的变量之间查找,如果找到则输出,否则进入它的原型对象3.在原型对象的原型中的变量之间查找,如果找到则输出,否则输出undefined使用in语句来查找属性是否属于某个对象时会向它的原型中查找如果不想查找原型中的属性,使用hasOwnProperty方法function Person(){}Person.prototype.a = 1;var person = new Person();person.b = 1;console.log("a" in person);console.log(person.hasOwnProperty("a"));console.log(person.hasOwnProperty("b"));结果为true, false, true当在页面中打印一个对象时,实际上输出的是这个对象的valueOf方法的返回值,因此可以通过修改对象的valueOf方法来修改打印对象时的结果function Person(name){this.name = name;}Person.prototype.valueOf = function(){return "name = " + this.name;};var person = new Person("a");console.log(person);结果为name = "a"        //根据实际测试,结果与浏览器相关当将对象强制转换成数字时会首先调用valueOf方法,当此方法返回自己时再调用toString当对象强制转换成字符串时只调用toString方法
垃圾回收当创建对象之后对所有这个对象的变量赋值为null时,这个对象就永远无法被操作,这个对象就称为垃圾js拥有自动的垃圾回收机制,不需要也不能手动地回收垃圾,能做的只有将不再使用的对象赋值为null

8.数组

数组也是一个对象,与对象的区别在于数组只能通过索引来查找值,并且存储效率要比普通对象更高,所以具有所有对象具有的特性创建数组var arr = new Array();arr具有三个对象属性,constructor(构造函数的引用), length(数组长度), prototype(原型对象的引用)可以使用:数组[数组.length] = 值;来方便地向数组最后一位添加内容可以通过修改数组长度来删除一些数据arr[0] = 0;arr[1] = 1;arr[2] = 2;arr[3] = 3;arr.length = 3;console.log(arr[3]);结果为undefined当访问数组中不存在的数据时,会返回undefined而不是报错可以使用数组字面量方便地创建数组语法:[]var arr = [];在数组字面量中可以直接加入参数来给数组赋值var arr = [0, 1, 2, 3];console.log(arr);结果为0,1,2,3同样也能向数组类添加参数来直接给数组赋值var arr1 = new Array(0, 1, 2, 3);console.log(arr1);结果为0,1,2,3但是当参数只有一个时,结果会有所不同var arr = [10];         //创建一个第一个值为10的数组var arr1 = new Array(10);       //创建一个长度为10的数组console.log(arr);console.log(arr1);结果分别为10和,,,,,,,,,
数组常用方法1.push向数组最后添加一个或多个元素并将数组长度返回2.pop删除数组最后一个元素并将该元素返回3.unshift向数组开头添加一个或多个元素并将数组长度返回4.shift删除数组开头的元素并将该元素返回5.forEach按顺序遍历整个数组支持IE8以上或者其他的浏览器由自己创建但不由自己调用的函数称为回调函数语法:数组.forEach(function(value, index, arr){});它会在回调函数中以实参的形式传递3个参数:1.当前循环中的元素2.当前循环中的索引3.调用forEach函数的数组6.slice从一个数组中截取特定范围的元素并将这些元素以数组的形式返回,不改变原数组语法:数组.slice(start, end);第一个参数是截取开始的索引,返回数组会包括开始索引的元素第二个参数是截取结束的索引,返回数组不会包括结束索引的元素var arr = [0,1,2,3,4,5];var arr1 = arr.slice(0,4);console.log(arr1);结果为0,1,2,3参数可以是负值,如果为负就是从后往前计数var arr = [0,1,2,3,4,5];var arr1 = arr.slice(-3,-1);console.log(arr1);结果为3,47.splice删除或者添加元素,直接改变原数组,返回值为删除的元素语法:数组.splice(start, number[,元素1, 元素2...]);第一个参数为从哪个索引开始删除元素第二个参数为删除几个元素从第三个参数开始的参数都是是在第一个参数的索引之前添加这些元素var arr = [0,1,2,3,4,5];arr.splice(0,1,7,8,9);console.log(arr);结果为7,8,9,1,2,3,4,58.concat可以将两个或者多个数组连接成一个数组不会改变原数组语法:数组.concat(任意数据类型[,任意数据类型...]);var arr = [1,2,3,4];var result = arr.concat([5,6,7,8],1,"a", false, null, undefined, {});console.log(result);结果为1,2,3,4,5,6,7,8,1,"a",false,null,undefined,{}9.join将数组中的元素转换成字符串,可以添加参数指定元素之间的连接符,无参数时默认为逗号,不会改变原数组语法:数组.join([字符串]);var arr = [1,2,3,4];var result = arr.join(" ");console.log(result);结果为"1 2 3 4"10.reverse调换数组中元素的排列顺序会修改原数组,并且修改后的数组与返回值相同语法:数组.reverse();var arr = [1,2,3,4];var result = arr.reverse()console.log(result);console.log(arr);结果都为4,3,2,111.sort给数组中的元素排序,默认以unicode编码顺序排列,因此直接对数组中的数字排序会产生预料外的结果可以传递一个回调函数作为sort的参数,回调函数中有两个形参分别表示数组中一前一后的两个元素,具体是哪两个元素需要根据循环确认函数的返回值决定是否交换这个两个元素,当返回值大于0时交换,小于0时不交换,等于0时认为两个值相等不交换会直接修改原数组的元素,与方法的返回值相同语法:数组.sort([回调函数]);var arr = [5,3,6,767,34,2];arr.sort();console.log(arr);结果为2,3,34,5,6,767arr.sort(function(a, b){return a-b;});console.log(arr);结果为2,3,5,6,34,767
call和apply函数对象都具有这两个方法,可以向这两个方法中的第一个参数传入一个对象用来修改这个方法的this对象如果函数对象需要形参call方法中第二个参数开始依次输入要传递给函数对象的实参将需要传递的实参封装成一个数组作为apply的第二个参数将实参传递给函数对象语法:函数.call(对象[,参数1...]);函数.apply(对象[,数组]);var obj = {};function a(a){console.log("a = " + a);console.log(this);}a(1);a.call(obj, 1);a.apply(obj, [1]);结果为window,1object,1object,1
arguments在调用函数时,浏览器还会隐式传递一个参数arguments,它是一个类数组对象,不是数组对象使用索引来查询调用函数时传入的参数拥有length属性来表示传入参数的数量拥有callee属性表示当前指向的函数引用,可以用来编写递归函数function a(){console.log(arguments.length);console.log(arguments[0]);console.log(arguments[1]);console.log(arguments.callee);}a(1,2);结果为2,1,2,a函数本身

9.Data和Math对象+包装类

 Math对象与其他内建对象不同,它不是构造函数而是一个工具类,不需要实例化,直接使用语法:Math.方法();常用属性:E 自然对数PI 圆周率常用方法:1.ceil()向上取整2.floor()向下取整3.round()四舍五入4.random()获取0-1之间的随机数当想获取x-y之间的随机数时有公式Math.random()*(y-x)+x5.max()获取多个数中的最大值6.min()获取多个数中的最小值7.sqrt()对某个数开根号8.pow(x, y)求x的y次幂
包装类js提供了3个包装类将3种基本数据类型转换成基本数据类型对象,但是在日常开发中不要使用这种方式,因为在转换后进行比较时会产生预期外的结果1.String将基本数据类型string转换成string对象var str = new String("a");console.log(typeof str);结果为object2.Number将基本数据类型number转换成number对象var num = new Number(1);console.log(typeof num);结果为object3.Boolean将基本数据类型boolean转换成boolean对象var bool = new Boolean(true);console.log(typeof bool);结果为object当对这三种基本数据类型操作包装类中的方法或者属性时,浏览器会临时创建一个基本数据类型对象再调用这些方法,然后再将其转换成基本数据类型var a = 1;a.toString();console.log(typeof a);结果为string//执行这两行代码时不会报错,因为实际在对临时创建的基本数据类型对象进行属性赋值操作,语句执行完毕后临时对象就被销毁,因此第二次执行时结果为undefineda.name = "a";console.log(a.name);结果为undefined     

10.字符串String对象

string的底层是用字符数组进行表示的,因此许多数组可以使用的方法在字符串中同样可以使用var str = "abcdef";console.log(str[0]);结果为"a"常用属性:length表示字符串的长度常用方法:(全都不改变原字符串)1.charAt()返回指定位置的字符,与用索引表示相同2.charCodeAt()返回指定位置的字符unicode编码3.fromCharCode()返回指定unicode编码对应的字符4.concat()连接多个字符串,与使用加号+连接字符串相同5.indexOf()返回指定字符在字符串中第一次出现的索引,当没有时返回-1参数:第一个参数:需要查找的字符第二个参数:从第几个索引开始进行查找6.lastIndexOf()与indexOf相似,但是它返回的是字符在字符串中最后一次出现的索引,没有时返回-1参数:第一个参数:需要查找的字符第二个参数:从第几个索引开始进行查找7.toUpperCase()将所有字符转化成大写8.toLowerCase()将所有字符转化成大写9.slice()截取指定范围内的字符串,与数组中的slice相似参数:第一个参数:索引开始处,包括这个索引第二个参数:索引结束处,不包括这个索引参数可以是负数,当为负数时从字符串后往前数不输入第二个参数时,截取第一个参数开始至后面全部的字符串var str = "abcdef";var result = str.slice(0,-2);console.log(result);结果为"abcd"10.subString()与slice相似,不同在于参数为负数时默认输入是0,当第一个参数大于第二个参数时会交换两个参数的位置var str = "abcdef";var result = str.subString(1, -3);结果为"a"11.subStr()同样为截取一段字符串,与前两个方法的区别在于参数不同,这个方法不是ES标准,不推荐使用参数:第一个参数:索引开始处,包括这个索引第二个参数:需要截取的字符数量12.split()与数组的join方法相反。将字符串以特定方式转换成数组参数:第一个参数:将字符串以哪个字符进行拆分充当新数组的元素var str = "abtcdtef";var result = str.split("t");console.log(result);结果为ab,cd,ef当参数为空串时,将每个字符都拆分成一个元素存入新数组

11.正则表达式

用来匹配字符串是否满足要求       语法:var reg = new RegExp("正则表达式", "匹配模式");匹配模式可以是"i" ----忽略大小写"g" ----全局匹配方法:    1.test()测试指定字符串是否满足正则的匹配要求,满足返回true,否则返回false正则表达式字面量语法:var reg = /正则表达式/匹配模式;使用字面量更方便,使用构造函数更灵活,因为可以使用变量正则表达式语法:1.|表示或 /a|b/.test("ac"); //true2.[]与|含义相同/[ab]/.test("bc"); //true3.[^]   //忽略,有误是否含有除了中括号外的内容/^ab/.test("ab");  //false4. .表示任意字符5.\表示转义,将特殊符号转化成字符6.*表示0个或多个字符7.+表示1个或多个字符8.^表示开头的某个字符9.$表示结尾的某个字符10.\w表示任意字母数字_11.\W除了任意字母数字_12.\d表示任意数字13.\D除了任意数字14.\s表示空格15.\S除了空格16.\b表示单词分隔符17.\B除了单词分隔符18.{}限制字符出现的次数/^a{3,5}$/.test("aaaaaa");    //false19.()将几个字符当做整体/^(ab){2,3}$/.test("abababab"); //false常用语法:[a-z]   小写字母[A-Z]   大写字母[A-z]   英文字母[0-9]   数字可以使用正则的字符串方法:1.split()将字符串以正则表达式作为间断符号拆分成数组var str = "1a2s3d4f5g6h7jk8";console.log(str.split(/[1-9]/));结果为a,s,d,f,g,h,jk正则不设置匹配模式为g也会全局拆分2.search()查询正则表达式中的字符位置,不存在则返回-1,与indexOf相似var str = "1a2s3d4f5g6h7jk8";console.log(str.search(/[a-z]/));结果为0正则设置匹配模式为g也不会全局匹配3.match()返回满足正则表达式匹配的字符var str = "1a2s3d4f5g6h7jk8";console.log(str.match(/[a-z]/));结果为a如果需要返回全局匹配的结果需要设置匹配模式为g,返回为数组console.log(str.match(/[a-z]/g));结果为a,s,d,f,g,h,j,k4.replace()将正则表达式匹配到的字符串用新字符串代替参数:第一个参数:需要被替换的原字符串,可以用正则表达式第二个参数:需要替换的新字符串,可以是空串var str = "1a2s3d4f5g6h7jk8";console.log(str.replace(/[a-z]/, "!"));结果为"1!2s3d4f5g6h7jk8"如果需要返回全局匹配的结果需要设置匹配模式为gconsole.log(str.replace(/[a-z]/g, "!"));结果为"1!2!3!4!5!6!7!!8"

ps:这是cv b站用户雪莉青音 的github地址的  GitHub - chuyueZhang/frontEndLearning: some notes and practices about front-end learning

js总结篇上 (看完你就学会整个js)相关推荐

  1. 科研工具篇|看完之后能提高你80%的科研工作效率

    荀子在<劝学篇>中讲到,"君子性非异也,善假于物也".在生活中,善用各种工具能够极大的提高我们的效率,在科研工作中亦是如此.今天给大家介绍在科学研究和论文写作自己常用到 ...

  2. js事件大全,看完我也就醉了

    事件源对象 捕获释放 event.srcElement.setCapture();   event.srcElement.releaseCapture(); 事件按键 event.keyCode  e ...

  3. 再不懂ZooKeeper,就安安心心把这篇文章看完

    我本人曾经使用过 ZooKeeper 作为 Dubbo 的注册中心,另外在搭建 Solr 集群的时候,我使用到了 ZooKeeper 作为 Solr 集群的管理工具. 前几天,总结项目经验的时候,我突 ...

  4. 电商零售业怎么做数据分析?这10篇作品看完必会

    在2021帆软BI可视化夏季挑战赛中,我们看到了非常多的优秀BI可视化分析作品.其中,零售/电商类的作品尤为丰富,今天帆软君为大家精选出10份优秀作品,希望能够给零售/电商的朋友们带来一些启发: 1. ...

  5. [MICCAI 2019 | CVPR 2020] 图数据,点云相关文章总结综述,一篇即可看完文章模型结构和创新

    [1] Integrating 3D Geometry of Organ for Improving Medical Image Segmentation,MICCAI2019,Part5 器官形状和 ...

  6. lisp 任意点 曲线距离_数学篇|看完这篇,秒杀所有圆锥曲线小技巧

    今天为大家带来的是小袁老师为大家总结的圆锥曲线题目的解题技巧,有例题有讲解! 善用几何性质 圆锥曲线的几何性质可以说是基础中的基础,它以及它引申出的焦点三角形面积公式在题目中也是被广泛地用到. 首先我 ...

  7. 钉钉存在服务器上的文件如何删除,钉钉怎么删除群文件 看完你就学会了

    钉钉是一款实用的线上办公软件,很多小伙伴在日常的办公中都会选择这款软件,大家会在软件中创建各种部门群来方便同事们进行工作上的交流管理,不少的小伙伴在使用软件办公的时候都喜欢往群中上场各种文件让群员们自 ...

  8. 基于jmeter测试web接口,看完都说学会了

    最近接到一个需求,产品说要对一个接口做负载均衡.当时我听到这个需求的时候,我的内心是奔溃的--这接口只有一个,怎么做负载均衡,负载均衡起码得有两个才能做啊! 最后理解了产品想要做的东西:由于线上某接口 ...

  9. 如何根据原理图画封装_如何将原理图符号画得通俗易懂,看完你就学会了!

    有很多关于绘制原理图符号的讨论.使你的原理图符号能够让人理解非常重要.有时用计算机辅助设计(CAD)软件包中预先做好的符号就可以了,但大多数符号并不太理想.请确保你的软件包能方便地创建符号,因为你可能 ...

最新文章

  1. 孪生素数 java代码_科学网—孪生素数猜想——利用 Java + 正则表达式 输出孪生素数对 - 马廷灿的博文...
  2. [读书笔记]C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性
  3. 将shp文件导入到GeoDatabase中
  4. 本机电脑与 Android 设备如何进行文件传输?
  5. linux:gpg加密和解密
  6. array_reverse_PHP array_reverse()函数与示例
  7. 前端学习(2173):动态路由的跳转
  8. 【Flink】Flink 如何在本地IDEA恢复检查点 不通过IDEA 不通过 flink run 方法
  9. [软件]提高日常操作电脑的效率
  10. 判断Sbo的Matrix中是否存在相同数据行
  11. nginx 正则 结尾 配置_nginx配置proxy_pass中url末尾带/与不带/的区别详解
  12. 计算机串口程序配置,串口设置软件 串口调试工具如何使用
  13. 浅谈敏捷思想-05.精益画布电梯演讲
  14. 二阶压控电压源低通滤波器的传递函数
  15. SQLite3数据库
  16. 维吉尼亚密码(Vigenere)
  17. 为什么苹果手机拍照会模糊?一起来看手机维修师如何解决
  18. html给页面整体添加左右边距_左右边距相对于页面宽度过大
  19. java微服务Nacos配置管理
  20. 直通滤波(PassThrough 过滤器)

热门文章

  1. Java50道经典编程题:(十八)兵乓球赛程安排问题 ——对知识的灵活使用
  2. HEGERLS供应防腐防静电仓储层板货架 多层多功能自由组合仓库货架
  3. 北邮:完全二叉树性质
  4. 手机游戏获取不了服务器信息,手机获取游戏服务器
  5. Springboot毕设项目班费管理系统16me6(java+VUE+Mybatis+Maven+Mysql)
  6. CRC-CCITT CRC-16
  7. Sqoop MySQL hive 数据库导入导出数据
  8. JS中的offsetWidth、offsetHeight、clientWidth、clientHeight等等的详细介绍
  9. DPDK插件接收队列
  10. 处理加权排序类型问题的一般套路